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", &times_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", &times_ten<std::unordered_map<int, E_nc>>, py::return_value_policy::reference);
1288199SAli.Saidi@ARM.com});
1298199SAli.Saidi@ARM.com