18 #if PYBIND11_HAS_VARIANT 20 #elif defined(PYBIND11_TEST_BOOST) && (!defined(_MSC_VER) || _MSC_VER >= 1910) 21 # include <boost/variant.hpp> 22 # define PYBIND11_HAS_VARIANT 1 25 namespace pybind11 {
namespace detail {
26 template <
typename... Ts>
27 struct type_caster<boost::variant<Ts...>> : variant_caster<boost::variant<Ts...>> {};
30 struct visit_helper<boost::variant> {
31 template <
typename... Args>
32 static auto call(Args &&...args) -> decltype(boost::apply_visitor(args...)) {
33 return boost::apply_visitor(args...);
55 m.def(
"cast_vector", []() {
return std::vector<int>{1}; });
56 m.def(
"load_vector", [](
const std::vector<int> &v) {
return v.at(0) == 1 && v.at(1) == 2; });
58 m.def(
"cast_bool_vector", []() {
return std::vector<bool>{
true,
false}; });
59 m.def(
"load_bool_vector", [](
const std::vector<bool> &v) {
60 return v.at(0) ==
true && v.at(1) ==
false;
63 static std::vector<RValueCaster> lvv{2};
64 m.def(
"cast_ptr_vector", []() {
return &lvv; });
67 m.def(
"cast_deque", []() {
return std::deque<int>{1}; });
68 m.def(
"load_deque", [](
const std::deque<int> &v) {
return v.at(0) == 1 && v.at(1) == 2; });
71 m.def(
"cast_array", []() {
return std::array<int, 2> {{1 , 2}}; });
72 m.def(
"load_array", [](
const std::array<int, 2> &a) {
return a[0] == 1 && a[1] == 2; });
75 m.def(
"cast_valarray", []() {
return std::valarray<int>{1, 4, 9}; });
76 m.def(
"load_valarray", [](
const std::valarray<int>& v) {
77 return v.size() == 3 && v[0] == 1 && v[1] == 4 && v[2] == 9;
81 m.def(
"cast_map", []() {
return std::map<std::string, std::string>{{
"key",
"value"}}; });
82 m.def(
"load_map", [](
const std::map<std::string, std::string> &map) {
83 return map.at(
"key") ==
"value" && map.at(
"key2") ==
"value2";
87 m.def(
"cast_set", []() {
return std::set<std::string>{
"key1",
"key2"}; });
88 m.def(
"load_set", [](
const std::set<std::string> &
set) {
89 return set.count(
"key1") &&
set.count(
"key2") &&
set.count(
"key3");
93 m.def(
"cast_rv_vector", []() {
return std::vector<RValueCaster>{2}; });
94 m.def(
"cast_rv_array", []() {
return std::array<RValueCaster, 3>(); });
98 m.def(
"cast_rv_map", []() {
return std::unordered_map<std::string, RValueCaster>{{
"a",
RValueCaster{}}}; });
99 m.def(
"cast_rv_nested", []() {
100 std::vector<std::array<std::list<std::unordered_map<std::string, RValueCaster>>, 2>> v;
102 v.back()[0].emplace_back();
105 v.back()[1].emplace_back();
109 static std::array<RValueCaster, 2> lva;
111 static std::unordered_map<std::string, std::vector<std::list<std::array<RValueCaster, 2>>>> lvn;
112 lvn[
"a"].emplace_back();
113 lvn[
"a"].back().emplace_back();
114 lvn[
"a"].emplace_back();
115 lvn[
"a"].back().emplace_back();
116 lvn[
"b"].emplace_back();
117 lvn[
"b"].back().emplace_back();
118 lvn[
"b"].back().emplace_back();
119 m.def(
"cast_lv_vector", []() ->
const decltype(lvv) & {
return lvv; });
120 m.def(
"cast_lv_array", []() ->
const decltype(lva) & {
return lva; });
121 m.def(
"cast_lv_map", []() ->
const decltype(lvm) & {
return lvm; });
122 m.def(
"cast_lv_nested", []() ->
const decltype(lvn) & {
return lvn; });
124 m.def(
"cast_unique_ptr_vector", []() {
125 std::vector<std::unique_ptr<UserType>> v;
126 v.emplace_back(
new UserType{7});
127 v.emplace_back(
new UserType{42});
132 struct MoveOutContainer {
133 struct Value {
int value; };
134 std::list<Value> move_list()
const {
return {{0}, {1}, {2}}; }
140 .def_property_readonly(
"move_list", &MoveOutContainer::move_list);
146 explicit NoAssign(
int value = 0) :
value(value) { }
147 NoAssign(
const NoAssign &) =
default;
148 NoAssign(NoAssign &&) =
default;
150 NoAssign &operator=(
const NoAssign &) =
delete;
151 NoAssign &operator=(NoAssign &&) =
delete;
155 .def(py::init<int>());
157 #ifdef PYBIND11_HAS_OPTIONAL 159 m.
attr(
"has_optional") =
true;
161 using opt_int = std::optional<int>;
162 using opt_no_assign = std::optional<NoAssign>;
163 m.
def(
"double_or_zero", [](
const opt_int&
x) ->
int {
164 return x.value_or(0) * 2;
166 m.
def(
"half_or_none", [](
int x) -> opt_int {
167 return x ? opt_int(x / 2) : opt_int();
169 m.
def(
"test_nullopt", [](opt_int x) {
170 return x.value_or(42);
171 },
py::arg_v(
"x", std::nullopt,
"None"));
172 m.
def(
"test_no_assign", [](
const opt_no_assign &x) {
173 return x ? x->value : 42;
174 },
py::arg_v(
"x", std::nullopt,
"None"));
176 m.
def(
"nodefer_none_optional", [](std::optional<int>) {
return true; });
177 m.
def(
"nodefer_none_optional", [](
py::none) {
return false; });
180 #ifdef PYBIND11_HAS_EXP_OPTIONAL 182 m.
attr(
"has_exp_optional") =
true;
184 using exp_opt_int = std::experimental::optional<int>;
185 using exp_opt_no_assign = std::experimental::optional<NoAssign>;
186 m.
def(
"double_or_zero_exp", [](
const exp_opt_int& x) ->
int {
187 return x.value_or(0) * 2;
189 m.
def(
"half_or_none_exp", [](
int x) -> exp_opt_int {
190 return x ? exp_opt_int(x / 2) : exp_opt_int();
192 m.
def(
"test_nullopt_exp", [](exp_opt_int x) {
193 return x.value_or(42);
194 },
py::arg_v(
"x", std::experimental::nullopt,
"None"));
195 m.
def(
"test_no_assign_exp", [](
const exp_opt_no_assign &x) {
196 return x ? x->value : 42;
197 },
py::arg_v(
"x", std::experimental::nullopt,
"None"));
200 #ifdef PYBIND11_HAS_VARIANT 202 "visitor::result_type is required by boost::variant in C++11 mode");
205 using result_type =
const char *;
207 result_type operator()(
int) {
return "int"; }
208 result_type operator()(std::string) {
return "std::string"; }
209 result_type operator()(
double) {
return "double"; }
210 result_type operator()(std::nullptr_t) {
return "std::nullptr_t"; }
214 m.
def(
"load_variant", [](variant<int, std::string, double, std::nullptr_t> v) {
217 m.
def(
"load_variant_2pass", [](variant<double, int> v) {
220 m.
def(
"cast_variant", []() {
221 using V = variant<int, std::string>;
228 m.
def(
"tpl_ctor_vector", [](std::vector<TplCtorClass> &) {});
229 m.
def(
"tpl_ctor_map", [](std::unordered_map<TplCtorClass, TplCtorClass> &) {});
230 m.
def(
"tpl_ctor_set", [](std::unordered_set<TplCtorClass> &) {});
231 #if defined(PYBIND11_HAS_OPTIONAL) 232 m.
def(
"tpl_constr_optional", [](std::optional<TplCtorClass> &) {});
233 #elif defined(PYBIND11_HAS_EXP_OPTIONAL) 234 m.
def(
"tpl_constr_optional", [](std::experimental::optional<TplCtorClass> &) {});
239 m.
def(
"return_vec_of_reference_wrapper", [](std::reference_wrapper<UserType> p4) {
240 static UserType p1{1}, p2{2}, p3{3};
241 return std::vector<std::reference_wrapper<UserType>> {
247 m.
def(
"stl_pass_by_pointer", [](std::vector<int>* v) {
return *v; },
"v"_a=
nullptr);
250 m.
def(
"func_with_string_or_vector_string_arg_overload", [](std::vector<std::string>) {
return 1; });
251 m.
def(
"func_with_string_or_vector_string_arg_overload", [](std::list<std::string>) {
return 2; });
252 m.
def(
"func_with_string_or_vector_string_arg_overload", [](std::string) {
return 3; });
257 Placeholder(
const Placeholder &) =
delete;
263 m.
def(
"test_stl_ownership",
265 std::vector<Placeholder *> result;
266 result.push_back(
new Placeholder());
269 py::return_value_policy::take_ownership);
271 m.
def(
"array_cast_sequence", [](std::array<int, 3> x) {
return x; });
274 struct Issue1561Inner { std::string
data; };
275 struct Issue1561Outer { std::vector<Issue1561Inner> list; };
278 .def(py::init<std::string>())
283 .def_readwrite(
"list", &Issue1561Outer::list);
bool operator==(const TplCtorClass &) const
glibc defines I as a macro which breaks things, e.g., boost template names
void print_destroyed(T *inst, Values &&...values)
PYBIND11_MAKE_OPAQUE(std::vector< std::string, std::allocator< std::string >>)
arr data(const arr &a, Ix... index)
obj_attr_accessor attr(handle key) const
op_< op_hash, op_u, self_t, undefined_t > hash(const self_t &)
size_t function_call & call
size_t operator()(const TplCtorClass &) const
Issue #528: templated constructor.
test_initializer stl("stl", test_submodule_stl)
void print_created(T *inst, Values &&...values)
#define TEST_SUBMODULE(name, variable)
bool typename Extra class_ & def(const char *name_, Func &&f, const Extra &... extra)