10 #if defined(__INTEL_COMPILER) && __cplusplus >= 201703L
14 #include <aligned_new>
23 # pragma warning(disable: 4324) // warning C4324: structure was padded due to alignment specifier
37 struct NoConstructor {
38 NoConstructor() =
default;
39 NoConstructor(
const NoConstructor &) =
default;
40 NoConstructor(NoConstructor &&) =
default;
41 static NoConstructor *new_instance() {
42 auto *ptr =
new NoConstructor();
49 py::class_<NoConstructor>(
m,
"NoConstructor")
50 .def_static(
"new_instance", &NoConstructor::new_instance,
"Return an instance");
55 Pet(
const std::string &
name,
const std::string &species)
56 : m_name(
name), m_species(species) {}
57 std::string
name()
const {
return m_name; }
58 std::string species()
const {
return m_species; }
61 std::string m_species;
64 class Dog :
public Pet {
67 std::string
bark()
const {
return "Woof!"; }
70 class Rabbit :
public Pet {
72 Rabbit(
const std::string &
name) : Pet(
name,
"parrot") {}
75 class Hamster :
public Pet {
77 Hamster(
const std::string &
name) : Pet(
name,
"rodent") {}
80 class Chimera :
public Pet {
81 Chimera() : Pet(
"Kimmy",
"chimera") {}
84 py::class_<Pet> pet_class(
m,
"Pet");
86 .def(py::init<std::string, std::string>())
87 .def(
"name", &Pet::name)
88 .def(
"species", &Pet::species);
91 py::class_<Dog>(
m,
"Dog", pet_class)
92 .def(py::init<std::string>());
95 py::class_<Rabbit, Pet>(
m,
"Rabbit")
96 .def(py::init<std::string>());
99 py::class_<Hamster, Pet>(
m,
"Hamster")
100 .def(py::init<std::string>());
103 py::class_<Chimera, Pet>(
m,
"Chimera");
105 m.def(
"pet_name_species", [](
const Pet &pet) {
return pet.name() +
" is a " + pet.species(); });
106 m.def(
"dog_bark", [](
const Dog &dog) {
return dog.
bark(); });
110 BaseClass() =
default;
111 BaseClass(
const BaseClass &) =
default;
112 BaseClass(BaseClass &&) =
default;
113 virtual ~BaseClass() =
default;
115 struct DerivedClass1 : BaseClass { };
116 struct DerivedClass2 : BaseClass { };
118 py::class_<BaseClass>(
m,
"BaseClass").def(py::init<>());
119 py::class_<DerivedClass1>(
m,
"DerivedClass1").def(py::init<>());
120 py::class_<DerivedClass2>(
m,
"DerivedClass2").def(py::init<>());
122 m.def(
"return_class_1", []() -> BaseClass* {
return new DerivedClass1(); });
123 m.def(
"return_class_2", []() -> BaseClass* {
return new DerivedClass2(); });
124 m.def(
"return_class_n", [](
int n) -> BaseClass* {
125 if (n == 1)
return new DerivedClass1();
126 if (n == 2)
return new DerivedClass2();
127 return new BaseClass();
129 m.def(
"return_none", []() -> BaseClass* {
return nullptr; });
132 m.def(
"check_instances", [](py::list l) {
134 py::isinstance<py::tuple>(l[0]),
135 py::isinstance<py::dict>(l[1]),
136 py::isinstance<Pet>(l[2]),
137 py::isinstance<Pet>(l[3]),
138 py::isinstance<Dog>(l[4]),
139 py::isinstance<Rabbit>(l[5]),
140 py::isinstance<UnregisteredType>(l[6])
147 m.def(
"check_type", [](
int category) {
153 return py::type::of<DerivedClass1>();
155 return py::type::of<Invalid>();
158 m.def(
"get_type_of", [](py::object ob) {
159 return py::type::of(ob);
162 m.def(
"get_type_classic", [](py::handle h) {
166 m.def(
"as_type", [](py::object ob) {
171 struct MismatchBase1 { };
172 struct MismatchDerived1 : MismatchBase1 { };
174 struct MismatchBase2 { };
175 struct MismatchDerived2 : MismatchBase2 { };
177 m.def(
"mismatched_holder_1", []() {
178 auto mod = py::module_::import(
"__main__");
179 py::class_<MismatchBase1, std::shared_ptr<MismatchBase1>>(mod,
"MismatchBase1");
180 py::class_<MismatchDerived1, MismatchBase1>(mod,
"MismatchDerived1");
182 m.def(
"mismatched_holder_2", []() {
183 auto mod = py::module_::import(
"__main__");
184 py::class_<MismatchBase2>(mod,
"MismatchBase2");
185 py::class_<MismatchDerived2, std::shared_ptr<MismatchDerived2>,
186 MismatchBase2>(mod,
"MismatchDerived2");
192 static std::unique_ptr<MyBase> make() {
193 return std::unique_ptr<MyBase>(
new MyBase());
197 struct MyDerived : MyBase {
198 static std::unique_ptr<MyDerived> make() {
199 return std::unique_ptr<MyDerived>(
new MyDerived());
203 py::class_<MyBase>(
m,
"MyBase")
204 .def_static(
"make", &MyBase::make);
206 py::class_<MyDerived, MyBase>(
m,
"MyDerived")
207 .def_static(
"make", &MyDerived::make)
208 .def_static(
"make2", &MyDerived::make);
211 struct ConvertibleFromUserType {
214 ConvertibleFromUserType(UserType u) :
i(u.value()) { }
217 py::class_<ConvertibleFromUserType>(
m,
"AcceptsUserType")
218 .def(py::init<UserType>());
219 py::implicitly_convertible<UserType, ConvertibleFromUserType>();
221 m.def(
"implicitly_convert_argument", [](
const ConvertibleFromUserType &r) {
return r.i; });
222 m.def(
"implicitly_convert_variable", [](py::object o) {
226 const auto &r = o.cast<
const ConvertibleFromUserType &>();
229 m.add_object(
"implicitly_convert_variable_fail", [&] {
230 auto f = [](PyObject *, PyObject *
args) -> PyObject * {
231 auto o = py::reinterpret_borrow<py::tuple>(
args)[0];
233 o.cast<
const ConvertibleFromUserType &>();
234 }
catch (
const py::cast_error &e) {
235 return py::str(e.what()).release().ptr();
237 return py::str().release().ptr();
240 auto def =
new PyMethodDef{
"f", f, METH_VARARGS,
nullptr};
241 py::capsule def_capsule(
def, [](
void *ptr) {
delete reinterpret_cast<PyMethodDef *
>(ptr); });
242 return py::reinterpret_steal<py::object>(PyCFunction_NewEx(
def, def_capsule.ptr(),
m.ptr()));
248 static void *
operator new(
size_t s) {
py::print(
"A new", s); return ::operator
new(s); }
249 static void *
operator new(
size_t s,
void *ptr) {
py::print(
"A placement-new", s);
return ptr; }
250 static void operator delete(
void *p) {
py::print(
"A delete"); return ::operator
delete(p); }
252 struct HasOpNewDelSize {
254 static void *
operator new(
size_t s) {
py::print(
"B new", s); return ::operator
new(s); }
255 static void *
operator new(
size_t s,
void *ptr) {
py::print(
"B placement-new", s);
return ptr; }
256 static void operator delete(
void *p,
size_t s) {
py::print(
"B delete", s); return ::operator
delete(p); }
258 struct AliasedHasOpNewDelSize {
260 static void *
operator new(
size_t s) {
py::print(
"C new", s); return ::operator
new(s); }
261 static void *
operator new(
size_t s,
void *ptr) {
py::print(
"C placement-new", s);
return ptr; }
262 static void operator delete(
void *p,
size_t s) {
py::print(
"C delete", s); return ::operator
delete(p); }
263 virtual ~AliasedHasOpNewDelSize() =
default;
264 AliasedHasOpNewDelSize() =
default;
265 AliasedHasOpNewDelSize(
const AliasedHasOpNewDelSize&) =
delete;
267 struct PyAliasedHasOpNewDelSize : AliasedHasOpNewDelSize {
268 PyAliasedHasOpNewDelSize() =
default;
269 PyAliasedHasOpNewDelSize(
int) { }
272 struct HasOpNewDelBoth {
274 static void *
operator new(
size_t s) {
py::print(
"D new", s); return ::operator
new(s); }
275 static void *
operator new(
size_t s,
void *ptr) {
py::print(
"D placement-new", s);
return ptr; }
276 static void operator delete(
void *p) {
py::print(
"D delete"); return ::operator
delete(p); }
277 static void operator delete(
void *p,
size_t s) {
py::print(
"D wrong delete", s); return ::operator
delete(p); }
279 py::class_<HasOpNewDel>(
m,
"HasOpNewDel").def(py::init<>());
280 py::class_<HasOpNewDelSize>(
m,
"HasOpNewDelSize").def(py::init<>());
281 py::class_<HasOpNewDelBoth>(
m,
"HasOpNewDelBoth").def(py::init<>());
282 py::class_<AliasedHasOpNewDelSize, PyAliasedHasOpNewDelSize> aliased(
m,
"AliasedHasOpNewDelSize");
283 aliased.def(py::init<>());
284 aliased.attr(
"size_noalias") = py::int_(
sizeof(AliasedHasOpNewDelSize));
285 aliased.attr(
"size_alias") = py::int_(
sizeof(PyAliasedHasOpNewDelSize));
289 bind_local<LocalExternal, 17>(
m,
"LocalExternal", py::module_local());
294 int foo()
const {
return value; }
300 class PublicistA :
public ProtectedA {
302 using ProtectedA::foo;
305 py::class_<ProtectedA>(
m,
"ProtectedA")
307 #if !defined(_MSC_VER) || _MSC_VER >= 1910
308 .def(
"foo", &PublicistA::foo);
310 .def(
"foo",
static_cast<int (ProtectedA::*)() const
>(&PublicistA::foo));
315 virtual ~ProtectedB() =
default;
316 ProtectedB() =
default;
317 ProtectedB(
const ProtectedB &) =
delete;
320 virtual int foo()
const {
return value; }
326 class TrampolineB :
public ProtectedB {
331 class PublicistB :
public ProtectedB {
336 ~PublicistB()
override {};
337 using ProtectedB::foo;
340 py::class_<ProtectedB, TrampolineB>(
m,
"ProtectedB")
342 #if !defined(_MSC_VER) || _MSC_VER >= 1910
343 .def(
"foo", &PublicistB::foo);
345 .def(
"foo",
static_cast<int (ProtectedB::*)() const
>(&PublicistB::foo));
349 struct BraceInitialization {
354 py::class_<BraceInitialization>(
m,
"BraceInitialization")
355 .def(py::init<int, const std::string &>())
356 .def_readwrite(
"field1", &BraceInitialization::field1)
357 .def_readwrite(
"field2", &BraceInitialization::field2);
361 py::class_<NoBraceInitialization>(
m,
"NoBraceInitialization")
367 struct BogusImplicitConversion {
368 BogusImplicitConversion(
const BogusImplicitConversion &) =
default;
371 py::class_<BogusImplicitConversion>(
m,
"BogusImplicitConversion")
372 .def(py::init<const BogusImplicitConversion &>());
374 py::implicitly_convertible<int, BogusImplicitConversion>();
381 py::class_<NestBase>
base(
m,
"NestBase");
382 base.def(py::init<>());
383 py::class_<Nested>(
base,
"Nested")
385 .def(
"fn", [](Nested &,
int, NestBase &, Nested &) {})
386 .
def(
"fa", [](Nested &,
int, NestBase &, Nested &) {},
387 "a"_a,
"b"_a,
"c"_a);
388 base.def(
"g", [](NestBase &, Nested &) {});
389 base.def(
"h", []() {
return NestBase(); });
396 struct NotRegistered {};
397 struct StringWrapper { std::string
str; };
398 m.def(
"test_error_after_conversions", [](
int) {});
399 m.def(
"test_error_after_conversions",
400 [](StringWrapper) -> NotRegistered {
return {}; });
401 py::class_<StringWrapper>(
m,
"StringWrapper").def(py::init<std::string>());
402 py::implicitly_convertible<std::string, StringWrapper>();
404 #if defined(PYBIND11_CPP17)
405 struct alignas(1024) Aligned {
406 std::uintptr_t ptr()
const {
return (uintptr_t)
this; }
408 py::class_<Aligned>(
m,
"Aligned")
410 .def(
"ptr", &Aligned::ptr);
414 struct IsFinal final {};
415 py::class_<IsFinal>(
m,
"IsFinal", py::is_final());
418 struct IsNonFinalFinal {};
419 py::class_<IsNonFinalFinal>(
m,
"IsNonFinalFinal", py::is_final());
422 struct PyPrintDestructor {
423 PyPrintDestructor() =
default;
424 ~PyPrintDestructor() {
427 void throw_something() {
throw std::runtime_error(
"error"); }
429 py::class_<PyPrintDestructor>(
m,
"PyPrintDestructor")
431 .def(
"throw_something", &PyPrintDestructor::throw_something);
434 struct SamePointer {};
435 static SamePointer samePointer;
436 py::class_<SamePointer, std::unique_ptr<SamePointer, py::nodelete>>(
m,
"SamePointer")
440 py::class_<Empty>(
m,
"Empty")
444 struct BaseWithNested {
448 struct DerivedWithNested : BaseWithNested {
452 py::class_<BaseWithNested> baseWithNested_class(
m,
"BaseWithNested");
453 py::class_<DerivedWithNested, BaseWithNested> derivedWithNested_class(
m,
"DerivedWithNested");
454 py::class_<BaseWithNested::Nested>(baseWithNested_class,
"Nested")
455 .def_static(
"get_name", []() {
return "BaseWithNested::Nested"; });
456 py::class_<DerivedWithNested::Nested>(derivedWithNested_class,
"Nested")
457 .def_static(
"get_name", []() {
return "DerivedWithNested::Nested"; });
461 struct OtherDuplicate {};
462 struct DuplicateNested {};
463 struct OtherDuplicateNested {};
464 m.def(
"register_duplicate_class_name", [](py::module_
m) {
465 py::class_<Duplicate>(
m,
"Duplicate");
466 py::class_<OtherDuplicate>(
m,
"Duplicate");
468 m.def(
"register_duplicate_class_type", [](py::module_
m) {
469 py::class_<OtherDuplicate>(
m,
"OtherDuplicate");
470 py::class_<OtherDuplicate>(
m,
"YetAnotherDuplicate");
472 m.def(
"register_duplicate_nested_class_name", [](py::object gt) {
473 py::class_<DuplicateNested>(gt,
"DuplicateNested");
474 py::class_<OtherDuplicateNested>(gt,
"DuplicateNested");
476 m.def(
"register_duplicate_nested_class_type", [](py::object gt) {
477 py::class_<OtherDuplicateNested>(gt,
"OtherDuplicateNested");
478 py::class_<OtherDuplicateNested>(gt,
"YetAnotherDuplicateNested");
491 using DoesntBreak3 = py::class_<BreaksBase<3>, std::unique_ptr<BreaksBase<3>>>;
496 using DoesntBreak8 = py::class_<BreaksBase<8>, std::shared_ptr<BreaksBase<8>>>;
497 #define CHECK_BASE(N) static_assert(std::is_same<typename DoesntBreak##N::type, BreaksBase<N>>::value, \
498 "DoesntBreak" #N " has wrong type!")
500 #define CHECK_ALIAS(N) static_assert(DoesntBreak##N::has_alias && std::is_same<typename DoesntBreak##N::type_alias, BreaksTramp<N>>::value, \
501 "DoesntBreak" #N " has wrong type_alias!")
502 #define CHECK_NOALIAS(N) static_assert(!DoesntBreak##N::has_alias && std::is_void<typename DoesntBreak##N::type_alias>::value, \
503 "DoesntBreak" #N " has type alias, but shouldn't!")
505 #define CHECK_HOLDER(N, TYPE) static_assert(std::is_same<typename DoesntBreak##N::holder_type, std::TYPE##_ptr<BreaksBase<N>>>::value, \
506 "DoesntBreak" #N " has wrong holder_type!")
515 #define CHECK_BROKEN(N) static_assert(std::is_same<typename Breaks##N::type, BreaksBase<-N>>::value, \
516 "Breaks1 has wrong type!");