cppyabm  1.0.17
An agent-based library to integrate C++ and Python
pybind11_tests.cpp
Go to the documentation of this file.
1 /*
2  tests/pybind11_tests.cpp -- pybind example plugin
3 
4  Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
5 
6  All rights reserved. Use of this source code is governed by a
7  BSD-style license that can be found in the LICENSE file.
8 */
9 
10 #include "pybind11_tests.h"
11 #include "constructor_stats.h"
12 
13 #include <functional>
14 #include <list>
15 
16 /*
17 For testing purposes, we define a static global variable here in a function that each individual
18 test .cpp calls with its initialization lambda. It's convenient here because we can just not
19 compile some test files to disable/ignore some of the test code.
20 
21 It is NOT recommended as a way to use pybind11 in practice, however: the initialization order will
22 be essentially random, which is okay for our test scripts (there are no dependencies between the
23 individual pybind11 test .cpp files), but most likely not what you want when using pybind11
24 productively.
25 
26 Instead, see the "How can I reduce the build time?" question in the "Frequently asked questions"
27 section of the documentation for good practice on splitting binding code over multiple files.
28 */
29 std::list<std::function<void(py::module_ &)>> &initializers() {
30  static std::list<std::function<void(py::module_ &)>> inits;
31  return inits;
32 }
33 
35  initializers().emplace_back(init);
36 }
37 
38 test_initializer::test_initializer(const char *submodule_name, Initializer init) {
39  initializers().emplace_back([=](py::module_ &parent) {
40  auto m = parent.def_submodule(submodule_name);
41  init(m);
42  });
43 }
44 
45 void bind_ConstructorStats(py::module_ &m) {
46  py::class_<ConstructorStats>(m, "ConstructorStats")
47  .def("alive", &ConstructorStats::alive)
48  .def("values", &ConstructorStats::values)
49  .def_readwrite("default_constructions", &ConstructorStats::default_constructions)
50  .def_readwrite("copy_assignments", &ConstructorStats::copy_assignments)
51  .def_readwrite("move_assignments", &ConstructorStats::move_assignments)
52  .def_readwrite("copy_constructions", &ConstructorStats::copy_constructions)
53  .def_readwrite("move_constructions", &ConstructorStats::move_constructions)
54  .def_static("get", (ConstructorStats &(*)(py::object)) &ConstructorStats::get, py::return_value_policy::reference_internal)
55 
56  // Not exactly ConstructorStats, but related: expose the internal pybind number of registered instances
57  // to allow instance cleanup checks (invokes a GC first)
58  .def_static("detail_reg_inst", []() {
61  })
62  ;
63 }
64 
65 PYBIND11_MODULE(pybind11_tests, m) {
66  m.doc() = "pybind11 test module";
67 
69 
70 #if !defined(NDEBUG)
71  m.attr("debug_enabled") = true;
72 #else
73  m.attr("debug_enabled") = false;
74 #endif
75 
76  py::class_<UserType>(m, "UserType", "A `py::class_` type for testing")
77  .def(py::init<>())
78  .def(py::init<int>())
79  .def("get_value", &UserType::value, "Get value using a method")
80  .def("set_value", &UserType::set, "Set value using a method")
81  .def_property("value", &UserType::value, &UserType::set, "Get/set value using a property")
82  .def("__repr__", [](const UserType& u) { return "UserType({})"_s.format(u.value()); });
83 
84  py::class_<IncType, UserType>(m, "IncType")
85  .def(py::init<>())
86  .def(py::init<int>())
87  .def("__repr__", [](const IncType& u) { return "IncType({})"_s.format(u.value()); });
88 
89  for (const auto &initializer : initializers())
90  initializer(m);
91 }
ConstructorStats::default_constructions
int default_constructions
Definition: constructor_stats.h:78
ConstructorStats::move_constructions
int move_constructions
Definition: constructor_stats.h:80
ConstructorStats::get
static ConstructorStats & get()
Definition: constructor_stats.h:160
internals::registered_instances
std::unordered_multimap< const void *, instance * > registered_instances
Definition: internals.h:99
initializers
std::list< std::function< void(py::module_ &)> > & initializers()
Definition: pybind11_tests.cpp:29
get_internals
PYBIND11_NOINLINE internals & get_internals()
Return a reference to the current internals data.
Definition: internals.h:256
constructor_stats.h
ConstructorStats::move_assignments
int move_assignments
Definition: constructor_stats.h:82
ConstructorStats::values
py::list values()
Definition: constructor_stats.h:146
UserType::value
int value() const
Definition: pybind11_tests.h:36
ConstructorStats::gc
static void gc()
Definition: constructor_stats.h:110
test_initializer::test_initializer
test_initializer(Initializer init)
Definition: pybind11_tests.cpp:34
init
detail::initimpl::constructor< Args... > init()
Binds an existing constructor taking arguments Args...
Definition: pybind11.h:1587
ConstructorStats::copy_assignments
int copy_assignments
Definition: constructor_stats.h:81
ConstructorStats::alive
int alive()
Definition: constructor_stats.h:127
pybind11_tests.h
UserType::set
void set(int set)
Definition: pybind11_tests.h:37
bind_ConstructorStats
void bind_ConstructorStats(py::module_ &m)
Definition: pybind11_tests.cpp:45
test_async.m
m
Definition: test_async.py:5
ConstructorStats::copy_constructions
int copy_constructions
Definition: constructor_stats.h:79
PYBIND11_MODULE
PYBIND11_MODULE(pybind11_tests, m)
Definition: pybind11_tests.cpp:65