test_opaque_types.cpp revision 12391
111986Sandreas.sandberg@arm.com/* 211986Sandreas.sandberg@arm.com tests/test_opaque_types.cpp -- opaque types, passing void pointers 311986Sandreas.sandberg@arm.com 411986Sandreas.sandberg@arm.com Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch> 511986Sandreas.sandberg@arm.com 611986Sandreas.sandberg@arm.com All rights reserved. Use of this source code is governed by a 711986Sandreas.sandberg@arm.com BSD-style license that can be found in the LICENSE file. 811986Sandreas.sandberg@arm.com*/ 911986Sandreas.sandberg@arm.com 1011986Sandreas.sandberg@arm.com#include "pybind11_tests.h" 1111986Sandreas.sandberg@arm.com#include <pybind11/stl.h> 1211986Sandreas.sandberg@arm.com#include <vector> 1311986Sandreas.sandberg@arm.com 1412391Sjason@lowepower.comusing StringList = std::vector<std::string>; 1511986Sandreas.sandberg@arm.com 1611986Sandreas.sandberg@arm.com/* IMPORTANT: Disable internal pybind11 translation mechanisms for STL data structures */ 1711986Sandreas.sandberg@arm.comPYBIND11_MAKE_OPAQUE(StringList); 1811986Sandreas.sandberg@arm.com 1912391Sjason@lowepower.comTEST_SUBMODULE(opaque_types, m) { 2012391Sjason@lowepower.com // test_string_list 2111986Sandreas.sandberg@arm.com py::class_<StringList>(m, "StringList") 2211986Sandreas.sandberg@arm.com .def(py::init<>()) 2311986Sandreas.sandberg@arm.com .def("pop_back", &StringList::pop_back) 2411986Sandreas.sandberg@arm.com /* There are multiple versions of push_back(), etc. Select the right ones. */ 2511986Sandreas.sandberg@arm.com .def("push_back", (void (StringList::*)(const std::string &)) &StringList::push_back) 2611986Sandreas.sandberg@arm.com .def("back", (std::string &(StringList::*)()) &StringList::back) 2711986Sandreas.sandberg@arm.com .def("__len__", [](const StringList &v) { return v.size(); }) 2811986Sandreas.sandberg@arm.com .def("__iter__", [](StringList &v) { 2911986Sandreas.sandberg@arm.com return py::make_iterator(v.begin(), v.end()); 3011986Sandreas.sandberg@arm.com }, py::keep_alive<0, 1>()); 3111986Sandreas.sandberg@arm.com 3212391Sjason@lowepower.com class ClassWithSTLVecProperty { 3312391Sjason@lowepower.com public: 3412391Sjason@lowepower.com StringList stringList; 3512391Sjason@lowepower.com }; 3611986Sandreas.sandberg@arm.com py::class_<ClassWithSTLVecProperty>(m, "ClassWithSTLVecProperty") 3711986Sandreas.sandberg@arm.com .def(py::init<>()) 3811986Sandreas.sandberg@arm.com .def_readwrite("stringList", &ClassWithSTLVecProperty::stringList); 3911986Sandreas.sandberg@arm.com 4011986Sandreas.sandberg@arm.com m.def("print_opaque_list", [](const StringList &l) { 4111986Sandreas.sandberg@arm.com std::string ret = "Opaque list: ["; 4211986Sandreas.sandberg@arm.com bool first = true; 4311986Sandreas.sandberg@arm.com for (auto entry : l) { 4411986Sandreas.sandberg@arm.com if (!first) 4511986Sandreas.sandberg@arm.com ret += ", "; 4611986Sandreas.sandberg@arm.com ret += entry; 4711986Sandreas.sandberg@arm.com first = false; 4811986Sandreas.sandberg@arm.com } 4911986Sandreas.sandberg@arm.com return ret + "]"; 5011986Sandreas.sandberg@arm.com }); 5111986Sandreas.sandberg@arm.com 5212391Sjason@lowepower.com // test_pointers 5311986Sandreas.sandberg@arm.com m.def("return_void_ptr", []() { return (void *) 0x1234; }); 5411986Sandreas.sandberg@arm.com m.def("get_void_ptr_value", [](void *ptr) { return reinterpret_cast<std::intptr_t>(ptr); }); 5511986Sandreas.sandberg@arm.com m.def("return_null_str", []() { return (char *) nullptr; }); 5611986Sandreas.sandberg@arm.com m.def("get_null_str_value", [](char *ptr) { return reinterpret_cast<std::intptr_t>(ptr); }); 5711986Sandreas.sandberg@arm.com 5811986Sandreas.sandberg@arm.com m.def("return_unique_ptr", []() -> std::unique_ptr<StringList> { 5911986Sandreas.sandberg@arm.com StringList *result = new StringList(); 6011986Sandreas.sandberg@arm.com result->push_back("some value"); 6111986Sandreas.sandberg@arm.com return std::unique_ptr<StringList>(result); 6211986Sandreas.sandberg@arm.com }); 6312391Sjason@lowepower.com} 64