15 #ifndef PYBIND11_HAS_FILESYSTEM_IS_OPTIONAL 16 # define PYBIND11_HAS_FILESYSTEM_IS_OPTIONAL 23 #if defined(PYBIND11_TEST_BOOST) 24 # include <boost/optional.hpp> 38 #if defined(PYBIND11_HAS_VARIANT) 40 # define PYBIND11_TEST_VARIANT 1 41 #elif defined(PYBIND11_TEST_BOOST) 42 # include <boost/variant.hpp> 43 # define PYBIND11_TEST_VARIANT 1 48 template <
typename... Ts>
53 template <
typename... Args>
54 static auto call(Args &&...
args) -> decltype(boost::apply_visitor(
args...)) {
55 return boost::apply_visitor(
args...);
78 template <
template <
typename>
class OptionalImpl,
typename T>
83 OptionalImpl<T> member =
T{};
95 template <
template <
typename>
class OptionalImpl>
121 template <
typename T>
136 storage = {std::move(
value)};
140 template <
typename... Args>
143 storage.emplace_back(std::forward<Args>(
args)...);
144 return storage.back();
148 assert(!storage.empty());
156 explicit operator bool() const noexcept {
return !storage.empty(); }
164 template <
typename T>
172 m.def(
"cast_vector", []() {
return std::vector<int>{1}; });
173 m.def(
"load_vector", [](
const std::vector<int> &
v) {
return v.at(0) == 1 && v.at(1) == 2; });
175 m.def(
"cast_bool_vector", []() {
return std::vector<bool>{
true,
false}; });
176 m.def(
"load_bool_vector",
177 [](
const std::vector<bool> &v) {
return v.at(0) ==
true && v.at(1) ==
false; });
179 static std::vector<RValueCaster> lvv{2};
181 "cast_ptr_vector", []() {
return &lvv; }, py::return_value_policy::reference);
184 m.def(
"cast_deque", []() {
return std::deque<int>{1}; });
185 m.def(
"load_deque", [](
const std::deque<int> &v) {
return v.at(0) == 1 && v.at(1) == 2; });
188 m.def(
"cast_array", []() {
return std::array<int, 2>{{1, 2}}; });
189 m.def(
"load_array", [](
const std::array<int, 2> &
a) {
return a[0] == 1 && a[1] == 2; });
192 m.def(
"cast_valarray", []() {
return std::valarray<int>{1, 4, 9}; });
193 m.def(
"load_valarray", [](
const std::valarray<int> &v) {
194 return v.size() == 3 && v[0] == 1 && v[1] == 4 && v[2] == 9;
198 m.def(
"cast_map", []() {
return std::map<std::string, std::string>{{
"key",
"value"}}; });
199 m.def(
"load_map", [](
const std::map<std::string, std::string> &map) {
200 return map.at(
"key") ==
"value" && map.at(
"key2") ==
"value2";
204 m.def(
"cast_set", []() {
return std::set<std::string>{
"key1",
"key2"}; });
205 m.def(
"load_set", [](
const std::set<std::string> &
set) {
206 return (
set.count(
"key1") != 0u) && (
set.count(
"key2") != 0u) && (
set.count(
"key3") != 0u);
210 m.def(
"cast_rv_vector", []() {
return std::vector<RValueCaster>{2}; });
211 m.def(
"cast_rv_array", []() {
return std::array<RValueCaster, 3>(); });
215 m.def(
"cast_rv_map", []() {
216 return std::unordered_map<std::string, RValueCaster>{{
"a",
RValueCaster{}}};
218 m.def(
"cast_rv_nested", []() {
219 std::vector<std::array<std::list<std::unordered_map<std::string, RValueCaster>>, 2>>
v;
221 v.back()[0].emplace_back();
224 v.back()[1].emplace_back();
228 static std::array<RValueCaster, 2> lva;
229 static std::unordered_map<std::string, RValueCaster> lvm{{
"a",
RValueCaster{}},
231 static std::unordered_map<std::string, std::vector<std::list<std::array<RValueCaster, 2>>>>
233 lvn[
"a"].emplace_back();
234 lvn[
"a"].back().emplace_back();
235 lvn[
"a"].emplace_back();
236 lvn[
"a"].back().emplace_back();
237 lvn[
"b"].emplace_back();
238 lvn[
"b"].back().emplace_back();
239 lvn[
"b"].back().emplace_back();
240 m.def(
"cast_lv_vector", []() ->
const decltype(lvv) & {
return lvv; });
241 m.def(
"cast_lv_array", []() ->
const decltype(lva) & {
return lva; });
242 m.def(
"cast_lv_map", []() ->
const decltype(lvm) & {
return lvm; });
243 m.def(
"cast_lv_nested", []() ->
const decltype(lvn) & {
return lvn; });
245 m.def(
"cast_unique_ptr_vector", []() {
246 std::vector<std::unique_ptr<UserType>>
v;
247 v.emplace_back(
new UserType{7});
248 v.emplace_back(
new UserType{42});
252 pybind11::enum_<EnumType>(
m,
"EnumType")
257 struct MoveOutContainer {
261 std::list<Value> move_list()
const {
return {{0}, {1}, {2}}; }
263 py::class_<MoveOutContainer::Value>(
m,
"MoveOutContainerValue")
265 py::class_<MoveOutContainer>(
m,
"MoveOutContainer")
267 .def_property_readonly(
"move_list", &MoveOutContainer::move_list);
273 explicit NoAssign(
int value = 0) :
value(value) {}
274 NoAssign(
const NoAssign &) =
default;
275 NoAssign(NoAssign &&) =
default;
277 NoAssign &operator=(
const NoAssign &) =
delete;
278 NoAssign &operator=(NoAssign &&) =
delete;
280 py::class_<NoAssign>(
m,
"NoAssign",
"Class with no C++ assignment operators")
282 .def(py::init<int>());
284 struct MoveOutDetector {
285 MoveOutDetector() =
default;
286 MoveOutDetector(
const MoveOutDetector &) =
default;
287 MoveOutDetector(MoveOutDetector &&
other) noexcept : initialized(
other.initialized) {
289 other.initialized =
false;
291 bool initialized =
true;
293 py::class_<MoveOutDetector>(
m,
"MoveOutDetector",
"Class with move tracking")
295 .def_readonly(
"initialized", &MoveOutDetector::initialized);
297 #ifdef PYBIND11_HAS_OPTIONAL 299 m.attr(
"has_optional") =
true;
301 using opt_int = std::optional<int>;
302 using opt_no_assign = std::optional<NoAssign>;
303 m.def(
"double_or_zero", [](
const opt_int &
x) ->
int {
return x.value_or(0) * 2; });
304 m.def(
"half_or_none", [](
int x) -> opt_int {
return x != 0 ? opt_int(x / 2) : opt_int(); });
307 [](opt_int x) {
return x.value_or(42); },
308 py::arg_v(
"x", std::nullopt,
"None"));
311 [](
const opt_no_assign &x) {
return x ? x->value : 42; },
312 py::arg_v(
"x", std::nullopt,
"None"));
314 m.def(
"nodefer_none_optional", [](std::optional<int>) {
return true; });
315 m.def(
"nodefer_none_optional", [](
const py::none &) {
return false; });
318 py::class_<opt_holder>(
m,
"OptionalHolder",
"Class with optional member")
320 .def_readonly(
"member", &opt_holder::member)
321 .def(
"member_initialized", &opt_holder::member_initialized);
324 pybind11::class_<opt_props>(
m,
"OptionalProperties")
325 .def(pybind11::init<>())
326 .def_property_readonly(
"access_by_ref", &opt_props::access_by_ref)
327 .def_property_readonly(
"access_by_copy", &opt_props::access_by_copy);
330 #ifdef PYBIND11_HAS_EXP_OPTIONAL 332 m.attr(
"has_exp_optional") =
true;
334 using exp_opt_int = std::experimental::optional<int>;
335 using exp_opt_no_assign = std::experimental::optional<NoAssign>;
336 m.def(
"double_or_zero_exp", [](
const exp_opt_int &x) ->
int {
return x.value_or(0) * 2; });
337 m.def(
"half_or_none_exp",
338 [](
int x) -> exp_opt_int {
return x ? exp_opt_int(x / 2) : exp_opt_int(); });
341 [](exp_opt_int x) {
return x.value_or(42); },
342 py::arg_v(
"x", std::experimental::nullopt,
"None"));
344 "test_no_assign_exp",
345 [](
const exp_opt_no_assign &x) {
return x ? x->value : 42; },
346 py::arg_v(
"x", std::experimental::nullopt,
"None"));
349 py::class_<opt_exp_holder>(
m,
"OptionalExpHolder",
"Class with optional member")
351 .def_readonly(
"member", &opt_exp_holder::member)
352 .def(
"member_initialized", &opt_exp_holder::member_initialized);
355 pybind11::class_<opt_exp_props>(
m,
"OptionalExpProperties")
356 .def(pybind11::init<>())
357 .def_property_readonly(
"access_by_ref", &opt_exp_props::access_by_ref)
358 .def_property_readonly(
"access_by_copy", &opt_exp_props::access_by_copy);
361 #if defined(PYBIND11_TEST_BOOST) 363 m.attr(
"has_boost_optional") =
true;
365 using boost_opt_int = boost::optional<int>;
366 using boost_opt_no_assign = boost::optional<NoAssign>;
367 m.def(
"double_or_zero_boost", [](
const boost_opt_int &x) ->
int {
return x.value_or(0) * 2; });
368 m.def(
"half_or_none_boost",
369 [](
int x) -> boost_opt_int {
return x != 0 ? boost_opt_int(x / 2) : boost_opt_int(); });
371 "test_nullopt_boost",
372 [](boost_opt_int x) {
return x.value_or(42); },
373 py::arg_v(
"x", boost::none,
"None"));
375 "test_no_assign_boost",
376 [](
const boost_opt_no_assign &x) {
return x ? x->value : 42; },
377 py::arg_v(
"x", boost::none,
"None"));
380 py::class_<opt_boost_holder>(
m,
"OptionalBoostHolder",
"Class with optional member")
382 .def_readonly(
"member", &opt_boost_holder::member)
383 .def(
"member_initialized", &opt_boost_holder::member_initialized);
386 pybind11::class_<opt_boost_props>(
m,
"OptionalBoostProperties")
387 .def(pybind11::init<>())
388 .def_property_readonly(
"access_by_ref", &opt_boost_props::access_by_ref)
389 .def_property_readonly(
"access_by_copy", &opt_boost_props::access_by_copy);
395 m.def(
"double_or_zero_refsensitive",
396 [](
const refsensitive_opt_int &x) ->
int {
return (x ? x.value() : 0) * 2; });
397 m.def(
"half_or_none_refsensitive", [](
int x) -> refsensitive_opt_int {
398 return x != 0 ? refsensitive_opt_int(x / 2) : refsensitive_opt_int();
401 "test_nullopt_refsensitive",
403 [](refsensitive_opt_int x) {
return x ? x.value() : 42; },
404 py::arg_v(
"x", refsensitive_opt_int(),
"None"));
406 "test_no_assign_refsensitive",
407 [](
const refsensitive_opt_no_assign &x) {
return x ? x->value : 42; },
408 py::arg_v(
"x", refsensitive_opt_no_assign(),
"None"));
411 py::class_<opt_refsensitive_holder>(
412 m,
"OptionalRefSensitiveHolder",
"Class with optional member")
414 .def_readonly(
"member", &opt_refsensitive_holder::member)
415 .def(
"member_initialized", &opt_refsensitive_holder::member_initialized);
418 pybind11::class_<opt_refsensitive_props>(
m,
"OptionalRefSensitiveProperties")
419 .def(pybind11::init<>())
420 .def_property_readonly(
"access_by_ref", &opt_refsensitive_props::access_by_ref)
421 .def_property_readonly(
"access_by_copy", &opt_refsensitive_props::access_by_copy);
423 #ifdef PYBIND11_HAS_FILESYSTEM 425 m.attr(
"has_filesystem") =
true;
429 #ifdef PYBIND11_TEST_VARIANT 431 "visitor::result_type is required by boost::variant in C++11 mode");
434 using result_type =
const char *;
437 result_type
operator()(
const std::string &) {
return "std::string"; }
438 result_type
operator()(
double) {
return "double"; }
439 result_type
operator()(std::nullptr_t) {
return "std::nullptr_t"; }
440 # if defined(PYBIND11_HAS_VARIANT) 441 result_type
operator()(std::monostate) {
return "std::monostate"; }
446 m.def(
"load_variant", [](
const variant<int, std::string, double, std::nullptr_t> &v) {
447 return py::detail::visit_helper<variant>::call(visitor(), v);
449 m.def(
"load_variant_2pass", [](variant<double, int> v) {
450 return py::detail::visit_helper<variant>::call(visitor(), v);
452 m.def(
"cast_variant", []() {
453 using V = variant<int, std::string>;
457 # if defined(PYBIND11_HAS_VARIANT) 459 m.def(
"load_monostate_variant",
460 [](
const variant<std::monostate, int, std::string> &v) ->
const char * {
461 return py::detail::visit_helper<variant>::call(visitor(), v);
463 m.def(
"cast_monostate_variant", []() {
464 using V = variant<std::monostate, int, std::string>;
472 m.def(
"tpl_ctor_vector", [](std::vector<TplCtorClass> &) {});
473 m.def(
"tpl_ctor_map", [](std::unordered_map<TplCtorClass, TplCtorClass> &) {});
474 m.def(
"tpl_ctor_set", [](std::unordered_set<TplCtorClass> &) {});
475 #if defined(PYBIND11_HAS_OPTIONAL) 476 m.def(
"tpl_constr_optional", [](std::optional<TplCtorClass> &) {});
478 #if defined(PYBIND11_HAS_EXP_OPTIONAL) 479 m.def(
"tpl_constr_optional_exp", [](std::experimental::optional<TplCtorClass> &) {});
481 #if defined(PYBIND11_TEST_BOOST) 482 m.def(
"tpl_constr_optional_boost", [](boost::optional<TplCtorClass> &) {});
487 m.def(
"return_vec_of_reference_wrapper", [](std::reference_wrapper<UserType>
p4) {
488 static UserType
p1{1},
p2{2},
p3{3};
489 return std::vector<std::reference_wrapper<UserType>>{
495 "stl_pass_by_pointer", [](std::vector<int> *v) {
return *
v; },
"v"_a =
nullptr);
498 m.def(
"func_with_string_or_vector_string_arg_overload",
499 [](
const std::vector<std::string> &) {
return 1; });
500 m.def(
"func_with_string_or_vector_string_arg_overload",
501 [](
const std::list<std::string> &) {
return 2; });
502 m.def(
"func_with_string_or_vector_string_arg_overload", [](
const std::string &) {
return 3; });
507 Placeholder(
const Placeholder &) =
delete;
510 py::class_<Placeholder>(
m,
"Placeholder");
514 "test_stl_ownership",
516 std::vector<Placeholder *>
result;
517 result.push_back(
new Placeholder());
520 py::return_value_policy::take_ownership);
522 m.def(
"array_cast_sequence", [](std::array<int, 3> x) {
return x; });
525 struct Issue1561Inner {
528 struct Issue1561Outer {
529 std::vector<Issue1561Inner> list;
532 py::class_<Issue1561Inner>(
m,
"Issue1561Inner")
533 .def(py::init<std::string>())
536 py::class_<Issue1561Outer>(
m,
"Issue1561Outer")
538 .def_readwrite(
"list", &Issue1561Outer::list);
541 "return_vector_bool_raw_ptr",
542 []() {
return new std::vector<bool>(4513); },
544 py::return_value_policy::take_ownership);
ReferenceSensitiveOptional(const T &value)
OptionalEnumValue & access_by_ref()
void print_destroyed(T *inst, Values &&...values)
OptionalImpl< EnumType > OptionalEnumValue
PYBIND11_MAKE_OPAQUE(std::vector< std::string, std::allocator< std::string >>)
const T & operator*() const noexcept
const T & value() const noexcept
T & emplace(Args &&...args)
OptionalEnumValue access_by_copy()
bool operator==(const TplCtorClass &) const
ReferenceSensitiveOptional & operator=(const T &value)
Array< int, Dynamic, 1 > v
Eigen::Triplet< double > T
size_t operator()(const TplCtorClass &) const
const T * operator->() const noexcept
ReferenceSensitiveOptional(T &&value)
void print_created(T *inst, Values &&...values)
Issue #528: templated constructor.
ReferenceSensitiveOptional & operator=(T &&value)
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
internal::enable_if< internal::valid_indexed_view_overload< RowIndices, ColIndices >::value &&internal::traits< typename EIGEN_INDEXED_VIEW_METHOD_TYPE< RowIndices, ColIndices >::type >::ReturnAsIndexedView, typename EIGEN_INDEXED_VIEW_METHOD_TYPE< RowIndices, ColIndices >::type >::type operator()(const RowIndices &rowIndices, const ColIndices &colIndices) EIGEN_INDEXED_VIEW_METHOD_CONST
bool member_initialized() const