diff --git a/docs/advanced/cast/stl.rst b/docs/advanced/cast/stl.rst index 468bd2c66..e48409f02 100644 --- a/docs/advanced/cast/stl.rst +++ b/docs/advanced/cast/stl.rst @@ -5,7 +5,7 @@ Automatic conversion ==================== When including the additional header file :file:`pybind11/stl.h`, conversions -between ``std::vector<>``/``std::list<>``/``std::array<>``, +between ``std::vector<>``/``std::deque<>``/``std::list<>``/``std::array<>``, ``std::set<>``/``std::unordered_set<>``, and ``std::map<>``/``std::unordered_map<>`` and the Python ``list``, ``set`` and ``dict`` data structures are automatically enabled. The types ``std::pair<>`` diff --git a/include/pybind11/stl.h b/include/pybind11/stl.h index 2d29a9680..32f8d294a 100644 --- a/include/pybind11/stl.h +++ b/include/pybind11/stl.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #if defined(_MSC_VER) @@ -185,6 +186,9 @@ public: template struct type_caster> : list_caster, Type> { }; +template struct type_caster> + : list_caster, Type> { }; + template struct type_caster> : list_caster, Type> { }; diff --git a/tests/test_stl.cpp b/tests/test_stl.cpp index 37368852a..207c9fb2b 100644 --- a/tests/test_stl.cpp +++ b/tests/test_stl.cpp @@ -63,6 +63,10 @@ TEST_SUBMODULE(stl, m) { static std::vector lvv{2}; m.def("cast_ptr_vector", []() { return &lvv; }); + // test_deque + m.def("cast_deque", []() { return std::deque{1}; }); + m.def("load_deque", [](const std::deque &v) { return v.at(0) == 1 && v.at(1) == 2; }); + // test_array m.def("cast_array", []() { return std::array {{1 , 2}}; }); m.def("load_array", [](const std::array &a) { return a[0] == 1 && a[1] == 2; }); diff --git a/tests/test_stl.py b/tests/test_stl.py index ba71ca310..bf185d57b 100644 --- a/tests/test_stl.py +++ b/tests/test_stl.py @@ -23,6 +23,15 @@ def test_vector(doc): assert m.cast_ptr_vector() == ["lvalue", "lvalue"] +def test_deque(doc): + """std::deque <-> list""" + lst = m.cast_deque() + assert lst == [1] + lst.append(2) + assert m.load_deque(lst) + assert m.load_deque(tuple(lst)) + + def test_array(doc): """std::array <-> list""" lst = m.cast_array()