Wenzel Jakob | eda978e | 2016-03-15 15:05:40 +0100 | [diff] [blame] | 1 | /* |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 2 | tests/test_opaque_types.cpp -- opaque types, passing void pointers |
Wenzel Jakob | eda978e | 2016-03-15 15:05:40 +0100 | [diff] [blame] | 3 | |
Wenzel Jakob | 8cb6cb3 | 2016-04-17 20:21:41 +0200 | [diff] [blame] | 4 | Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch> |
Wenzel Jakob | eda978e | 2016-03-15 15:05:40 +0100 | [diff] [blame] | 5 | |
| 6 | All rights reserved. Use of this source code is governed by a |
| 7 | BSD-style license that can be found in the LICENSE file. |
| 8 | */ |
| 9 | |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 10 | #include "pybind11_tests.h" |
Wenzel Jakob | eda978e | 2016-03-15 15:05:40 +0100 | [diff] [blame] | 11 | #include <pybind11/stl.h> |
| 12 | #include <vector> |
| 13 | |
| 14 | typedef std::vector<std::string> StringList; |
| 15 | |
Wenzel Jakob | 0871228 | 2016-04-22 16:52:15 +0200 | [diff] [blame] | 16 | class ClassWithSTLVecProperty { |
| 17 | public: |
| 18 | StringList stringList; |
| 19 | }; |
| 20 | |
Wenzel Jakob | 06f56ee | 2016-04-28 16:25:24 +0200 | [diff] [blame] | 21 | /* IMPORTANT: Disable internal pybind11 translation mechanisms for STL data structures */ |
Wenzel Jakob | e8b9dd2 | 2016-04-30 19:35:24 +0200 | [diff] [blame] | 22 | PYBIND11_MAKE_OPAQUE(StringList); |
Wenzel Jakob | 06f56ee | 2016-04-28 16:25:24 +0200 | [diff] [blame] | 23 | |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 24 | test_initializer opaque_types([](py::module &m) { |
Wenzel Jakob | 06f56ee | 2016-04-28 16:25:24 +0200 | [diff] [blame] | 25 | py::class_<StringList>(m, "StringList") |
Wenzel Jakob | eda978e | 2016-03-15 15:05:40 +0100 | [diff] [blame] | 26 | .def(py::init<>()) |
Wenzel Jakob | 06f56ee | 2016-04-28 16:25:24 +0200 | [diff] [blame] | 27 | .def("pop_back", &StringList::pop_back) |
| 28 | /* There are multiple versions of push_back(), etc. Select the right ones. */ |
| 29 | .def("push_back", (void (StringList::*)(const std::string &)) &StringList::push_back) |
| 30 | .def("back", (std::string &(StringList::*)()) &StringList::back) |
| 31 | .def("__len__", [](const StringList &v) { return v.size(); }) |
| 32 | .def("__iter__", [](StringList &v) { |
| 33 | return py::make_iterator(v.begin(), v.end()); |
| 34 | }, py::keep_alive<0, 1>()); |
Wenzel Jakob | eda978e | 2016-03-15 15:05:40 +0100 | [diff] [blame] | 35 | |
Wenzel Jakob | 0871228 | 2016-04-22 16:52:15 +0200 | [diff] [blame] | 36 | py::class_<ClassWithSTLVecProperty>(m, "ClassWithSTLVecProperty") |
| 37 | .def(py::init<>()) |
Wenzel Jakob | 06f56ee | 2016-04-28 16:25:24 +0200 | [diff] [blame] | 38 | .def_readwrite("stringList", &ClassWithSTLVecProperty::stringList); |
Wenzel Jakob | 0871228 | 2016-04-22 16:52:15 +0200 | [diff] [blame] | 39 | |
Wenzel Jakob | 06f56ee | 2016-04-28 16:25:24 +0200 | [diff] [blame] | 40 | m.def("print_opaque_list", [](const StringList &l) { |
Dean Moldovan | 665e880 | 2016-08-12 22:28:31 +0200 | [diff] [blame] | 41 | std::string ret = "Opaque list: ["; |
Wenzel Jakob | 0871228 | 2016-04-22 16:52:15 +0200 | [diff] [blame] | 42 | bool first = true; |
| 43 | for (auto entry : l) { |
| 44 | if (!first) |
Dean Moldovan | 665e880 | 2016-08-12 22:28:31 +0200 | [diff] [blame] | 45 | ret += ", "; |
| 46 | ret += entry; |
Wenzel Jakob | 0871228 | 2016-04-22 16:52:15 +0200 | [diff] [blame] | 47 | first = false; |
| 48 | } |
Dean Moldovan | 665e880 | 2016-08-12 22:28:31 +0200 | [diff] [blame] | 49 | return ret + "]"; |
Wenzel Jakob | eda978e | 2016-03-15 15:05:40 +0100 | [diff] [blame] | 50 | }); |
Wenzel Jakob | de1bca8 | 2016-03-26 17:51:09 +0100 | [diff] [blame] | 51 | |
Wenzel Jakob | 772c6d5 | 2016-04-30 19:56:10 +0200 | [diff] [blame] | 52 | m.def("return_void_ptr", []() { return (void *) 0x1234; }); |
Dean Moldovan | 665e880 | 2016-08-12 22:28:31 +0200 | [diff] [blame] | 53 | m.def("get_void_ptr_value", [](void *ptr) { return reinterpret_cast<std::intptr_t>(ptr); }); |
Wenzel Jakob | 9883ec0 | 2016-03-26 23:37:51 +0100 | [diff] [blame] | 54 | m.def("return_null_str", []() { return (char *) nullptr; }); |
Dean Moldovan | 665e880 | 2016-08-12 22:28:31 +0200 | [diff] [blame] | 55 | m.def("get_null_str_value", [](char *ptr) { return reinterpret_cast<std::intptr_t>(ptr); }); |
Wenzel Jakob | 9f0dfce | 2016-04-06 17:38:18 +0200 | [diff] [blame] | 56 | |
| 57 | m.def("return_unique_ptr", []() -> std::unique_ptr<StringList> { |
| 58 | StringList *result = new StringList(); |
| 59 | result->push_back("some value"); |
| 60 | return std::unique_ptr<StringList>(result); |
| 61 | }); |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 62 | }); |