27 bool try_cast(
const handle& src, uint8_t flags, cleanup_list* cleanup)
29 using CasterT = make_caster<T>;
32 if (!caster.from_python(src, flags, cleanup))
return false;
33 value.set(caster.operator cast_t<T>());
37 bool from_python(handle src, uint8_t flags, cleanup_list* cleanup)
noexcept
39 if (PyNumber_Check(src.ptr())) {
41 return try_cast<int>(src, flags, cleanup) || try_cast<double>(src, flags, cleanup);
42 }
else if (try_cast<std::string>(src, flags, cleanup)) {
45 }
else if (PySequence_Check(src.ptr())) {
51 PyObject** o = seq_get(src.ptr(), &n, &temp);
53 bool success = o !=
nullptr;
56 lagrange::scene::Value::Array arr;
58 make_caster<lagrange::scene::Value> caster;
60 for (
size_t i = 0; i < n; ++i) {
61 if (!caster.from_python(o[i], flags, cleanup)) {
66 arr.push_back(caster.operator cast_t<lagrange::scene::Value>());
73 }
else if (PyMapping_Check(src.ptr())) {
76 PyObject* items = PyMapping_Items(src.ptr());
77 if (items ==
nullptr) {
82 Py_ssize_t size = NB_LIST_GET_SIZE(items);
83 bool success = size >= 0;
85 make_caster<std::string> key_caster;
86 make_caster<lagrange::scene::Value> val_caster;
87 lagrange::scene::Value::Object obj;
89 for (Py_ssize_t i = 0; i < size; ++i) {
90 PyObject* item = NB_LIST_GET_ITEM(items, i);
91 PyObject* key = NB_TUPLE_GET_ITEM(item, 0);
92 PyObject* val = NB_TUPLE_GET_ITEM(item, 1);
94 if (!key_caster.from_python(key, flags, cleanup)) {
99 if (!val_caster.from_python(val, flags, cleanup)) {
105 key_caster.operator cast_t<std::string>(),
106 val_caster.operator cast_t<lagrange::scene::Value>());
121 if (value.is_bool()) {
122 return make_caster<bool>::from_cpp(value.get_bool(), policy, cleanup);
123 }
else if (value.is_int()) {
124 return make_caster<int>::from_cpp(value.get_int(), policy, cleanup);
125 }
else if (value.is_real()) {
126 return make_caster<double>::from_cpp(value.get_real(), policy, cleanup);
127 }
else if (value.is_string()) {
128 return make_caster<std::string>::from_cpp(value.get_string(), policy, cleanup);
129 }
else if (value.is_buffer()) {
130 return make_caster<lagrange::scene::Value::Buffer>::from_cpp(
134 }
else if (value.is_array()) {
135 return make_caster<lagrange::scene::Value::Array>::from_cpp(
139 }
else if (value.is_object()) {
140 return make_caster<lagrange::scene::Value::Object>::from_cpp(
145 return none().release();