TEST_SUBMODULE(stl_binders, m) { // test_vector_int py::bind_vector<std::vector<unsigned int>>(m, "VectorInt", py::buffer_protocol()); // test_vector_bool py::bind_vector<std::vector<bool>>(m, "VectorBool"); // test_vector_custom py::class_<El>(m, "El") .def(py::init<int>()); py::bind_vector<std::vector<El>>(m, "VectorEl"); py::bind_vector<std::vector<std::vector<El>>>(m, "VectorVectorEl"); // test_map_string_double py::bind_map<std::map<std::string, double>>(m, "MapStringDouble"); py::bind_map<std::unordered_map<std::string, double>>(m, "UnorderedMapStringDouble"); // test_map_string_double_const py::bind_map<std::map<std::string, double const>>(m, "MapStringDoubleConst"); py::bind_map<std::unordered_map<std::string, double const>>(m, "UnorderedMapStringDoubleConst"); py::class_<E_nc>(m, "ENC") .def(py::init<int>()) .def_readwrite("value", &E_nc::value); // test_noncopyable_containers py::bind_vector<std::vector<E_nc>>(m, "VectorENC"); m.def("get_vnc", &one_to_n<std::vector<E_nc>>, py::return_value_policy::reference); py::bind_vector<std::deque<E_nc>>(m, "DequeENC"); m.def("get_dnc", &one_to_n<std::deque<E_nc>>, py::return_value_policy::reference); py::bind_map<std::map<int, E_nc>>(m, "MapENC"); m.def("get_mnc", ×_ten<std::map<int, E_nc>>, py::return_value_policy::reference); py::bind_map<std::unordered_map<int, E_nc>>(m, "UmapENC"); m.def("get_umnc", ×_ten<std::unordered_map<int, E_nc>>, py::return_value_policy::reference); // test_vector_buffer py::bind_vector<std::vector<unsigned char>>(m, "VectorUChar", py::buffer_protocol()); // no dtype declared for this version: struct VUndeclStruct { bool w; uint32_t x; double y; bool z; }; m.def("create_undeclstruct", [m] () mutable { py::bind_vector<std::vector<VUndeclStruct>>(m, "VectorUndeclStruct", py::buffer_protocol()); }); // The rest depends on numpy: try { py::module::import("numpy"); } catch (...) { return; } // test_vector_buffer_numpy struct VStruct { bool w; uint32_t x; double y; bool z; }; PYBIND11_NUMPY_DTYPE(VStruct, w, x, y, z); py::class_<VStruct>(m, "VStruct").def_readwrite("x", &VStruct::x); py::bind_vector<std::vector<VStruct>>(m, "VectorStruct", py::buffer_protocol()); m.def("get_vectorstruct", [] {return std::vector<VStruct> {{0, 5, 3.0, 1}, {1, 30, -1e4, 0}};}); }
py::bind_vector<std::vector<bool>>(m, "VectorBool"); py::bind_vector<std::vector<El>>(m, "VectorEl"); py::bind_vector<std::vector<std::vector<El>>>(m, "VectorVectorEl"); m.def("create_undeclstruct", [m] () mutable { py::bind_vector<std::vector<VUndeclStruct>>(m, "VectorUndeclStruct", py::buffer_protocol()); }); try { py::module::import("numpy"); } catch (...) { return; } PYBIND11_NUMPY_DTYPE(VStruct, w, x, y, z); py::class_<VStruct>(m, "VStruct").def_readwrite("x", &VStruct::x); py::bind_vector<std::vector<VStruct>>(m, "VectorStruct", py::buffer_protocol()); m.def("get_vectorstruct", [] {return std::vector<VStruct> {{0, 5, 3.0, 1}, {1, 30, -1e4, 0}};}); }); test_initializer stl_binder_map([](py::module &m) { py::bind_map<std::map<std::string, double>>(m, "MapStringDouble"); py::bind_map<std::unordered_map<std::string, double>>(m, "UnorderedMapStringDouble"); py::bind_map<std::map<std::string, double const>>(m, "MapStringDoubleConst"); py::bind_map<std::unordered_map<std::string, double const>>(m, "UnorderedMapStringDoubleConst"); }); test_initializer stl_binder_noncopyable([](py::module &m) {
list.append(py::bool_(dt1.has_fields())); list.append(py::bool_(dt2.has_fields())); list.append(py::int_(dt1.itemsize())); list.append(py::int_(dt2.itemsize())); return list; } test_initializer numpy_dtypes([](py::module &m) { try { py::module::import("numpy"); } catch (...) { return; } // typeinfo may be registered before the dtype descriptor for scalar casts to work... py::class_<SimpleStruct>(m, "SimpleStruct"); PYBIND11_NUMPY_DTYPE(SimpleStruct, x, y, z); PYBIND11_NUMPY_DTYPE(PackedStruct, x, y, z); PYBIND11_NUMPY_DTYPE(NestedStruct, a, b); PYBIND11_NUMPY_DTYPE(PartialStruct, x, y, z); PYBIND11_NUMPY_DTYPE(PartialNestedStruct, a); PYBIND11_NUMPY_DTYPE(StringStruct, a, b); PYBIND11_NUMPY_DTYPE(EnumStruct, e1, e2); // ... or after py::class_<PackedStruct>(m, "PackedStruct"); PYBIND11_NUMPY_DTYPE_EX(StructWithUglyNames, __x__, "x", __y__, "y"); m.def("create_rec_simple", &create_recarray<SimpleStruct>); m.def("create_rec_packed", &create_recarray<PackedStruct>); m.def("create_rec_nested", &create_nested);