| %module python_pickle | |
| %include <std_string.i> | |
| %extend PickleMe { | |
| #if 0 | |
| // Note: %pythoncode can't be used with -builtin | |
| %pythoncode %{ | |
| def __reduce__(self): | |
| print "In Python __reduce__" | |
| return (type(self), (self.msg, )) | |
| %} | |
| #else | |
| // Equivalent to Python code above | |
| PyObject *__reduce__() { | |
| if (trace) | |
| std::cout << "In C++ __reduce__" << std::endl; | |
| PyObject *args = PyTuple_New(1); | |
| PyTuple_SetItem(args, 0, SWIG_From_std_string(self->msg)); | |
| swig_type_info *ty = SWIGTYPE_p_PickleMe; | |
| SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; | |
| #if defined(SWIGPYTHON_BUILTIN) | |
| PyObject *callable = (PyObject *)data->pytype; | |
| #else | |
| PyObject *callable = data->klass; | |
| #endif | |
| Py_IncRef(callable); | |
| PyObject *ret = PyTuple_New(2); | |
| PyTuple_SetItem(ret, 0, callable); | |
| PyTuple_SetItem(ret, 1, args); | |
| return ret; | |
| } | |
| #endif | |
| } | |
| %inline %{ | |
| #include <iostream> | |
| bool trace = false; | |
| struct PickleMe { | |
| std::string msg; | |
| PickleMe(const std::string& msg) : msg(msg) { | |
| if (trace) | |
| std::cout << "In C++ constructor " << " [" << msg << "]" << std::endl; | |
| } | |
| }; | |
| struct NotForPickling { | |
| std::string msg; | |
| NotForPickling(const std::string& msg) : msg(msg) {} | |
| }; | |
| %} |