36 py::class_<SimpleBase, SimpleBaseTrampoline>(m,
"SimpleBase")
40 [](
const py::object &
self) {
42 if (py::hasattr(
self,
"__dict__")) {
43 d =
self.attr(
"__dict__");
45 return py::make_tuple(
self.attr(
"num"), d);
47 [](
const py::tuple &t) {
49 throw std::runtime_error(
"Invalid state!");
52 cpp_state->num = t[0].cast<
int>();
53 auto py_state = t[1].cast<py::dict>();
54 return std::make_pair(std::move(cpp_state), py_state);
57 m.def(
"make_SimpleCppDerivedAsBase",
59 m.def(
"check_dynamic_cast_SimpleCppDerived", [](
const SimpleBase *base_ptr) {
72 explicit Pickleable(
const std::string &value) : m_value(value) { }
73 const std::string &value()
const {
return m_value; }
75 void setExtra1(
int extra1) { m_extra1 = extra1; }
76 void setExtra2(
int extra2) { m_extra2 = extra2; }
77 int extra1()
const {
return m_extra1; }
78 int extra2()
const {
return m_extra2; }
85 class PickleableNew :
public Pickleable {
87 using Pickleable::Pickleable;
90 py::class_<Pickleable> pyPickleable(m,
"Pickleable");
92 .def(py::init<std::string>())
93 .def(
"value", &Pickleable::value)
94 .def(
"extra1", &Pickleable::extra1)
95 .def(
"extra2", &Pickleable::extra2)
96 .def(
"setExtra1", &Pickleable::setExtra1)
97 .def(
"setExtra2", &Pickleable::setExtra2)
100 .def(
"__getstate__", [](
const Pickleable &p) {
102 return py::make_tuple(p.value(), p.extra1(), p.extra2());
105 pyPickleable.def(
"__setstate__", [](Pickleable &p,
const py::tuple &t) {
107 throw std::runtime_error(
"Invalid state!");
110 new (&p) Pickleable(t[0].cast<std::string>());
113 p.setExtra1(t[1].cast<int>());
114 p.setExtra2(t[2].cast<int>());
118 py::class_<PickleableNew, Pickleable>(m,
"PickleableNew")
119 .def(py::init<std::string>())
121 [](
const PickleableNew &p) {
122 return py::make_tuple(p.value(), p.extra1(), p.extra2());
124 [](
const py::tuple &t) {
126 throw std::runtime_error(
"Invalid state!");
128 auto p = PickleableNew(t[0].cast<std::string>());
130 p.setExtra1(t[1].cast<int>());
131 p.setExtra2(t[2].cast<int>());
135#if !defined(PYPY_VERSION)
137 class PickleableWithDict {
139 explicit PickleableWithDict(
const std::string &value) : value(value) { }
145 class PickleableWithDictNew :
public PickleableWithDict {
147 using PickleableWithDict::PickleableWithDict;
150 py::class_<PickleableWithDict> pyPickleableWithDict(m,
"PickleableWithDict", py::dynamic_attr());
151 pyPickleableWithDict.def(py::init<std::string>())
152 .def_readwrite(
"value", &PickleableWithDict::value)
153 .def_readwrite(
"extra", &PickleableWithDict::extra)
154 .def(
"__getstate__", [](
const py::object &
self) {
156 return py::make_tuple(
self.attr(
"value"),
self.attr(
"extra"),
self.attr(
"__dict__"));
159 pyPickleableWithDict.def(
"__setstate__", [](
const py::object &
self,
const py::tuple &t) {
161 throw std::runtime_error(
"Invalid state!");
164 auto &p =
self.cast<PickleableWithDict &>();
165 new (&p) PickleableWithDict(t[0].cast<std::string>());
168 p.extra = t[1].cast<
int>();
171 self.attr(
"__dict__") = t[2];
175 py::class_<PickleableWithDictNew, PickleableWithDict>(m,
"PickleableWithDictNew")
176 .def(py::init<std::string>())
178 [](
const py::object &
self) {
179 return py::make_tuple(
self.attr(
"value"),
self.attr(
"extra"),
self.attr(
"__dict__"));
181 [](
const py::tuple &t) {
183 throw std::runtime_error(
"Invalid state!");
186 auto cpp_state = PickleableWithDictNew(t[0].cast<std::string>());
187 cpp_state.extra = t[1].cast<
int>();
189 auto py_state = t[2].cast<py::dict>();
190 return std::make_pair(cpp_state, py_state);
#define TEST_SUBMODULE(name, variable)
void ignoreOldStyleInitWarnings(F &&body)
SimpleBase(const SimpleBase &)=default
virtual ~SimpleBase()=default