pybind11_tests.cpp revision 12037
111986Sandreas.sandberg@arm.com/* 211986Sandreas.sandberg@arm.com tests/pybind11_tests.cpp -- pybind example plugin 311986Sandreas.sandberg@arm.com 411986Sandreas.sandberg@arm.com Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch> 511986Sandreas.sandberg@arm.com 611986Sandreas.sandberg@arm.com All rights reserved. Use of this source code is governed by a 711986Sandreas.sandberg@arm.com BSD-style license that can be found in the LICENSE file. 811986Sandreas.sandberg@arm.com*/ 911986Sandreas.sandberg@arm.com 1011986Sandreas.sandberg@arm.com#include "pybind11_tests.h" 1111986Sandreas.sandberg@arm.com#include "constructor_stats.h" 1211986Sandreas.sandberg@arm.com 1312037Sandreas.sandberg@arm.com/* 1412037Sandreas.sandberg@arm.comFor testing purposes, we define a static global variable here in a function that each individual 1512037Sandreas.sandberg@arm.comtest .cpp calls with its initialization lambda. It's convenient here because we can just not 1612037Sandreas.sandberg@arm.comcompile some test files to disable/ignore some of the test code. 1712037Sandreas.sandberg@arm.com 1812037Sandreas.sandberg@arm.comIt is NOT recommended as a way to use pybind11 in practice, however: the initialization order will 1912037Sandreas.sandberg@arm.combe essentially random, which is okay for our test scripts (there are no dependencies between the 2012037Sandreas.sandberg@arm.comindividual pybind11 test .cpp files), but most likely not what you want when using pybind11 2112037Sandreas.sandberg@arm.comproductively. 2212037Sandreas.sandberg@arm.com 2312037Sandreas.sandberg@arm.comInstead, see the "How can I reduce the build time?" question in the "Frequently asked questions" 2412037Sandreas.sandberg@arm.comsection of the documentation for good practice on splitting binding code over multiple files. 2512037Sandreas.sandberg@arm.com*/ 2611986Sandreas.sandberg@arm.comstd::list<std::function<void(py::module &)>> &initializers() { 2711986Sandreas.sandberg@arm.com static std::list<std::function<void(py::module &)>> inits; 2811986Sandreas.sandberg@arm.com return inits; 2911986Sandreas.sandberg@arm.com} 3011986Sandreas.sandberg@arm.com 3111986Sandreas.sandberg@arm.comtest_initializer::test_initializer(std::function<void(py::module &)> initializer) { 3211986Sandreas.sandberg@arm.com initializers().push_back(std::move(initializer)); 3311986Sandreas.sandberg@arm.com} 3411986Sandreas.sandberg@arm.com 3511986Sandreas.sandberg@arm.comvoid bind_ConstructorStats(py::module &m) { 3611986Sandreas.sandberg@arm.com py::class_<ConstructorStats>(m, "ConstructorStats") 3711986Sandreas.sandberg@arm.com .def("alive", &ConstructorStats::alive) 3811986Sandreas.sandberg@arm.com .def("values", &ConstructorStats::values) 3911986Sandreas.sandberg@arm.com .def_readwrite("default_constructions", &ConstructorStats::default_constructions) 4011986Sandreas.sandberg@arm.com .def_readwrite("copy_assignments", &ConstructorStats::copy_assignments) 4111986Sandreas.sandberg@arm.com .def_readwrite("move_assignments", &ConstructorStats::move_assignments) 4211986Sandreas.sandberg@arm.com .def_readwrite("copy_constructions", &ConstructorStats::copy_constructions) 4311986Sandreas.sandberg@arm.com .def_readwrite("move_constructions", &ConstructorStats::move_constructions) 4411986Sandreas.sandberg@arm.com .def_static("get", (ConstructorStats &(*)(py::object)) &ConstructorStats::get, py::return_value_policy::reference_internal); 4511986Sandreas.sandberg@arm.com} 4611986Sandreas.sandberg@arm.com 4711986Sandreas.sandberg@arm.comPYBIND11_PLUGIN(pybind11_tests) { 4812037Sandreas.sandberg@arm.com py::module m("pybind11_tests", "pybind testing plugin"); 4911986Sandreas.sandberg@arm.com 5011986Sandreas.sandberg@arm.com bind_ConstructorStats(m); 5111986Sandreas.sandberg@arm.com 5211986Sandreas.sandberg@arm.com for (const auto &initializer : initializers()) 5311986Sandreas.sandberg@arm.com initializer(m); 5411986Sandreas.sandberg@arm.com 5511986Sandreas.sandberg@arm.com if (!py::hasattr(m, "have_eigen")) m.attr("have_eigen") = false; 5611986Sandreas.sandberg@arm.com 5711986Sandreas.sandberg@arm.com return m.ptr(); 5811986Sandreas.sandberg@arm.com} 59