From b18c8c9f09eaeea67426c4e951ef31d00d2ff878 Mon Sep 17 00:00:00 2001 From: Laramie Leavitt Date: Mon, 21 Mar 2022 17:50:07 -0700 Subject: [PATCH 1/7] Add type_caster for std::variant Add type_caster, allowing std::variant --- include/pybind11/stl.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/pybind11/stl.h b/include/pybind11/stl.h index e3a0614444..3d1ca7ac23 100644 --- a/include/pybind11/stl.h +++ b/include/pybind11/stl.h @@ -406,6 +406,9 @@ struct variant_caster> { #if defined(PYBIND11_HAS_VARIANT) template struct type_caster> : variant_caster> {}; + +template <> +struct type_caster : public void_caster {}; #endif PYBIND11_NAMESPACE_END(detail) From 5ff08092c3c05d818abc3a7dbaacf7ee79f668b8 Mon Sep 17 00:00:00 2001 From: Laramie Leavitt Date: Mon, 21 Mar 2022 18:01:34 -0700 Subject: [PATCH 2/7] Add variant test methods --- tests/test_stl.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/tests/test_stl.cpp b/tests/test_stl.cpp index fd1824beb4..cd5719bb0b 100644 --- a/tests/test_stl.cpp +++ b/tests/test_stl.cpp @@ -37,9 +37,10 @@ struct type_caster : void_caster {}; // Test with `std::variant` in C++17 mode, or with `boost::variant` in C++11/14 #if defined(PYBIND11_HAS_VARIANT) using std::variant; +# define PYBIND11_TEST_VARIANT 1 #elif defined(PYBIND11_TEST_BOOST) # include -# define PYBIND11_HAS_VARIANT 1 +# define PYBIND11_TEST_VARIANT 1 using boost::variant; namespace pybind11 { @@ -424,7 +425,7 @@ TEST_SUBMODULE(stl, m) { m.def("parent_path", [](const std::filesystem::path &p) { return p.parent_path(); }); #endif -#ifdef PYBIND11_HAS_VARIANT +#ifdef PYBIND11_TEST_VARIANT static_assert(std::is_same::value, "visitor::result_type is required by boost::variant in C++11 mode"); @@ -435,6 +436,9 @@ TEST_SUBMODULE(stl, m) { result_type operator()(const std::string &) { return "std::string"; } result_type operator()(double) { return "double"; } result_type operator()(std::nullptr_t) { return "std::nullptr_t"; } +#if defined(PYBIND11_HAS_VARIANT) + result_type operator()(std::monostate) { return "std::monostate"; } +#endif }; // test_variant @@ -448,6 +452,17 @@ TEST_SUBMODULE(stl, m) { using V = variant; return py::make_tuple(V(5), V("Hello")); }); + +#if defined(PYBIND11_HAS_VARIANT) + // std::monostate tests. + m.def("load_monostate_variant", [](const variant &v) -> const char *{ + return py::detail::visit_helper::call(visitor(), v); + }); + m.def("cast_monostate_variant", []() { + using V = variant; + return py::make_tuple(V{}, V(5), V("Hello")); + }); +#endif #endif // #528: templated constructor From 9a9feb1c7112e9e9eb233565d931f63e5729dba9 Mon Sep 17 00:00:00 2001 From: Laramie Leavitt Date: Mon, 21 Mar 2022 18:04:00 -0700 Subject: [PATCH 3/7] Add std::monostate tests --- tests/test_stl.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/test_stl.py b/tests/test_stl.py index a3d6866899..712757201b 100644 --- a/tests/test_stl.py +++ b/tests/test_stl.py @@ -262,6 +262,20 @@ def test_variant(doc): doc(m.load_variant) == "load_variant(arg0: Union[int, str, float, None]) -> str" ) +@pytest.mark.skipif(not hasattr(m, "load_monostate_variant"), reason="no std::monostate") +def test_variant(doc): + assert m.load_monostate_variant(None) == "std::monostate" + assert m.load_monostate_variant(1) == "int" + assert m.load_monostate_variant("1") == "std::string" + assert m.load_monostate_variant(1.0) == "double" + assert m.load_monostate_variant(None) == "std::nullptr_t" + + assert m.cast_monostate_variant() == (None, 5, "Hello") + + assert ( + doc(m.load_variant) == "load_monostate_variant(arg0: Union[int, str, float, None]) -> str" + ) + def test_vec_of_reference_wrapper(): """#171: Can't return reference wrappers (or STL structures containing them)""" From bd033b03f77a8630f995eccdfe9243ab2ba62d95 Mon Sep 17 00:00:00 2001 From: Laramie Leavitt Date: Mon, 21 Mar 2022 18:09:51 -0700 Subject: [PATCH 4/7] Update test_stl.py Remove erroneous extra tests --- tests/test_stl.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_stl.py b/tests/test_stl.py index 712757201b..3e1b7f627a 100644 --- a/tests/test_stl.py +++ b/tests/test_stl.py @@ -267,13 +267,11 @@ def test_variant(doc): assert m.load_monostate_variant(None) == "std::monostate" assert m.load_monostate_variant(1) == "int" assert m.load_monostate_variant("1") == "std::string" - assert m.load_monostate_variant(1.0) == "double" - assert m.load_monostate_variant(None) == "std::nullptr_t" assert m.cast_monostate_variant() == (None, 5, "Hello") assert ( - doc(m.load_variant) == "load_monostate_variant(arg0: Union[int, str, float, None]) -> str" + doc(m.load_variant) == "load_monostate_variant(arg0: Union[None, int, str]) -> str" ) From 31b068ae79d6c64bd7e4dbe16ae7a2cdbe506c56 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 22 Mar 2022 01:13:11 +0000 Subject: [PATCH 5/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_stl.cpp | 15 ++++++++------- tests/test_stl.py | 8 ++++++-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/tests/test_stl.cpp b/tests/test_stl.cpp index cd5719bb0b..b56a91953b 100644 --- a/tests/test_stl.cpp +++ b/tests/test_stl.cpp @@ -436,9 +436,9 @@ TEST_SUBMODULE(stl, m) { result_type operator()(const std::string &) { return "std::string"; } result_type operator()(double) { return "double"; } result_type operator()(std::nullptr_t) { return "std::nullptr_t"; } -#if defined(PYBIND11_HAS_VARIANT) +# if defined(PYBIND11_HAS_VARIANT) result_type operator()(std::monostate) { return "std::monostate"; } -#endif +# endif }; // test_variant @@ -453,16 +453,17 @@ TEST_SUBMODULE(stl, m) { return py::make_tuple(V(5), V("Hello")); }); -#if defined(PYBIND11_HAS_VARIANT) +# if defined(PYBIND11_HAS_VARIANT) // std::monostate tests. - m.def("load_monostate_variant", [](const variant &v) -> const char *{ - return py::detail::visit_helper::call(visitor(), v); - }); + m.def("load_monostate_variant", + [](const variant &v) -> const char * { + return py::detail::visit_helper::call(visitor(), v); + }); m.def("cast_monostate_variant", []() { using V = variant; return py::make_tuple(V{}, V(5), V("Hello")); }); -#endif +# endif #endif // #528: templated constructor diff --git a/tests/test_stl.py b/tests/test_stl.py index 3e1b7f627a..ce402d4765 100644 --- a/tests/test_stl.py +++ b/tests/test_stl.py @@ -262,7 +262,10 @@ def test_variant(doc): doc(m.load_variant) == "load_variant(arg0: Union[int, str, float, None]) -> str" ) -@pytest.mark.skipif(not hasattr(m, "load_monostate_variant"), reason="no std::monostate") + +@pytest.mark.skipif( + not hasattr(m, "load_monostate_variant"), reason="no std::monostate" +) def test_variant(doc): assert m.load_monostate_variant(None) == "std::monostate" assert m.load_monostate_variant(1) == "int" @@ -271,7 +274,8 @@ def test_variant(doc): assert m.cast_monostate_variant() == (None, 5, "Hello") assert ( - doc(m.load_variant) == "load_monostate_variant(arg0: Union[None, int, str]) -> str" + doc(m.load_variant) + == "load_monostate_variant(arg0: Union[None, int, str]) -> str" ) From 5eef6cc8b40ac544aa437cee342a410bfdbb5e1b Mon Sep 17 00:00:00 2001 From: Laramie Leavitt Date: Mon, 21 Mar 2022 18:18:56 -0700 Subject: [PATCH 6/7] Update test fn name --- tests/test_stl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_stl.py b/tests/test_stl.py index ce402d4765..191f77a7e4 100644 --- a/tests/test_stl.py +++ b/tests/test_stl.py @@ -266,7 +266,7 @@ def test_variant(doc): @pytest.mark.skipif( not hasattr(m, "load_monostate_variant"), reason="no std::monostate" ) -def test_variant(doc): +def test_variant_monostate(doc): assert m.load_monostate_variant(None) == "std::monostate" assert m.load_monostate_variant(1) == "int" assert m.load_monostate_variant("1") == "std::string" From c2c7898989431da977fcc3a7d4e8375cea0c6060 Mon Sep 17 00:00:00 2001 From: Laramie Leavitt Date: Mon, 21 Mar 2022 18:26:06 -0700 Subject: [PATCH 7/7] And update the doc() test --- tests/test_stl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_stl.py b/tests/test_stl.py index 191f77a7e4..3dc55230ab 100644 --- a/tests/test_stl.py +++ b/tests/test_stl.py @@ -274,7 +274,7 @@ def test_variant_monostate(doc): assert m.cast_monostate_variant() == (None, 5, "Hello") assert ( - doc(m.load_variant) + doc(m.load_monostate_variant) == "load_monostate_variant(arg0: Union[None, int, str]) -> str" )