Merge two commits from movable-types-inputs

Performance optimisation for parameters passed by value that are C++11 movable.
  Test copy constructor and assignment operator calls for movable types

Conflicts:
	CHANGES.current
This commit is contained in:
William S Fulton 2022-07-12 09:48:17 +01:00
commit ea193a98f3
6 changed files with 53 additions and 3 deletions

View file

@ -7,6 +7,15 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
Version 4.1.0 (in progress)
===========================
2022-07-12: wsfulton
Performance optimisation for parameters passed by value that are C++11 movable.
The C++ wrappers create a temporary variable for a parameter to be passed to a
function. This is initially default constructed and then copy assigned from the
instance being passed in from the target language. This is unchanged, however,
when the temporary variable is passed to wrapped function, it is now done using
std::move. If the type is move constructible, the move constructor will be used
instead of the copy constructor.
2022-07-12: wsfulton
[Perl] Add std::auto_ptr support in std_auto_ptr.i library file.

View file

@ -27,6 +27,8 @@ struct MoveOnly {
static MoveOnly create() { return MoveOnly(111); }
// static const MoveOnly createConst() { return MoveOnly(111); } // not supported by default
// static void take(MoveOnly mo) { if (debug) cout << "take(MoveOnly)" << " " << &mo << endl; }
};
%}
@ -48,5 +50,7 @@ struct MovableCopyable {
static MovableCopyable create() { return MovableCopyable(111); }
static const MovableCopyable createConst() { return MovableCopyable(111); }
static void take(MovableCopyable mc) { if (debug) cout << "take(MovableCopyable)" << " " << &mc << endl; }
};
%}

View file

@ -4,6 +4,8 @@ using cpp11_move_onlyNamespace;
public class cpp11_move_only_runme {
public static void Main() {
// Output
Counter.reset_counts();
using (MoveOnly mo = MoveOnly.create()) {
}
@ -19,5 +21,14 @@ public class cpp11_move_only_runme {
using (MovableCopyable mo = MovableCopyable.createConst()) {
}
Counter.check_counts(2, 1, 1, 0, 0, 3);
// Input
Counter.reset_counts();
using (MovableCopyable mo = new MovableCopyable(222)) {
Counter.check_counts(1, 0, 0, 0, 0, 0);
MovableCopyable.take(mo);
Counter.check_counts(2, 0, 1, 1, 0, 2);
}
Counter.check_counts(2, 0, 1, 1, 0, 3);
}
}

View file

@ -14,6 +14,7 @@ public class cpp11_move_only_runme {
public static void main(String argv[]) {
// Output
{
Counter.reset_counts();
MoveOnly mo = MoveOnly.create();
@ -35,5 +36,16 @@ public class cpp11_move_only_runme {
mo.delete();
Counter.check_counts(2, 1, 1, 0, 0, 3);
}
// Input
{
Counter.reset_counts();
MovableCopyable mo = new MovableCopyable(222);
Counter.check_counts(1, 0, 0, 0, 0, 0);
MovableCopyable.take(mo);
Counter.check_counts(2, 0, 1, 1, 0, 2);
mo.delete();
Counter.check_counts(2, 0, 1, 1, 0, 3);
}
}
}

View file

@ -1,5 +1,6 @@
from cpp11_move_only import *
# Output
Counter.reset_counts()
mo = MoveOnly.create()
del mo
@ -15,3 +16,12 @@ Counter.reset_counts()
mo = MovableCopyable.createConst()
del mo
Counter.check_counts(2, 1, 1, 0, 0, 3)
# Input
Counter.reset_counts()
mo = MovableCopyable(222)
Counter.check_counts(1, 0, 0, 0, 0, 0)
MovableCopyable.take(mo)
Counter.check_counts(2, 0, 1, 1, 0, 2)
del mo
Counter.check_counts(2, 0, 1, 1, 0, 3)

View file

@ -427,10 +427,14 @@ String *Swig_cfunction_call(const_String_or_char_ptr name, ParmList *parms) {
String *rcaststr = SwigType_rcaststr(rpt, pname);
if (comma) {
Printv(func, ",", rcaststr, NIL);
} else {
Append(func, rcaststr);
Append(func, ",");
}
if (cparse_cplusplus && SwigType_type(rpt) == T_USER)
Printv(func, "SWIG_STD_MOVE(", rcaststr, ")", NIL);
else
Printv(func, rcaststr, NIL);
Delete(rpt);
Delete(pname);
Delete(rcaststr);