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:
commit
ea193a98f3
6 changed files with 53 additions and 3 deletions
|
|
@ -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)
|
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
|
2022-07-12: wsfulton
|
||||||
[Perl] Add std::auto_ptr support in std_auto_ptr.i library file.
|
[Perl] Add std::auto_ptr support in std_auto_ptr.i library file.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,8 @@ struct MoveOnly {
|
||||||
|
|
||||||
static MoveOnly create() { return MoveOnly(111); }
|
static MoveOnly create() { return MoveOnly(111); }
|
||||||
// static const MoveOnly createConst() { return MoveOnly(111); } // not supported by default
|
// 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 MovableCopyable create() { return MovableCopyable(111); }
|
||||||
static const MovableCopyable createConst() { return MovableCopyable(111); }
|
static const MovableCopyable createConst() { return MovableCopyable(111); }
|
||||||
|
|
||||||
|
static void take(MovableCopyable mc) { if (debug) cout << "take(MovableCopyable)" << " " << &mc << endl; }
|
||||||
};
|
};
|
||||||
%}
|
%}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ using cpp11_move_onlyNamespace;
|
||||||
public class cpp11_move_only_runme {
|
public class cpp11_move_only_runme {
|
||||||
|
|
||||||
public static void Main() {
|
public static void Main() {
|
||||||
|
|
||||||
|
// Output
|
||||||
Counter.reset_counts();
|
Counter.reset_counts();
|
||||||
using (MoveOnly mo = MoveOnly.create()) {
|
using (MoveOnly mo = MoveOnly.create()) {
|
||||||
}
|
}
|
||||||
|
|
@ -19,5 +21,14 @@ public class cpp11_move_only_runme {
|
||||||
using (MovableCopyable mo = MovableCopyable.createConst()) {
|
using (MovableCopyable mo = MovableCopyable.createConst()) {
|
||||||
}
|
}
|
||||||
Counter.check_counts(2, 1, 1, 0, 0, 3);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ public class cpp11_move_only_runme {
|
||||||
|
|
||||||
public static void main(String argv[]) {
|
public static void main(String argv[]) {
|
||||||
|
|
||||||
|
// Output
|
||||||
{
|
{
|
||||||
Counter.reset_counts();
|
Counter.reset_counts();
|
||||||
MoveOnly mo = MoveOnly.create();
|
MoveOnly mo = MoveOnly.create();
|
||||||
|
|
@ -35,5 +36,16 @@ public class cpp11_move_only_runme {
|
||||||
mo.delete();
|
mo.delete();
|
||||||
Counter.check_counts(2, 1, 1, 0, 0, 3);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
from cpp11_move_only import *
|
from cpp11_move_only import *
|
||||||
|
|
||||||
|
# Output
|
||||||
Counter.reset_counts()
|
Counter.reset_counts()
|
||||||
mo = MoveOnly.create()
|
mo = MoveOnly.create()
|
||||||
del mo
|
del mo
|
||||||
|
|
@ -15,3 +16,12 @@ Counter.reset_counts()
|
||||||
mo = MovableCopyable.createConst()
|
mo = MovableCopyable.createConst()
|
||||||
del mo
|
del mo
|
||||||
Counter.check_counts(2, 1, 1, 0, 0, 3)
|
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)
|
||||||
|
|
|
||||||
|
|
@ -427,10 +427,14 @@ String *Swig_cfunction_call(const_String_or_char_ptr name, ParmList *parms) {
|
||||||
String *rcaststr = SwigType_rcaststr(rpt, pname);
|
String *rcaststr = SwigType_rcaststr(rpt, pname);
|
||||||
|
|
||||||
if (comma) {
|
if (comma) {
|
||||||
Printv(func, ",", rcaststr, NIL);
|
Append(func, ",");
|
||||||
} else {
|
|
||||||
Append(func, rcaststr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cparse_cplusplus && SwigType_type(rpt) == T_USER)
|
||||||
|
Printv(func, "SWIG_STD_MOVE(", rcaststr, ")", NIL);
|
||||||
|
else
|
||||||
|
Printv(func, rcaststr, NIL);
|
||||||
|
|
||||||
Delete(rpt);
|
Delete(rpt);
|
||||||
Delete(pname);
|
Delete(pname);
|
||||||
Delete(rcaststr);
|
Delete(rcaststr);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue