test_stl_binders.cpp revision 12037
113559Snikos.nikoleris@arm.com/* 212109SRekai.GonzalezAlberquilla@arm.com tests/test_stl_binders.cpp -- Usage of stl_binders functions 312109SRekai.GonzalezAlberquilla@arm.com 412109SRekai.GonzalezAlberquilla@arm.com Copyright (c) 2016 Sergey Lyskov 512109SRekai.GonzalezAlberquilla@arm.com 612109SRekai.GonzalezAlberquilla@arm.com All rights reserved. Use of this source code is governed by a 712109SRekai.GonzalezAlberquilla@arm.com BSD-style license that can be found in the LICENSE file. 812109SRekai.GonzalezAlberquilla@arm.com*/ 912109SRekai.GonzalezAlberquilla@arm.com 1012109SRekai.GonzalezAlberquilla@arm.com#include "pybind11_tests.h" 1112109SRekai.GonzalezAlberquilla@arm.com 1212109SRekai.GonzalezAlberquilla@arm.com#include <pybind11/stl_bind.h> 134486Sbinkertn@umich.edu#include <pybind11/numpy.h> 144486Sbinkertn@umich.edu#include <map> 154486Sbinkertn@umich.edu#include <deque> 164486Sbinkertn@umich.edu#include <unordered_map> 174486Sbinkertn@umich.edu 184486Sbinkertn@umich.edu#ifdef _MSC_VER 194486Sbinkertn@umich.edu// We get some really long type names here which causes MSVC to emit warnings 204486Sbinkertn@umich.edu# pragma warning(disable: 4503) // warning C4503: decorated name length exceeded, name was truncated 214486Sbinkertn@umich.edu#endif 224486Sbinkertn@umich.edu 234486Sbinkertn@umich.educlass El { 244486Sbinkertn@umich.edupublic: 254486Sbinkertn@umich.edu El() = delete; 264486Sbinkertn@umich.edu El(int v) : a(v) { } 274486Sbinkertn@umich.edu 284486Sbinkertn@umich.edu int a; 294486Sbinkertn@umich.edu}; 304486Sbinkertn@umich.edu 314486Sbinkertn@umich.edustd::ostream & operator<<(std::ostream &s, El const&v) { 324486Sbinkertn@umich.edu s << "El{" << v.a << '}'; 334486Sbinkertn@umich.edu return s; 344486Sbinkertn@umich.edu} 354486Sbinkertn@umich.edu 364486Sbinkertn@umich.edu/// Issue #487: binding std::vector<E> with E non-copyable 374486Sbinkertn@umich.educlass E_nc { 384486Sbinkertn@umich.edupublic: 394486Sbinkertn@umich.edu explicit E_nc(int i) : value{i} {} 404486Sbinkertn@umich.edu E_nc(const E_nc &) = delete; 4112563Sgabeblack@google.com E_nc &operator=(const E_nc &) = delete; 4212563Sgabeblack@google.com E_nc(E_nc &&) = default; 436654Snate@binkert.org E_nc &operator=(E_nc &&) = default; 443102SN/A 453102SN/A int value; 461681SN/A}; 473223SN/A 488887Sgeoffrey.blake@arm.comtemplate <class Container> Container *one_to_n(int n) { 4910785Sgope@wisc.edu auto v = new Container(); 504486Sbinkertn@umich.edu for (int i = 1; i <= n; i++) 5113559Snikos.nikoleris@arm.com v->emplace_back(i); 5213559Snikos.nikoleris@arm.com return v; 5313559Snikos.nikoleris@arm.com} 5413560Snikos.nikoleris@arm.com 5513560Snikos.nikoleris@arm.comtemplate <class Map> Map *times_ten(int n) { 5613560Snikos.nikoleris@arm.com auto m = new Map(); 5713563Snikos.nikoleris@arm.com for (int i = 1; i <= n; i++) 5813563Snikos.nikoleris@arm.com m->emplace(int(i), E_nc(10*i)); 5913563Snikos.nikoleris@arm.com return m; 602817SN/A} 612817SN/A 629341SAndreas.Sandberg@arm.comstruct VStruct { 639341SAndreas.Sandberg@arm.com bool w; 649518SAndreas.Sandberg@ARM.com uint32_t x; 659518SAndreas.Sandberg@ARM.com double y; 669518SAndreas.Sandberg@ARM.com bool z; 679518SAndreas.Sandberg@ARM.com}; 689518SAndreas.Sandberg@ARM.com 699518SAndreas.Sandberg@ARM.comstruct VUndeclStruct { //dtype not declared for this version 709518SAndreas.Sandberg@ARM.com bool w; 719518SAndreas.Sandberg@ARM.com uint32_t x; 729518SAndreas.Sandberg@ARM.com double y; 739518SAndreas.Sandberg@ARM.com bool z; 749518SAndreas.Sandberg@ARM.com}; 759518SAndreas.Sandberg@ARM.com 762932SN/Atest_initializer stl_binder_vector([](py::module &m) { 771681SN/A py::class_<El>(m, "El") 7811780Sarthur.perais@inria.fr .def(py::init<int>()); 7911780Sarthur.perais@inria.fr 801681SN/A py::bind_vector<std::vector<unsigned char>>(m, "VectorUChar", py::buffer_protocol()); 819184Sandreas.hansson@arm.com py::bind_vector<std::vector<unsigned int>>(m, "VectorInt", py::buffer_protocol()); 829184Sandreas.hansson@arm.com py::bind_vector<std::vector<bool>>(m, "VectorBool"); 839184Sandreas.hansson@arm.com 849184Sandreas.hansson@arm.com py::bind_vector<std::vector<El>>(m, "VectorEl"); 859184Sandreas.hansson@arm.com 862932SN/A py::bind_vector<std::vector<std::vector<El>>>(m, "VectorVectorEl"); 879982Satgutier@umich.edu 8810331Smitch.hayenga@arm.com m.def("create_undeclstruct", [m] () mutable { 8910331Smitch.hayenga@arm.com py::bind_vector<std::vector<VUndeclStruct>>(m, "VectorUndeclStruct", py::buffer_protocol()); 902932SN/A }); 919184Sandreas.hansson@arm.com 929184Sandreas.hansson@arm.com try { 939184Sandreas.hansson@arm.com py::module::import("numpy"); 949184Sandreas.hansson@arm.com } catch (...) { 959184Sandreas.hansson@arm.com return; 962932SN/A } 971681SN/A PYBIND11_NUMPY_DTYPE(VStruct, w, x, y, z); 989184Sandreas.hansson@arm.com py::class_<VStruct>(m, "VStruct").def_readwrite("x", &VStruct::x); 999184Sandreas.hansson@arm.com py::bind_vector<std::vector<VStruct>>(m, "VectorStruct", py::buffer_protocol()); 1009184Sandreas.hansson@arm.com m.def("get_vectorstruct", [] {return std::vector<VStruct> {{0, 5, 3.0, 1}, {1, 30, -1e4, 0}};}); 1019184Sandreas.hansson@arm.com}); 1022932SN/A 1031681SN/Atest_initializer stl_binder_map([](py::module &m) { 1049184Sandreas.hansson@arm.com py::bind_map<std::map<std::string, double>>(m, "MapStringDouble"); 1052932SN/A py::bind_map<std::unordered_map<std::string, double>>(m, "UnorderedMapStringDouble"); 1069184Sandreas.hansson@arm.com 1072932SN/A py::bind_map<std::map<std::string, double const>>(m, "MapStringDoubleConst"); 1089184Sandreas.hansson@arm.com py::bind_map<std::unordered_map<std::string, double const>>(m, "UnorderedMapStringDoubleConst"); 1092932SN/A 1102932SN/A}); 1112932SN/A 1122932SN/Atest_initializer stl_binder_noncopyable([](py::module &m) { 1133223SN/A py::class_<E_nc>(m, "ENC") 1142932SN/A .def(py::init<int>()) 1159184Sandreas.hansson@arm.com .def_readwrite("value", &E_nc::value); 1161681SN/A 1179184Sandreas.hansson@arm.com py::bind_vector<std::vector<E_nc>>(m, "VectorENC"); 1182932SN/A m.def("get_vnc", &one_to_n<std::vector<E_nc>>, py::return_value_policy::reference); 1192932SN/A 1209184Sandreas.hansson@arm.com py::bind_vector<std::deque<E_nc>>(m, "DequeENC"); 1219184Sandreas.hansson@arm.com m.def("get_dnc", &one_to_n<std::deque<E_nc>>, py::return_value_policy::reference); 1221681SN/A 1232932SN/A py::bind_map<std::map<int, E_nc>>(m, "MapENC"); 1242932SN/A m.def("get_mnc", ×_ten<std::map<int, E_nc>>, py::return_value_policy::reference); 1251681SN/A 1262932SN/A py::bind_map<std::unordered_map<int, E_nc>>(m, "UmapENC"); 1272932SN/A m.def("get_umnc", ×_ten<std::unordered_map<int, E_nc>>, py::return_value_policy::reference); 1288199SAli.Saidi@ARM.com}); 1298199SAli.Saidi@ARM.com