From c4f66027b6cff06c6fc2bd98caf61926d5e5edfd Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Wed, 2 Feb 2022 07:07:04 -0800 Subject: [PATCH] [Experiment] `boost::typeindex::type_index` & unnamed namespace Related to PR #4313 --- include/pybind11/detail/internals.h | 10 ++++++++++ tests/CMakeLists.txt | 2 ++ tests/test_unnamed_namespace_a.cpp | 30 +++++++++++++++++++++++++++++ tests/test_unnamed_namespace_a.py | 17 ++++++++++++++++ tests/test_unnamed_namespace_b.cpp | 16 +++++++++++++++ tests/test_unnamed_namespace_b.py | 5 +++++ 6 files changed, 80 insertions(+) create mode 100644 tests/test_unnamed_namespace_a.cpp create mode 100644 tests/test_unnamed_namespace_a.py create mode 100644 tests/test_unnamed_namespace_b.cpp create mode 100644 tests/test_unnamed_namespace_b.py diff --git a/include/pybind11/detail/internals.h b/include/pybind11/detail/internals.h index 6fd61098c4..2c110c85b7 100644 --- a/include/pybind11/detail/internals.h +++ b/include/pybind11/detail/internals.h @@ -17,6 +17,11 @@ #include "../pytypes.h" +#if defined(PYBIND11_TEST_BOOST) +# include +# include +#endif + #include /// Tracks the `internals` and `type_info` ABI version independent of the main library version. @@ -209,6 +214,11 @@ struct internals { PYBIND11_TLS_FREE(tstate); } #endif + +#if defined(PYBIND11_TEST_BOOST) + boost::unordered_map> + boost_type_index_registry; +#endif }; /// Additional type information which does not fit into the PyTypeObject. diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 491f215cef..285f43b5b9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -156,6 +156,8 @@ set(PYBIND11_TEST_FILES test_tagbased_polymorphic test_thread test_union + test_unnamed_namespace_a + test_unnamed_namespace_b test_virtual_functions) # Invoking cmake with something like: diff --git a/tests/test_unnamed_namespace_a.cpp b/tests/test_unnamed_namespace_a.cpp new file mode 100644 index 0000000000..8df9ffd24d --- /dev/null +++ b/tests/test_unnamed_namespace_a.cpp @@ -0,0 +1,30 @@ +#include + +#include "pybind11_tests.h" + +namespace { +struct any_struct {}; +} // namespace + +TEST_SUBMODULE(unnamed_namespace_a, m) { + m.attr("name") = "A"; + +#if defined(PYBIND11_TEST_BOOST) + py::detail::get_internals() + .boost_type_index_registry[boost::typeindex::type_index( + boost::typeindex::type_id())] + .push_back("A"); +#endif + + m.def("boost_type_index_registry_dump", []() { +#if defined(PYBIND11_TEST_BOOST) + py::list items; + for (const auto &it : py::detail::get_internals().boost_type_index_registry) { + items.append(py::make_tuple(it.first.pretty_name(), it.second)); + } + return items; +#else + return py::none(); +#endif + }); +} diff --git a/tests/test_unnamed_namespace_a.py b/tests/test_unnamed_namespace_a.py new file mode 100644 index 0000000000..59eb3ca56d --- /dev/null +++ b/tests/test_unnamed_namespace_a.py @@ -0,0 +1,17 @@ +import pytest + +from pybind11_tests import unnamed_namespace_a as m + + +def test_inspect(): + assert m.name == "A" + reg = m.boost_type_index_registry_dump() + if reg is None: + pytest.skip("boost::typeindex::type_index-NotAvailable") + if len(reg) == 1: + assert tuple(sorted(reg[0][1])) == ("A", "B") + pytest.skip("boost::typeindex::type_index-EQ-BAD") + if len(reg) == 2: + assert tuple(sorted([reg[0][1][0], reg[1][1][0]])) == ("A", "B") + pytest.skip("boost::typeindex::type_index-NE-GOOD") + assert reg is None # Sure to fail. diff --git a/tests/test_unnamed_namespace_b.cpp b/tests/test_unnamed_namespace_b.cpp new file mode 100644 index 0000000000..c137fbce3d --- /dev/null +++ b/tests/test_unnamed_namespace_b.cpp @@ -0,0 +1,16 @@ +#include "pybind11_tests.h" + +namespace { +struct any_struct {}; +} // namespace + +TEST_SUBMODULE(unnamed_namespace_b, m) { + m.attr("name") = "B"; + +#if defined(PYBIND11_TEST_BOOST) + py::detail::get_internals() + .boost_type_index_registry[boost::typeindex::type_index( + boost::typeindex::type_id())] + .push_back("B"); +#endif +} diff --git a/tests/test_unnamed_namespace_b.py b/tests/test_unnamed_namespace_b.py new file mode 100644 index 0000000000..4409bb45aa --- /dev/null +++ b/tests/test_unnamed_namespace_b.py @@ -0,0 +1,5 @@ +from pybind11_tests import unnamed_namespace_b as m + + +def test_inspect(): + assert m.name == "B"