test_variant_unique_shared.cpp 1.29 KB
Newer Older
1
2
#include "pybind11_tests.h"

3
#include <pybind11/vptr_holder.h>
4

5
6
#include <memory>
#include <variant>
7

8
namespace pybind11_tests {
9

10
using pybind11::vptr;
11

12
vptr<double> from_raw() { return vptr<double>{new double{3}}; }
13

14
15
vptr<double> from_unique() {
    return vptr<double>{std::unique_ptr<double>(new double{5})};
16
17
}

18
19
vptr<double> from_shared() {
    return vptr<double>{std::shared_ptr<double>(new double{7})};
20
21
22
23
24
25
26
27
}

TEST_SUBMODULE(variant_unique_shared, m) {

    m.def("from_raw", from_raw);
    m.def("from_unique", from_unique);
    m.def("from_shared", from_shared);

28
    py::class_<vptr<double>>(m, "vptr_double")
29
        .def(py::init<>())
30
        .def("ownership_type", &vptr<double>::ownership_type)
31
        .def("get_value",
32
             [](vptr<double> &v) {
33
34
35
36
37
38
                 auto p = v.get();
                 if (p)
                     return *p;
                 return -1.;
             })
        .def("get_unique",
39
             [](vptr<double> &v) {
40
41
42
                 v.get_unique();
                 return;
             })
43
44
45
46
47
48
49
        .def("get_shared",
             [](vptr<double> &v) {
                 v.get_shared();
                 return;
             })
        .def("disown_unique", [](vptr<double> &v) {
            v.get_unique().reset();
50
51
52
53
54
            return;
        });
}

} // namespace pybind11_tests