27 static constexpr
auto name = _<value_and_holder>();
36 if (!ptr)
throw type_error(
"pybind11::init(): factory function returned nullptr");
40 template <
typename Class>
using Cpp =
typename Class::type;
41 template <
typename Class>
using Alias =
typename Class::type_alias;
42 template <
typename Class>
using Holder =
typename Class::holder_type;
47 template <
typename Class, enable_if_t<Class::has_alias,
int> = 0>
53 constexpr
bool is_alias(
void *) {
return false; }
70 template <
typename Class>
75 template <
typename Class>
78 throw type_error(
"pybind11::init(): unable to convert returned instance to required "
79 "alias class: no `Alias<Class>(Class &&)` constructor available");
84 template <
typename Class>
87 "pybind11::init(): init function must return a compatible pointer, "
95 template <
typename Class>
98 if (Class::has_alias && need_alias && !is_alias<Class>(ptr)) {
109 v_h.
type->init_instance(v_h.
inst,
nullptr);
111 v_h.
type->dealloc(v_h);
123 template <
typename Class, enable_if_t<Class::has_alias,
int> = 0>
132 template <
typename Class>
137 if (Class::has_alias && need_alias && !is_alias<Class>(ptr))
138 throw type_error(
"pybind11::init(): construction failed: returned holder-wrapped instance "
139 "is not an alias instance");
142 v_h.
type->init_instance(v_h.
inst, &holder);
149 template <
typename Class>
152 "pybind11::init() return-by-value factory function requires a movable class");
153 if (Class::has_alias && need_alias)
162 template <
typename Class>
165 "pybind11::init() return-by-alias-value factory function requires a movable alias class");
170 template <
typename... Args>
173 static void execute(Class &cl,
const Extra&... extra) {
175 v_h.value_ptr() = construct_or_initialize<Cpp<Class>>(std::forward<Args>(args)...);
179 template <
typename Class,
typename... Extra,
181 std::is_constructible<Cpp<Class>, Args...>
::value,
int> = 0>
182 static void execute(Class &cl,
const Extra&... extra) {
184 if (Py_TYPE(v_h.inst) == v_h.type->type)
185 v_h.value_ptr() = construct_or_initialize<Cpp<Class>>(std::forward<Args>(args)...);
187 v_h.value_ptr() = construct_or_initialize<Alias<Class>>(std::forward<Args>(args)...);
191 template <
typename Class,
typename... Extra,
193 !std::is_constructible<Cpp<Class>, Args...>
::value,
int> = 0>
194 static void execute(Class &cl,
const Extra&... extra) {
196 v_h.value_ptr() = construct_or_initialize<Alias<Class>>(std::forward<Args>(args)...);
203 template <
typename Class,
typename... Extra,
205 static void execute(Class &cl,
const Extra&... extra) {
207 v_h.value_ptr() = construct_or_initialize<Alias<Class>>(std::forward<Args>(args)...);
213 template <
typename CFunc,
typename AFunc =
void_type (*)(),
218 template <
typename Func,
typename Return,
typename... Args>
222 factory(Func &&f) : class_factory(std::forward<Func>(f)) { }
229 template <
typename Class,
typename... Extra>
230 void execute(Class &cl,
const Extra &...extra) && {
231 #if defined(PYBIND11_CPP14)
232 cl.def(
"__init__", [func =
std::move(class_factory)]
234 auto &func = class_factory;
235 cl.def(
"__init__", [func]
238 construct<Class>(v_h, func(std::forward<Args>(args)...),
239 Py_TYPE(v_h.inst) != v_h.type->type);
245 template <
typename CFunc,
typename AFunc,
246 typename CReturn,
typename... CArgs,
typename AReturn,
typename... AArgs>
247 struct factory<CFunc, AFunc, CReturn(CArgs...), AReturn(AArgs...)> {
248 static_assert(
sizeof...(CArgs) ==
sizeof...(AArgs),
249 "pybind11::init(class_factory, alias_factory): class and alias factories "
250 "must have identical argument signatures");
251 static_assert(
all_of<std::is_same<CArgs, AArgs>...>::
value,
252 "pybind11::init(class_factory, alias_factory): class and alias factories "
253 "must have identical argument signatures");
259 : class_factory(std::forward<CFunc>(c)), alias_factory(std::forward<AFunc>(a)) { }
263 template <
typename Class,
typename... Extra>
264 void execute(Class &cl,
const Extra&... extra) && {
265 static_assert(Class::has_alias,
"The two-argument version of `py::init()` can "
266 "only be used if the class has an alias");
267 #if defined(PYBIND11_CPP14)
268 cl.def(
"__init__", [class_func =
std::move(class_factory), alias_func =
std::move(alias_factory)]
270 auto &class_func = class_factory;
271 auto &alias_func = alias_factory;
272 cl.def(
"__init__", [class_func, alias_func]
275 if (Py_TYPE(v_h.inst) == v_h.type->type)
278 construct<Class>(v_h, class_func(std::forward<CArgs>(args)...), false);
280 construct<Class>(v_h, alias_func(std::forward<CArgs>(args)...), true);
286 template <
typename Class,
typename T>
288 construct<Class>(v_h, std::forward<T>(result), need_alias);
292 template <
typename Class,
typename T,
typename O,
295 construct<Class>(v_h,
std::move(result.first), need_alias);
296 setattr((PyObject *) v_h.
inst,
"__dict__", result.second);
300 template <
typename Get,
typename Set,
304 template <
typename Get,
typename Set,
305 typename RetState,
typename Self,
typename NewInstance,
typename ArgState>
308 "The type returned by `__getstate__` must be the same "
309 "as the argument accepted by `__setstate__`");
315 : get(std::forward<Get>(get)),
set(std::forward<Set>(
set)) { }
317 template <
typename Class,
typename... Extra>
318 void execute(Class &cl,
const Extra &...extra) && {
321 #if defined(PYBIND11_CPP14)
325 cl.def(
"__setstate__", [func]
328 setstate<Class>(v_h, func(std::forward<ArgState>(
state)),
329 Py_TYPE(v_h.
inst) != v_h.
type->type);