13
13
#include " detail/common.h"
14
14
15
15
#include < deque>
16
+ #include < iostream>
16
17
#include < list>
17
18
#include < map>
18
19
#include < ostream>
@@ -116,6 +117,10 @@ struct map_caster {
116
117
void reserve_maybe (const dict &, void *) {}
117
118
118
119
public:
120
+ #define DEBUG (value ) std::cerr << __func__ << " : " << &value << " #: " << value.size() << " \n "
121
+
122
+ map_caster () { DEBUG (value); }
123
+ ~map_caster () { DEBUG (value); }
119
124
bool load (handle src, bool convert) {
120
125
if (!isinstance<dict>(src)) {
121
126
return false ;
@@ -131,11 +136,13 @@ struct map_caster {
131
136
}
132
137
value.emplace (cast_op<Key &&>(std::move (kconv)), cast_op<Value &&>(std::move (vconv)));
133
138
}
139
+ DEBUG (value);
134
140
return true ;
135
141
}
136
142
137
143
template <typename T>
138
144
static handle cast (T &&src, return_value_policy policy, handle parent) {
145
+ DEBUG (src);
139
146
dict d;
140
147
return_value_policy policy_key = policy;
141
148
return_value_policy policy_value = policy;
@@ -156,9 +163,40 @@ struct map_caster {
156
163
return d.release ();
157
164
}
158
165
159
- PYBIND11_TYPE_CASTER (Type,
160
- const_name (" Dict[" ) + key_conv::name + const_name(" , " ) + value_conv::name
161
- + const_name(" ]" ));
166
+ protected:
167
+ Type value;
168
+
169
+ public:
170
+ static constexpr auto name = _(" Dict[" ) + key_conv::name + _(" , " ) + value_conv::name + _(" ]" );
171
+ template <typename T, enable_if_t <std::is_same<Type, remove_cv_t <T>>::value, int > = 0 >
172
+ static handle cast (T *src, return_value_policy policy, handle parent) {
173
+ if (!src)
174
+ return none ().release ();
175
+ if (policy == return_value_policy::take_ownership) {
176
+ auto h = cast (std::move (*src), policy, parent);
177
+ delete src;
178
+ return h;
179
+ } else {
180
+ return cast (*src, policy, parent);
181
+ }
182
+ }
183
+ operator Type *() {
184
+ DEBUG (value);
185
+ return &value;
186
+ }
187
+ operator Type &() {
188
+ DEBUG (value);
189
+ return value;
190
+ }
191
+ operator Type &&() && {
192
+ DEBUG (value);
193
+ return std::move (value);
194
+ }
195
+
196
+ template <typename T>
197
+ using cast_op_type = pybind11::detail::movable_cast_op_type<T>;
198
+
199
+ #undef DEBUG
162
200
};
163
201
164
202
template <typename Type, typename Value>
0 commit comments