Performance optimisation for directors for classes passed by value

The directorin typemaps in the director methods now use std::move on the
input parameter when copying the object from the stack to the heap prior
to the callback into the target language, thereby taking advantage of
move semantics if available.
This commit is contained in:
William S Fulton 2022-07-03 13:58:26 +01:00
commit 71cd6a38fe
24 changed files with 80 additions and 20 deletions

View file

@ -1,14 +1,38 @@
%module(directors="1") director_pass_by_value
#if defined(SWIGD)
%rename(trace) debug;
#endif
%director DirectorPassByValueAbstractBase;
%include "cpp11_move_only_helper.i"
%ignore PassedByValue::operator=;
%ignore PassedByValue::PassedByValue(PassedByValue &&);
%inline %{
class PassedByValue {
int val;
public:
PassedByValue() { val = 0x12345678; }
#include <iostream>
using namespace std;
int debug = false;
struct PassedByValue {
PassedByValue(int v = 0x12345678) { val = v; if (debug) cout << "PassedByValue(0x" << hex << val << ")" << " " << this << endl; Counter::normal_constructor++; }
PassedByValue(const PassedByValue &other) { val = other.val; if (debug) cout << "PassedByValue(const PassedByValue &)" << " " << this << " " << &other << endl; Counter::copy_constructor++;}
PassedByValue & operator=(const PassedByValue &other) { val = other.val; if (debug) cout << "operator=(const PassedByValue &)" << " " << this << " " << &other << endl; Counter::copy_assignment++; return *this; }
#if __cplusplus >= 201103L
PassedByValue(PassedByValue &&other) noexcept { val = other.val; if (debug) cout << "PassedByValue(PassedByValue &&)" << " " << this << endl; Counter::move_constructor++; }
PassedByValue & operator=(PassedByValue &&other) noexcept { val = other.val; if (debug) cout << "operator=(PassedByValue &&)" << " " << this << endl; Counter::move_assignment++; return *this; }
~PassedByValue() { if (debug) cout << "~PassedByValue()" << " " << this << endl; Counter::destructor++; }
#endif
int getVal() { return val; }
private:
int val;
};
int doSomething(int x) {
int yy[256];
yy[0] =0x9876;
@ -18,6 +42,7 @@ int doSomething(int x) {
class DirectorPassByValueAbstractBase {
public:
virtual void virtualMethod(PassedByValue pbv) = 0;
virtual void virtualConstMethod(const PassedByValue pbv) {}
virtual ~DirectorPassByValueAbstractBase () {}
};
@ -27,4 +52,12 @@ public:
f.virtualMethod(PassedByValue());
}
};
bool has_cplusplus11() {
#if __cplusplus >= 201103L
return true;
#else
return false;
#endif
}
%}