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