31 static constexpr auto name = const_name<value_and_holder>();
41 throw type_error(
"pybind11::init(): factory function returned nullptr");
46template <
typename Class>
47using Cpp =
typename Class::type;
48template <
typename Class>
49using Alias =
typename Class::type_alias;
50template <
typename Class>
51using Holder =
typename Class::holder_type;
53template <
typename Class>
57template <
typename Class, enable_if_t<Class::has_alias,
int> = 0>
72template <
typename Class,
74 detail::enable_if_t<std::is_constructible<Class, Args...>::value,
int> = 0>
76 return new Class(std::forward<Args>(
args)...);
78template <
typename Class,
80 detail::enable_if_t<!std::is_constructible<Class, Args...>::value,
int> = 0>
82 return new Class{std::forward<Args>(
args)...};
90template <
typename Class>
96template <
typename Class>
100 throw type_error(
"pybind11::init(): unable to convert returned instance to required "
101 "alias class: no `Alias<Class>(Class &&)` constructor available");
106template <
typename Class>
108 static_assert(!std::is_same<Class, Class>::value ,
109 "pybind11::init(): init function must return a compatible pointer, "
117template <
typename Class>
121 if (Class::has_alias && need_alias && !is_alias<Class>(ptr)) {
132 v_h.
type->init_instance(v_h.
inst,
nullptr);
134 v_h.
type->dealloc(v_h);
146template <
typename Class, enable_if_t<Class::has_alias,
int> = 0>
156template <
typename Class>
162 if (Class::has_alias && need_alias && !is_alias<Class>(ptr)) {
163 throw type_error(
"pybind11::init(): construction failed: returned holder-wrapped instance "
164 "is not an alias instance");
168 v_h.
type->init_instance(v_h.
inst, &holder);
175template <
typename Class>
178 static_assert(std::is_move_constructible<Cpp<Class>>::value,
179 "pybind11::init() return-by-value factory function requires a movable class");
180 if (Class::has_alias && need_alias) {
190template <
typename Class>
193 std::is_move_constructible<Alias<Class>>::value,
194 "pybind11::init() return-by-alias-value factory function requires a movable alias class");
199template <
typename... Args>
202 static void execute(Class &cl,
const Extra &...extra) {
206 v_h.value_ptr() = construct_or_initialize<Cpp<Class>>(std::forward<Args>(args)...);
217 static void execute(Class &cl,
const Extra &...extra) {
221 if (Py_TYPE(v_h.inst) == v_h.type->type) {
223 = construct_or_initialize<Cpp<Class>>(std::forward<Args>(args)...);
226 = construct_or_initialize<Alias<Class>>(std::forward<Args>(args)...);
238 static void execute(Class &cl,
const Extra &...extra) {
243 = construct_or_initialize<Alias<Class>>(std::forward<Args>(args)...);
251template <
typename... Args>
258 static void execute(Class &cl,
const Extra &...extra) {
263 = construct_or_initialize<Alias<Class>>(std::forward<Args>(args)...);
271template <
typename CFunc,
278template <
typename Func,
typename Return,
typename... Args>
290 template <
typename Class,
typename... Extra>
291 void execute(Class &cl,
const Extra &...extra) && {
292#if defined(PYBIND11_CPP14)
295 [func = std::move(class_factory)]
297 auto &func = class_factory;
304 v_h, func(std::forward<Args>(args)...), Py_TYPE(v_h.inst) != v_h.type->type);
312template <
typename CFunc,
318struct factory<CFunc, AFunc, CReturn(CArgs...), AReturn(AArgs...)> {
319 static_assert(
sizeof...(CArgs) ==
sizeof...(AArgs),
320 "pybind11::init(class_factory, alias_factory): class and alias factories "
321 "must have identical argument signatures");
323 "pybind11::init(class_factory, alias_factory): class and alias factories "
324 "must have identical argument signatures");
330 : class_factory(
std::forward<CFunc>(c)), alias_factory(
std::forward<AFunc>(a)) {}
334 template <
typename Class,
typename... Extra>
335 void execute(Class &cl,
const Extra &...extra) && {
336 static_assert(Class::has_alias,
337 "The two-argument version of `py::init()` can "
338 "only be used if the class has an alias");
339#if defined(PYBIND11_CPP14)
342 [class_func = std::move(class_factory), alias_func = std::move(alias_factory)]
344 auto &class_func = class_factory;
345 auto &alias_func = alias_factory;
348 [class_func, alias_func]
351 if (Py_TYPE(v_h.inst) == v_h.type->type) {
354 construct<Class>(v_h, class_func(std::forward<CArgs>(args)...), false);
356 construct<Class>(v_h, alias_func(std::forward<CArgs>(args)...), true);
365template <
typename Class,
typename T>
367 construct<Class>(v_h, std::forward<T>(result), need_alias);
371template <
typename Class,
376 construct<Class>(v_h, std::move(result.first), need_alias);
377 auto d =
handle(result.second);
378 if (PyDict_Check(d.ptr()) && PyDict_Size(d.ptr()) == 0) {
387template <
typename Get,
393template <
typename Get,
397 typename NewInstance,
399struct pickle_factory<Get, Set, RetState(Self), NewInstance(ArgState)> {
401 "The type returned by `__getstate__` must be the same "
402 "as the argument accepted by `__setstate__`");
409 template <
typename Class,
typename... Extra>
410 void execute(Class &cl,
const Extra &...extra) && {
411 cl.def(
"__getstate__", std::move(get));
413#if defined(PYBIND11_CPP14)
416 [func = std::move(
set)]
425 v_h, func(std::forward<ArgState>(state)), Py_TYPE(v_h.
inst) != v_h.
type->type);
\rst Holds a reference to a Python object (no reference counting)
PyObject * ptr() const
Return the underlying PyObject * pointer.
bool load(handle h, bool)
void setattr(handle obj, handle name, handle value)
typename std::enable_if< B, T >::type enable_if_t
from cpp_future import (convenient aliases from C++14/17)
typename std::remove_reference< T >::type remove_reference_t
typename intrinsic_type< T >::type intrinsic_t
#define PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100(...)
#define PYBIND11_NAMESPACE_END(name)
conditional_t< std::is_function< F >::value, F, typename conditional_t< std::is_pointer< F >::value||std::is_member_pointer< F >::value, std::remove_pointer< F >, strip_function_object< F > >::type > function_signature_t
#define PYBIND11_NAMESPACE_BEGIN(name)
std::is_same< bools< Ts::value..., true >, bools< true, Ts::value... > > all_of
void setstate(value_and_holder &v_h, T &&result, bool need_alias)
Set just the C++ state. Same as __init__.
typename Class::holder_type Holder
typename Class::type_alias Alias
void construct_alias_from_cpp(std::true_type, value_and_holder &v_h, Cpp< Class > &&base)
Class * construct_or_initialize(Args &&...args)
void no_nullptr(void *ptr)
bool is_alias(Cpp< Class > *ptr)
std::is_constructible< Alias< Class >, Cpp< Class > && > is_alias_constructible
#define PYBIND11_WARNING_DISABLE_MSVC(name)
static void execute(Class &cl, const Extra &...extra)
Annotation indicating that a class derives from another given type.
static void execute(Class &cl, const Extra &...extra)
factory(CFunc &&c, AFunc &&a)
void execute(Class &cl, const Extra &...extra) &&
void execute(Class &cl, const Extra &...extra) &&
Helper class which abstracts away certain actions.
Tag for a new-style __init__ defined in detail/init.h
Annotation for function names.
void execute(Class &cl, const Extra &...extra) &&
pickle_factory(Get get, Set set)
Implementation for py::pickle(GetState, SetState)
const detail::type_info * type
void set_instance_registered(bool v=true)
Helper type to replace 'void' in some expressions.