cast.h 47.9 KB
Newer Older
Wenzel Jakob's avatar
Wenzel Jakob committed
1
/*
2
    pybind11/cast.h: Partial template specializations to cast between
Wenzel Jakob's avatar
Wenzel Jakob committed
3
4
    C++ and Python types

5
    Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
Wenzel Jakob's avatar
Wenzel Jakob committed
6
7
8
9
10

    All rights reserved. Use of this source code is governed by a
    BSD-style license that can be found in the LICENSE file.
*/

11
#pragma once
Wenzel Jakob's avatar
Wenzel Jakob committed
12

13
14
#include "pytypes.h"
#include "typeid.h"
15
#include "descr.h"
Wenzel Jakob's avatar
Wenzel Jakob committed
16
#include <array>
Wenzel Jakob's avatar
Wenzel Jakob committed
17
#include <limits>
18
#include <iostream>
Wenzel Jakob's avatar
Wenzel Jakob committed
19

20
NAMESPACE_BEGIN(pybind11)
Wenzel Jakob's avatar
Wenzel Jakob committed
21
22
NAMESPACE_BEGIN(detail)

Wenzel Jakob's avatar
Wenzel Jakob committed
23
24
25
26
27
28
29
30
31
/// Additional type information which does not fit into the PyTypeObject
struct type_info {
    PyTypeObject *type;
    size_t type_size;
    void (*init_holder)(PyObject *, const void *);
    std::vector<PyObject *(*)(PyObject *, PyTypeObject *) > implicit_conversions;
    buffer_info *(*get_buffer)(PyObject *, void *) = nullptr;
    void *get_buffer_data = nullptr;
};
32

Wenzel Jakob's avatar
Wenzel Jakob committed
33
34
35
36
37
PYBIND11_NOINLINE inline internals &get_internals() {
    static internals *internals_ptr = nullptr;
    if (internals_ptr)
        return *internals_ptr;
    handle builtins(PyEval_GetBuiltins());
38
39
    const char *id = PYBIND11_INTERNALS_ID;
    capsule caps(builtins[id]);
Wenzel Jakob's avatar
Wenzel Jakob committed
40
41
42
43
    if (caps.check()) {
        internals_ptr = caps;
    } else {
        internals_ptr = new internals();
44
45
46
47
48
49
50
        #if defined(WITH_THREAD)
            PyEval_InitThreads();
            PyThreadState *tstate = PyThreadState_Get();
            internals_ptr->tstate = PyThread_create_key();
            PyThread_set_key_value(internals_ptr->tstate, tstate);
            internals_ptr->istate = tstate->interp;
        #endif
51
        builtins[id] = capsule(internals_ptr);
52
53
54
55
        internals_ptr->registered_exception_translators.push_front(
            [](std::exception_ptr p) -> void {
                try {
                    if (p) std::rethrow_exception(p);
56
                } catch (error_already_set &e)           { e.restore();                                    return;
57
                } catch (const builtin_exception &e)     { e.set_error();                                  return;
58
59
60
61
62
63
64
65
66
67
68
69
70
                } catch (const std::bad_alloc &e)        { PyErr_SetString(PyExc_MemoryError,   e.what()); return;
                } catch (const std::domain_error &e)     { PyErr_SetString(PyExc_ValueError,    e.what()); return;
                } catch (const std::invalid_argument &e) { PyErr_SetString(PyExc_ValueError,    e.what()); return;
                } catch (const std::length_error &e)     { PyErr_SetString(PyExc_ValueError,    e.what()); return;
                } catch (const std::out_of_range &e)     { PyErr_SetString(PyExc_IndexError,    e.what()); return;
                } catch (const std::range_error &e)      { PyErr_SetString(PyExc_ValueError,    e.what()); return;
                } catch (const std::exception &e)        { PyErr_SetString(PyExc_RuntimeError,  e.what()); return;
                } catch (...) {
                    PyErr_SetString(PyExc_RuntimeError, "Caught an unknown exception!");
                    return;
                }
            }
        );
Wenzel Jakob's avatar
Wenzel Jakob committed
71
72
73
74
    }
    return *internals_ptr;
}

75
PYBIND11_NOINLINE inline detail::type_info* get_type_info(PyTypeObject *type, bool throw_if_missing = true) {
Wenzel Jakob's avatar
Wenzel Jakob committed
76
77
78
79
80
81
    auto const &type_dict = get_internals().registered_types_py;
    do {
        auto it = type_dict.find(type);
        if (it != type_dict.end())
            return (detail::type_info *) it->second;
        type = type->tp_base;
82
83
84
85
86
        if (!type) {
            if (throw_if_missing)
                pybind11_fail("pybind11::detail::get_type_info: unable to find type object!");
            return nullptr;
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
87
88
89
90
91
92
    } while (true);
}

PYBIND11_NOINLINE inline detail::type_info *get_type_info(const std::type_info &tp) {
    auto &types = get_internals().registered_types_cpp;

93
94
    auto it = types.find(std::type_index(tp));
    if (it != types.end())
Wenzel Jakob's avatar
Wenzel Jakob committed
95
96
97
98
99
100
101
102
103
104
        return (detail::type_info *) it->second;
    return nullptr;
}

PYBIND11_NOINLINE inline handle get_type_handle(const std::type_info &tp) {
    detail::type_info *type_info = get_type_info(tp);
    return handle(type_info ? ((PyObject *) type_info->type) : nullptr);
}

PYBIND11_NOINLINE inline std::string error_string() {
105
106
107
108
109
    if (!PyErr_Occurred()) {
        PyErr_SetString(PyExc_RuntimeError, "Unknown internal error occurred");
        return "Unknown internal error occurred";
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
110
    error_scope scope; // Preserve error state
Wenzel Jakob's avatar
Wenzel Jakob committed
111

112
    std::string errorString;
Wenzel Jakob's avatar
Wenzel Jakob committed
113
114
    if (scope.type) {
        errorString += handle(scope.type).attr("__name__").cast<std::string>();
Wenzel Jakob's avatar
Wenzel Jakob committed
115
116
        errorString += ": ";
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
117
118
    if (scope.value)
        errorString += (std::string) handle(scope.value).str();
Wenzel Jakob's avatar
Wenzel Jakob committed
119
120
121
122

    return errorString;
}

123
124
125
126
127
128
129
130
131
PYBIND11_NOINLINE inline handle get_object_handle(const void *ptr, const detail::type_info *type ) {
    auto &instances = get_internals().registered_instances;
    auto range = instances.equal_range(ptr);
    for (auto it = range.first; it != range.second; ++it) {
        auto instance_type = detail::get_type_info(Py_TYPE(it->second), false);
        if (instance_type && instance_type == type)
            return handle((PyObject *) it->second);
    }
    return handle();
Wenzel Jakob's avatar
Wenzel Jakob committed
132
133
}

134
135
136
137
138
139
140
141
142
143
144
145
inline PyThreadState *get_thread_state_unchecked() {
#if   PY_VERSION_HEX < 0x03000000
    return _PyThreadState_Current;
#elif PY_VERSION_HEX < 0x03050000
    return (PyThreadState*) _Py_atomic_load_relaxed(&_PyThreadState_Current);
#elif PY_VERSION_HEX < 0x03050200
    return (PyThreadState*) _PyThreadState_Current.value;
#else
    return _PyThreadState_UncheckedGet();
#endif
}

146
147
148
// Forward declaration
inline void keep_alive_impl(handle nurse, handle patient);

Wenzel Jakob's avatar
Wenzel Jakob committed
149
150
151
152
class type_caster_generic {
public:
    PYBIND11_NOINLINE type_caster_generic(const std::type_info &type_info)
     : typeinfo(get_type_info(type_info)) { }
Wenzel Jakob's avatar
Wenzel Jakob committed
153

Wenzel Jakob's avatar
Wenzel Jakob committed
154
155
    PYBIND11_NOINLINE bool load(handle src, bool convert) {
        if (!src || !typeinfo)
Wenzel Jakob's avatar
Wenzel Jakob committed
156
            return false;
157
        if (src.is_none()) {
158
159
160
            value = nullptr;
            return true;
        } else if (PyType_IsSubtype(Py_TYPE(src.ptr()), typeinfo->type)) {
Wenzel Jakob's avatar
Wenzel Jakob committed
161
            value = ((instance<void> *) src.ptr())->value;
Wenzel Jakob's avatar
Wenzel Jakob committed
162
163
164
165
            return true;
        }
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
Wenzel Jakob's avatar
Wenzel Jakob committed
166
167
                temp = object(converter(src.ptr(), typeinfo->type), false);
                if (load(temp, false))
Wenzel Jakob's avatar
Wenzel Jakob committed
168
169
170
171
172
173
                    return true;
            }
        }
        return false;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
174
175
    PYBIND11_NOINLINE static handle cast(const void *_src, return_value_policy policy, handle parent,
                                         const std::type_info *type_info,
176
                                         const std::type_info *type_info_backup,
Wenzel Jakob's avatar
Wenzel Jakob committed
177
                                         void *(*copy_constructor)(const void *),
Wenzel Jakob's avatar
Wenzel Jakob committed
178
                                         void *(*move_constructor)(const void *),
Wenzel Jakob's avatar
Wenzel Jakob committed
179
                                         const void *existing_holder = nullptr) {
180
        void *src = const_cast<void *>(_src);
Wenzel Jakob's avatar
Wenzel Jakob committed
181
        if (src == nullptr)
Wenzel Jakob's avatar
Wenzel Jakob committed
182
            return none().inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
183

184
        auto &internals = get_internals();
Wenzel Jakob's avatar
Wenzel Jakob committed
185

186
        auto it = internals.registered_types_cpp.find(std::type_index(*type_info));
187
188
189
190
191
        if (it == internals.registered_types_cpp.end()) {
            type_info = type_info_backup;
            it = internals.registered_types_cpp.find(std::type_index(*type_info));
        }

192
        if (it == internals.registered_types_cpp.end()) {
193
194
195
            std::string tname = type_info->name();
            detail::clean_type_id(tname);
            std::string msg = "Unregistered type : " + tname;
Wenzel Jakob's avatar
Wenzel Jakob committed
196
            PyErr_SetString(PyExc_TypeError, msg.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
197
            return handle();
Wenzel Jakob's avatar
Wenzel Jakob committed
198
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
199

200
        auto tinfo = (const detail::type_info *) it->second;
201
202

        auto it_instances = internals.registered_instances.equal_range(src);
Jason Rhinelander's avatar
Jason Rhinelander committed
203
204
        for (auto it_i = it_instances.first; it_i != it_instances.second; ++it_i) {
            auto instance_type = detail::get_type_info(Py_TYPE(it_i->second), false);
205
            if (instance_type && instance_type == tinfo)
Jason Rhinelander's avatar
Jason Rhinelander committed
206
                return handle((PyObject *) it_i->second).inc_ref();
207
208
        }

Wenzel Jakob's avatar
Wenzel Jakob committed
209
210
211
212
213
214
215
        object inst(PyType_GenericAlloc(tinfo->type, 0), false);

        auto wrapper = (instance<void> *) inst.ptr();

        wrapper->value = src;
        wrapper->owned = true;

Wenzel Jakob's avatar
Wenzel Jakob committed
216
217
        if (policy == return_value_policy::automatic)
            policy = return_value_policy::take_ownership;
218
219
        else if (policy == return_value_policy::automatic_reference)
            policy = return_value_policy::reference;
Wenzel Jakob's avatar
Wenzel Jakob committed
220

Wenzel Jakob's avatar
Wenzel Jakob committed
221
        if (policy == return_value_policy::copy) {
222
223
224
            if (copy_constructor)
                wrapper->value = copy_constructor(wrapper->value);
            else
225
                throw cast_error("return_value_policy = copy, but the object is non-copyable!");
Wenzel Jakob's avatar
Wenzel Jakob committed
226
        } else if (policy == return_value_policy::move) {
227
228
229
            if (move_constructor)
                wrapper->value = move_constructor(wrapper->value);
            else if (copy_constructor)
Wenzel Jakob's avatar
Wenzel Jakob committed
230
                wrapper->value = copy_constructor(wrapper->value);
231
            else
Wenzel Jakob's avatar
Wenzel Jakob committed
232
                throw cast_error("return_value_policy = move, but the object is neither movable nor copyable!");
Wenzel Jakob's avatar
Wenzel Jakob committed
233
        } else if (policy == return_value_policy::reference) {
Wenzel Jakob's avatar
Wenzel Jakob committed
234
            wrapper->owned = false;
Wenzel Jakob's avatar
Wenzel Jakob committed
235
        } else if (policy == return_value_policy::reference_internal) {
Wenzel Jakob's avatar
Wenzel Jakob committed
236
            wrapper->owned = false;
237
            detail::keep_alive_impl(inst, parent);
Wenzel Jakob's avatar
Wenzel Jakob committed
238
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
239
240

        tinfo->init_holder(inst.ptr(), existing_holder);
241
242

        internals.registered_instances.emplace(wrapper->value, inst.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
243
244

        return inst.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
245
246
247
248
    }

protected:
    const type_info *typeinfo = nullptr;
249
    void *value = nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
250
251
252
    object temp;
};

253
254
/* Determine suitable casting operator */
template <typename T>
255
using cast_op_type = typename std::conditional<std::is_pointer<typename std::remove_reference<T>::type>::value,
256
257
    typename std::add_pointer<intrinsic_t<T>>::type,
    typename std::add_lvalue_reference<intrinsic_t<T>>::type>::type;
258

259
/// Generic type caster for objects stored on the heap
Wenzel Jakob's avatar
Wenzel Jakob committed
260
template <typename type> class type_caster_base : public type_caster_generic {
261
    using itype = intrinsic_t<type>;
262
public:
263
    static PYBIND11_DESCR name() { return type_descr(_<type>()); }
264

Wenzel Jakob's avatar
Wenzel Jakob committed
265
    type_caster_base() : type_caster_generic(typeid(type)) { }
266

267
    static handle cast(const itype &src, return_value_policy policy, handle parent) {
268
        if (policy == return_value_policy::automatic || policy == return_value_policy::automatic_reference)
269
            policy = return_value_policy::copy;
270
        return cast(&src, policy, parent);
271
272
    }

273
    static handle cast(itype &&src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
274
275
276
277
278
        if (policy == return_value_policy::automatic || policy == return_value_policy::automatic_reference)
            policy = return_value_policy::move;
        return cast(&src, policy, parent);
    }

279
    static handle cast(const itype *src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
280
281
        return type_caster_generic::cast(
            src, policy, parent, src ? &typeid(*src) : nullptr, &typeid(type),
282
            make_copy_constructor(src), make_move_constructor(src));
283
284
    }

285
286
    template <typename T> using cast_op_type = pybind11::detail::cast_op_type<T>;

287
288
    operator itype*() { return (type *) value; }
    operator itype&() { if (!value) throw reference_cast_error(); return *((itype *) value); }
289

290
protected:
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
    typedef void *(*Constructor)(const void *stream);
#if !defined(_MSC_VER)
    /* Only enabled when the types are {copy,move}-constructible *and* when the type
       does not have a private operator new implementaton. */
    template <typename T = type> static auto make_copy_constructor(const T *value) -> decltype(new T(*value), Constructor(nullptr)) {
        return [](const void *arg) -> void * { return new T(*((const T *) arg)); }; }
    template <typename T = type> static auto make_move_constructor(const T *value) -> decltype(new T(std::move(*((T *) value))), Constructor(nullptr)) {
        return [](const void *arg) -> void * { return (void *) new T(std::move(*((T *) arg))); }; }
#else
    /* Visual Studio 2015's SFINAE implementation doesn't yet handle the above robustly in all situations.
       Use a workaround that only tests for constructibility for now. */
    template <typename T = type, typename = typename std::enable_if<std::is_copy_constructible<T>::value>::type>
    static Constructor make_copy_constructor(const T *value) {
        return [](const void *arg) -> void * { return new T(*((const T *)arg)); }; }
    template <typename T = type, typename = typename std::enable_if<std::is_move_constructible<T>::value>::type>
    static Constructor make_move_constructor(const T *value) {
        return [](const void *arg) -> void * { return (void *) new T(std::move(*((T *)arg))); }; }
#endif
    static Constructor make_copy_constructor(...) { return nullptr; }
    static Constructor make_move_constructor(...) { return nullptr; }
311
312
};

Wenzel Jakob's avatar
Wenzel Jakob committed
313
template <typename type, typename SFINAE = void> class type_caster : public type_caster_base<type> { };
314
template <typename type> using make_caster = type_caster<intrinsic_t<type>>;
Wenzel Jakob's avatar
Wenzel Jakob committed
315
316

template <typename type> class type_caster<std::reference_wrapper<type>> : public type_caster_base<type> {
317
318
public:
    static handle cast(const std::reference_wrapper<type> &src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
319
        return type_caster_base<type>::cast(&src.get(), policy, parent);
320
    }
321
322
    template <typename T> using cast_op_type = std::reference_wrapper<type>;
    operator std::reference_wrapper<type>() { return std::ref(*((type *) this->value)); }
323
324
};

325
#define PYBIND11_TYPE_CASTER(type, py_name) \
Wenzel Jakob's avatar
Wenzel Jakob committed
326
327
328
    protected: \
        type value; \
    public: \
329
        static PYBIND11_DESCR name() { return type_descr(py_name); } \
Wenzel Jakob's avatar
Wenzel Jakob committed
330
        static handle cast(const type *src, return_value_policy policy, handle parent) { \
Wenzel Jakob's avatar
Wenzel Jakob committed
331
332
333
            return cast(*src, policy, parent); \
        } \
        operator type*() { return &value; } \
334
        operator type&() { return value; } \
335
        template <typename _T> using cast_op_type = pybind11::detail::cast_op_type<_T>
Wenzel Jakob's avatar
Wenzel Jakob committed
336

337
338
339
340
341
342
343
#define PYBIND11_DECLARE_HOLDER_TYPE(type, holder_type) \
    namespace pybind11 { namespace detail { \
    template <typename type> class type_caster<holder_type> \
        : public type_caster_holder<type, holder_type> { }; \
    }}


Wenzel Jakob's avatar
Wenzel Jakob committed
344
345
346
347
348
349
350
351
template <typename T>
struct type_caster<
    T, typename std::enable_if<std::is_integral<T>::value ||
                               std::is_floating_point<T>::value>::type> {
    typedef typename std::conditional<sizeof(T) <= sizeof(long), long, long long>::type _py_type_0;
    typedef typename std::conditional<std::is_signed<T>::value, _py_type_0, typename std::make_unsigned<_py_type_0>::type>::type _py_type_1;
    typedef typename std::conditional<std::is_floating_point<T>::value, double, _py_type_1>::type py_type;
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
352

Wenzel Jakob's avatar
Wenzel Jakob committed
353
    bool load(handle src, bool) {
Wenzel Jakob's avatar
Wenzel Jakob committed
354
        py_type py_value;
Wenzel Jakob's avatar
Wenzel Jakob committed
355

356
357
358
        if (!src) {
            return false;
        } if (std::is_floating_point<T>::value) {
Wenzel Jakob's avatar
Wenzel Jakob committed
359
            py_value = (py_type) PyFloat_AsDouble(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
360
        } else if (sizeof(T) <= sizeof(long)) {
361
362
            if (PyFloat_Check(src.ptr()))
                return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
363
            if (std::is_signed<T>::value)
Wenzel Jakob's avatar
Wenzel Jakob committed
364
                py_value = (py_type) PyLong_AsLong(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
365
            else
Wenzel Jakob's avatar
Wenzel Jakob committed
366
                py_value = (py_type) PyLong_AsUnsignedLong(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
367
        } else {
368
369
            if (PyFloat_Check(src.ptr()))
                return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
370
            if (std::is_signed<T>::value)
Wenzel Jakob's avatar
Wenzel Jakob committed
371
                py_value = (py_type) PYBIND11_LONG_AS_LONGLONG(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
372
            else
Wenzel Jakob's avatar
Wenzel Jakob committed
373
                py_value = (py_type) PYBIND11_LONG_AS_UNSIGNED_LONGLONG(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
374
375
376
377
378
379
380
381
382
        }

        if ((py_value == (py_type) -1 && PyErr_Occurred()) ||
            (std::is_integral<T>::value && sizeof(py_type) != sizeof(T) &&
               (py_value < (py_type) std::numeric_limits<T>::min() ||
                py_value > (py_type) std::numeric_limits<T>::max()))) {
            PyErr_Clear();
            return false;
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
383

Wenzel Jakob's avatar
Wenzel Jakob committed
384
385
386
387
        value = (T) py_value;
        return true;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
388
    static handle cast(T src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
        if (std::is_floating_point<T>::value) {
            return PyFloat_FromDouble((double) src);
        } else if (sizeof(T) <= sizeof(long)) {
            if (std::is_signed<T>::value)
                return PyLong_FromLong((long) src);
            else
                return PyLong_FromUnsignedLong((unsigned long) src);
        } else {
            if (std::is_signed<T>::value)
                return PyLong_FromLongLong((long long) src);
            else
                return PyLong_FromUnsignedLongLong((unsigned long long) src);
        }
    }

404
    PYBIND11_TYPE_CASTER(T, _<std::is_integral<T>::value>("int", "float"));
Wenzel Jakob's avatar
Wenzel Jakob committed
405
};
Wenzel Jakob's avatar
Wenzel Jakob committed
406

407
template <> class type_caster<void_type> {
Wenzel Jakob's avatar
Wenzel Jakob committed
408
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
409
410
    bool load(handle, bool) { return false; }
    static handle cast(void_type, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
411
        return none().inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
412
    }
413
    PYBIND11_TYPE_CASTER(void_type, _("None"));
Wenzel Jakob's avatar
Wenzel Jakob committed
414
415
};

416
417
418
419
420
template <> class type_caster<void> : public type_caster<void_type> {
public:
    using type_caster<void_type>::cast;

    bool load(handle h, bool) {
421
422
        if (!h) {
            return false;
423
        } else if (h.is_none()) {
424
425
426
            value = nullptr;
            return true;
        }
427
428

        /* Check if this is a capsule */
429
        capsule c(h, true);
430
431
432
433
434
435
436
437
438
439
440
441
442
        if (c.check()) {
            value = (void *) c;
            return true;
        }

        /* Check if this is a C++ type */
        if (get_type_info((PyTypeObject *) h.get_type().ptr(), false)) {
            value = ((instance<void> *) h.ptr())->value;
            return true;
        }

        /* Fail */
        return false;
443
444
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
445
    static handle cast(const void *ptr, return_value_policy /* policy */, handle /* parent */) {
446
447
448
        if (ptr)
            return capsule(ptr).release();
        else
Wenzel Jakob's avatar
Wenzel Jakob committed
449
            return none().inc_ref();
450
    }
451

452
453
    template <typename T> using cast_op_type = void*&;
    operator void *&() { return value; }
454
    static PYBIND11_DESCR name() { return type_descr(_("capsule")); }
455
private:
456
    void *value = nullptr;
457
458
};

Wenzel Jakob's avatar
Wenzel Jakob committed
459
template <> class type_caster<std::nullptr_t> : public type_caster<void_type> { };
460

Wenzel Jakob's avatar
Wenzel Jakob committed
461
462
template <> class type_caster<bool> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
463
    bool load(handle src, bool) {
464
465
        if (!src) return false;
        else if (src.ptr() == Py_True) { value = true; return true; }
Wenzel Jakob's avatar
Wenzel Jakob committed
466
        else if (src.ptr() == Py_False) { value = false; return true; }
Wenzel Jakob's avatar
Wenzel Jakob committed
467
468
        else return false;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
469
470
    static handle cast(bool src, return_value_policy /* policy */, handle /* parent */) {
        return handle(src ? Py_True : Py_False).inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
471
    }
472
    PYBIND11_TYPE_CASTER(bool, _("bool"));
Wenzel Jakob's avatar
Wenzel Jakob committed
473
474
475
476
};

template <> class type_caster<std::string> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
477
    bool load(handle src, bool) {
478
        object temp;
Wenzel Jakob's avatar
Wenzel Jakob committed
479
        handle load_src = src;
480
481
482
        if (!src) {
            return false;
        } else if (PyUnicode_Check(load_src.ptr())) {
Wenzel Jakob's avatar
Wenzel Jakob committed
483
            temp = object(PyUnicode_AsUTF8String(load_src.ptr()), false);
484
            if (!temp) { PyErr_Clear(); return false; }  // UnicodeEncodeError
Wenzel Jakob's avatar
Wenzel Jakob committed
485
            load_src = temp;
486
487
488
        }
        char *buffer;
        ssize_t length;
Wenzel Jakob's avatar
Wenzel Jakob committed
489
        int err = PYBIND11_BYTES_AS_STRING_AND_SIZE(load_src.ptr(), &buffer, &length);
490
        if (err == -1) { PyErr_Clear(); return false; }  // TypeError
491
        value = std::string(buffer, (size_t) length);
492
        success = true;
Wenzel Jakob's avatar
Wenzel Jakob committed
493
494
        return true;
    }
495

Wenzel Jakob's avatar
Wenzel Jakob committed
496
    static handle cast(const std::string &src, return_value_policy /* policy */, handle /* parent */) {
497
        return PyUnicode_FromStringAndSize(src.c_str(), (ssize_t) src.length());
Wenzel Jakob's avatar
Wenzel Jakob committed
498
    }
499
500

    PYBIND11_TYPE_CASTER(std::string, _(PYBIND11_STRING_NAME));
501
502
protected:
    bool success = false;
Wenzel Jakob's avatar
Wenzel Jakob committed
503
504
};

505
template <typename type, typename deleter> class type_caster<std::unique_ptr<type, deleter>> {
506
public:
507
    static handle cast(std::unique_ptr<type, deleter> &&src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
508
        handle result = type_caster_base<type>::cast(src.get(), policy, parent);
509
510
511
512
        if (result)
            src.release();
        return result;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
513
    static PYBIND11_DESCR name() { return type_caster_base<type>::name(); }
514
515
};

hulucc's avatar
hulucc committed
516
template <> class type_caster<std::wstring> {
Wenzel Jakob's avatar
Wenzel Jakob committed
517
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
518
519
520
    bool load(handle src, bool) {
        object temp;
        handle load_src = src;
521
522
523
        if (!src) {
            return false;
        } else if (!PyUnicode_Check(load_src.ptr())) {
Wenzel Jakob's avatar
Wenzel Jakob committed
524
525
526
527
            temp = object(PyUnicode_FromObject(load_src.ptr()), false);
            if (!temp) { PyErr_Clear(); return false; }
            load_src = temp;
        }
528
529
530
531
532
533
534
535
536
537
538
539
        wchar_t *buffer = nullptr;
        ssize_t length = -1;
#if PY_MAJOR_VERSION >= 3
        buffer = PyUnicode_AsWideCharString(load_src.ptr(), &length);
#else
        temp = object(
            sizeof(wchar_t) == sizeof(short)
                ? PyUnicode_AsUTF16String(load_src.ptr())
                : PyUnicode_AsUTF32String(load_src.ptr()), false);
        if (temp) {
            int err = PYBIND11_BYTES_AS_STRING_AND_SIZE(temp.ptr(), (char **) &buffer, &length);
            if (err == -1) { buffer = nullptr; }  // TypeError
540
            length = length / (ssize_t) sizeof(wchar_t) - 1; ++buffer; // Skip BOM
541
        }
542
543
#endif
        if (!buffer) { PyErr_Clear(); return false; }
544
        value = std::wstring(buffer, (size_t) length);
Wenzel Jakob's avatar
Wenzel Jakob committed
545
546
547
        success = true;
        return true;
    }
hulucc's avatar
hulucc committed
548

Wenzel Jakob's avatar
Wenzel Jakob committed
549
    static handle cast(const std::wstring &src, return_value_policy /* policy */, handle /* parent */) {
550
        return PyUnicode_FromWideChar(src.c_str(), (ssize_t) src.length());
Wenzel Jakob's avatar
Wenzel Jakob committed
551
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
552

Wenzel Jakob's avatar
Wenzel Jakob committed
553
    PYBIND11_TYPE_CASTER(std::wstring, _(PYBIND11_STRING_NAME));
554
555
protected:
    bool success = false;
hulucc's avatar
hulucc committed
556
557
};

558
template <> class type_caster<char> : public type_caster<std::string> {
Wenzel Jakob's avatar
Wenzel Jakob committed
559
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
560
    bool load(handle src, bool convert) {
561
        if (src.is_none()) return true;
562
563
564
        return type_caster<std::string>::load(src, convert);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
565
    static handle cast(const char *src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
566
        if (src == nullptr) return none().inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
567
568
569
        return PyUnicode_FromString(src);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
570
    static handle cast(char src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
571
572
573
574
        char str[2] = { src, '\0' };
        return PyUnicode_DecodeLatin1(str, 1, nullptr);
    }

575
    operator char*() { return success ? (char *) value.c_str() : nullptr; }
Wenzel Jakob's avatar
Wenzel Jakob committed
576
    operator char&() { return value[0]; }
577

578
    static PYBIND11_DESCR name() { return type_descr(_(PYBIND11_STRING_NAME)); }
Wenzel Jakob's avatar
Wenzel Jakob committed
579
580
};

581
template <> class type_caster<wchar_t> : public type_caster<std::wstring> {
hulucc's avatar
hulucc committed
582
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
583
    bool load(handle src, bool convert) {
584
        if (src.is_none()) return true;
585
586
587
        return type_caster<std::wstring>::load(src, convert);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
588
    static handle cast(const wchar_t *src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
589
        if (src == nullptr) return none().inc_ref();
590
        return PyUnicode_FromWideChar(src, (ssize_t) wcslen(src));
Wenzel Jakob's avatar
Wenzel Jakob committed
591
    }
hulucc's avatar
hulucc committed
592

Wenzel Jakob's avatar
Wenzel Jakob committed
593
594
595
596
    static handle cast(wchar_t src, return_value_policy /* policy */, handle /* parent */) {
        wchar_t wstr[2] = { src, L'\0' };
        return PyUnicode_FromWideChar(wstr, 1);
    }
hulucc's avatar
hulucc committed
597

598
    operator wchar_t*() { return success ? (wchar_t *) value.c_str() : nullptr; }
Wenzel Jakob's avatar
Wenzel Jakob committed
599
    operator wchar_t&() { return value[0]; }
hulucc's avatar
hulucc committed
600

Wenzel Jakob's avatar
Wenzel Jakob committed
601
    static PYBIND11_DESCR name() { return type_descr(_(PYBIND11_STRING_NAME)); }
hulucc's avatar
hulucc committed
602
603
};

Wenzel Jakob's avatar
Wenzel Jakob committed
604
605
606
template <typename T1, typename T2> class type_caster<std::pair<T1, T2>> {
    typedef std::pair<T1, T2> type;
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
607
    bool load(handle src, bool convert) {
608
609
610
        if (!src)
            return false;
        else if (!PyTuple_Check(src.ptr()) || PyTuple_Size(src.ptr()) != 2)
Wenzel Jakob's avatar
Wenzel Jakob committed
611
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
612
613
        return  first.load(PyTuple_GET_ITEM(src.ptr(), 0), convert) &&
               second.load(PyTuple_GET_ITEM(src.ptr(), 1), convert);
Wenzel Jakob's avatar
Wenzel Jakob committed
614
615
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
616
    static handle cast(const type &src, return_value_policy policy, handle parent) {
617
618
        object o1 = object(make_caster<T1>::cast(src.first, policy, parent), false);
        object o2 = object(make_caster<T2>::cast(src.second, policy, parent), false);
619
        if (!o1 || !o2)
Wenzel Jakob's avatar
Wenzel Jakob committed
620
621
622
623
624
            return handle();
        tuple result(2);
        PyTuple_SET_ITEM(result.ptr(), 0, o1.release().ptr());
        PyTuple_SET_ITEM(result.ptr(), 1, o2.release().ptr());
        return result.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
625
626
    }

627
628
    static PYBIND11_DESCR name() {
        return type_descr(
629
630
            _("Tuple[") + make_caster<T1>::name() + _(", ") + make_caster<T2>::name() + _("]")
        );
Wenzel Jakob's avatar
Wenzel Jakob committed
631
632
    }

633
634
    template <typename T> using cast_op_type = type;

Wenzel Jakob's avatar
Wenzel Jakob committed
635
    operator type() {
636
637
        return type(first.operator typename make_caster<T1>::template cast_op_type<T1>(),
                    second.operator typename make_caster<T2>::template cast_op_type<T2>());
Wenzel Jakob's avatar
Wenzel Jakob committed
638
639
    }
protected:
640
641
    make_caster<T1> first;
    make_caster<T2> second;
Wenzel Jakob's avatar
Wenzel Jakob committed
642
643
};

644
template <typename... Tuple> class type_caster<std::tuple<Tuple...>> {
Wenzel Jakob's avatar
Wenzel Jakob committed
645
    typedef std::tuple<Tuple...> type;
646
    typedef std::tuple<intrinsic_t<Tuple>...> itype;
647
648
    typedef std::tuple<args> args_type;
    typedef std::tuple<args, kwargs> args_kwargs_type;
Wenzel Jakob's avatar
Wenzel Jakob committed
649
650
651
public:
    enum { size = sizeof...(Tuple) };

652
653
654
    static constexpr const bool has_kwargs = std::is_same<itype, args_kwargs_type>::value;
    static constexpr const bool has_args = has_kwargs || std::is_same<itype, args_type>::value;

Wenzel Jakob's avatar
Wenzel Jakob committed
655
    bool load(handle src, bool convert) {
656
657
        if (!src || !PyTuple_Check(src.ptr()) || PyTuple_GET_SIZE(src.ptr()) != size)
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
658
        return load(src, convert, typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
659
660
    }

661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
    template <typename T = itype, typename std::enable_if<
        !std::is_same<T, args_type>::value &&
        !std::is_same<T, args_kwargs_type>::value, int>::type = 0>
    bool load_args(handle args, handle, bool convert) {
        return load(args, convert, typename make_index_sequence<sizeof...(Tuple)>::type());
    }

    template <typename T = itype, typename std::enable_if<std::is_same<T, args_type>::value, int>::type = 0>
    bool load_args(handle args, handle, bool convert) {
        std::get<0>(value).load(args, convert);
        return true;
    }

    template <typename T = itype, typename std::enable_if<std::is_same<T, args_kwargs_type>::value, int>::type = 0>
    bool load_args(handle args, handle kwargs, bool convert) {
        std::get<0>(value).load(args, convert);
        std::get<1>(value).load(kwargs, convert);
        return true;
    }
680

Wenzel Jakob's avatar
Wenzel Jakob committed
681
    static handle cast(const type &src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
682
        return cast(src, policy, parent, typename make_index_sequence<size>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
683
684
    }

685
    static PYBIND11_DESCR element_names() {
686
        return detail::concat(make_caster<Tuple>::name()...);
687
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
688

689
    static PYBIND11_DESCR name() {
690
        return type_descr(_("Tuple[") + element_names() + _("]"));
Wenzel Jakob's avatar
Wenzel Jakob committed
691
692
    }

693
694
    template <typename ReturnValue, typename Func> typename std::enable_if<!std::is_void<ReturnValue>::value, ReturnValue>::type call(Func &&f) {
        return call<ReturnValue>(std::forward<Func>(f), typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
695
696
    }

697
    template <typename ReturnValue, typename Func> typename std::enable_if<std::is_void<ReturnValue>::value, void_type>::type call(Func &&f) {
698
        call<ReturnValue>(std::forward<Func>(f), typename make_index_sequence<sizeof...(Tuple)>::type());
699
        return void_type();
Wenzel Jakob's avatar
Wenzel Jakob committed
700
701
    }

702
703
    template <typename T> using cast_op_type = type;

Wenzel Jakob's avatar
Wenzel Jakob committed
704
    operator type() {
Wenzel Jakob's avatar
Wenzel Jakob committed
705
        return cast(typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
706
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
707

Wenzel Jakob's avatar
Wenzel Jakob committed
708
protected:
709
    template <typename ReturnValue, typename Func, size_t ... Index> ReturnValue call(Func &&f, index_sequence<Index...>) {
710
        return f(std::get<Index>(value)
711
            .operator typename make_caster<Tuple>::template cast_op_type<Tuple>()...);
Wenzel Jakob's avatar
Wenzel Jakob committed
712
713
714
    }

    template <size_t ... Index> type cast(index_sequence<Index...>) {
715
        return type(std::get<Index>(value)
716
            .operator typename make_caster<Tuple>::template cast_op_type<Tuple>()...);
Wenzel Jakob's avatar
Wenzel Jakob committed
717
718
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
719
720
    template <size_t ... Indices> bool load(handle src, bool convert, index_sequence<Indices...>) {
        std::array<bool, size> success {{
721
            std::get<Indices>(value).load(PyTuple_GET_ITEM(src.ptr(), Indices), convert)...
Wenzel Jakob's avatar
Wenzel Jakob committed
722
        }};
723
        (void) convert; /* avoid a warning when the tuple is empty */
Wenzel Jakob's avatar
Wenzel Jakob committed
724
        for (bool r : success)
Wenzel Jakob's avatar
Wenzel Jakob committed
725
726
727
728
729
730
            if (!r)
                return false;
        return true;
    }

    /* Implementation: Convert a C++ tuple into a Python tuple */
Wenzel Jakob's avatar
Wenzel Jakob committed
731
732
    template <size_t ... Indices> static handle cast(const type &src, return_value_policy policy, handle parent, index_sequence<Indices...>) {
        std::array<object, size> entries {{
733
            object(make_caster<Tuple>::cast(std::get<Indices>(src), policy, parent), false)...
Wenzel Jakob's avatar
Wenzel Jakob committed
734
        }};
Wenzel Jakob's avatar
Wenzel Jakob committed
735
736
737
738
        for (const auto &entry: entries)
            if (!entry)
                return handle();
        tuple result(size);
739
        int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
740
741
742
        for (auto & entry: entries)
            PyTuple_SET_ITEM(result.ptr(), counter++, entry.release().ptr());
        return result.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
743
744
745
    }

protected:
746
    std::tuple<make_caster<Tuple>...> value;
Wenzel Jakob's avatar
Wenzel Jakob committed
747
748
749
};

/// Type caster for holder types like std::shared_ptr, etc.
Wenzel Jakob's avatar
Wenzel Jakob committed
750
template <typename type, typename holder_type> class type_caster_holder : public type_caster_base<type> {
Wenzel Jakob's avatar
Wenzel Jakob committed
751
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
752
753
754
755
    using type_caster_base<type>::cast;
    using type_caster_base<type>::typeinfo;
    using type_caster_base<type>::value;
    using type_caster_base<type>::temp;
756

Wenzel Jakob's avatar
Wenzel Jakob committed
757
    bool load(handle src, bool convert) {
758
        if (!src || !typeinfo) {
Wenzel Jakob's avatar
Wenzel Jakob committed
759
            return false;
760
        } else if (src.is_none()) {
761
762
763
            value = nullptr;
            return true;
        } else if (PyType_IsSubtype(Py_TYPE(src.ptr()), typeinfo->type)) {
Wenzel Jakob's avatar
Wenzel Jakob committed
764
            auto inst = (instance<type, holder_type> *) src.ptr();
765
            value = (void *) inst->value;
766
767
768
            holder = inst->holder;
            return true;
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
769

770
771
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
Wenzel Jakob's avatar
Wenzel Jakob committed
772
773
                temp = object(converter(src.ptr(), typeinfo->type), false);
                if (load(temp, false))
774
775
776
777
                    return true;
            }
        }
        return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
778
    }
779

Wenzel Jakob's avatar
Wenzel Jakob committed
780
781
782
    explicit operator type*() { return this->value; }
    explicit operator type&() { return *(this->value); }
    explicit operator holder_type*() { return &holder; }
783

784
785
786
787
788
789
790
791
    // Workaround for Intel compiler bug
    // see pybind11 issue 94
    #if defined(__ICC) || defined(__INTEL_COMPILER)
    operator holder_type&() { return holder; }
    #else
    explicit operator holder_type&() { return holder; }
    #endif

792
    static handle cast(const holder_type &src, return_value_policy, handle) {
793
        return type_caster_generic::cast(
794
            src.get(), return_value_policy::take_ownership, handle(),
795
            src.get() ? &typeid(*src.get()) : nullptr, &typeid(type),
796
            nullptr, nullptr, &src);
797
798
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
799
800
801
802
protected:
    holder_type holder;
};

803
// PYBIND11_DECLARE_HOLDER_TYPE holder types:
804
template <typename base, typename holder> struct is_holder_type :
805
806
807
808
    std::is_base_of<detail::type_caster_holder<base, holder>, detail::type_caster<holder>> {};
// Specialization for always-supported unique_ptr holders:
template <typename base, typename deleter> struct is_holder_type<base, std::unique_ptr<base, deleter>> :
    std::true_type {};
809

810
811
template <typename T> struct handle_type_name { static PYBIND11_DESCR name() { return _<T>(); } };
template <> struct handle_type_name<bytes> { static PYBIND11_DESCR name() { return _(PYBIND11_BYTES_NAME); } };
812
813
template <> struct handle_type_name<args> { static PYBIND11_DESCR name() { return _("*args"); } };
template <> struct handle_type_name<kwargs> { static PYBIND11_DESCR name() { return _("**kwargs"); } };
814

815
816
template <typename type>
struct type_caster<type, typename std::enable_if<std::is_base_of<handle, type>::value>::type> {
Wenzel Jakob's avatar
Wenzel Jakob committed
817
public:
818
819
    template <typename T = type, typename std::enable_if<!std::is_base_of<object, T>::value, int>::type = 0>
    bool load(handle src, bool /* convert */) { value = type(src); return value.check(); }
820

821
    template <typename T = type, typename std::enable_if<std::is_base_of<object, T>::value, int>::type = 0>
Wenzel Jakob's avatar
Wenzel Jakob committed
822
    bool load(handle src, bool /* convert */) { value = type(src, true); return value.check(); }
823

Wenzel Jakob's avatar
Wenzel Jakob committed
824
825
    static handle cast(const handle &src, return_value_policy /* policy */, handle /* parent */) {
        return src.inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
826
    }
827
    PYBIND11_TYPE_CASTER(type, handle_type_name<type>::name());
Wenzel Jakob's avatar
Wenzel Jakob committed
828
829
};

830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
// Our conditions for enabling moving are quite restrictive:
// At compile time:
// - T needs to be a non-const, non-pointer, non-reference type
// - type_caster<T>::operator T&() must exist
// - the type must be move constructible (obviously)
// At run-time:
// - if the type is non-copy-constructible, the object must be the sole owner of the type (i.e. it
//   must have ref_count() == 1)h
// If any of the above are not satisfied, we fall back to copying.
template <typename T, typename SFINAE = void> struct move_is_plain_type : std::false_type {};
template <typename T> struct move_is_plain_type<T, typename std::enable_if<
        !std::is_void<T>::value && !std::is_pointer<T>::value && !std::is_reference<T>::value && !std::is_const<T>::value
    >::type> : std::true_type {};
template <typename T, typename SFINAE = void> struct move_always : std::false_type {};
template <typename T> struct move_always<T, typename std::enable_if<
        move_is_plain_type<T>::value &&
        !std::is_copy_constructible<T>::value && std::is_move_constructible<T>::value &&
        std::is_same<decltype(std::declval<type_caster<T>>().operator T&()), T&>::value
    >::type> : std::true_type {};
template <typename T, typename SFINAE = void> struct move_if_unreferenced : std::false_type {};
template <typename T> struct move_if_unreferenced<T, typename std::enable_if<
        move_is_plain_type<T>::value &&
        !move_always<T>::value && std::is_move_constructible<T>::value &&
        std::is_same<decltype(std::declval<type_caster<T>>().operator T&()), T&>::value
    >::type> : std::true_type {};
template <typename T> using move_never = std::integral_constant<bool, !move_always<T>::value && !move_if_unreferenced<T>::value>;

857
858
859
860
861
862
863
864
865
// Detect whether returning a `type` from a cast on type's type_caster is going to result in a
// reference or pointer to a local variable of the type_caster.  Basically, only
// non-reference/pointer `type`s and reference/pointers from a type_caster_generic are safe;
// everything else returns a reference/pointer to a local variable.
template <typename type> using cast_is_temporary_value_reference = bool_constant<
    (std::is_reference<type>::value || std::is_pointer<type>::value) &&
    !std::is_base_of<type_caster_generic, make_caster<type>>::value
>;

866
// Basic python -> C++ casting; throws if casting fails
Jason Rhinelander's avatar
Jason Rhinelander committed
867
template <typename T, typename SFINAE> type_caster<T, SFINAE> &load_type(type_caster<T, SFINAE> &conv, const handle &handle) {
868
869
870
871
872
873
874
875
    if (!conv.load(handle, true)) {
#if defined(NDEBUG)
        throw cast_error("Unable to cast Python instance to C++ type (compile in debug mode for details)");
#else
        throw cast_error("Unable to cast Python instance of type " +
            (std::string) handle.get_type().str() + " to C++ type '" + type_id<T>() + "''");
#endif
    }
876
877
    return conv;
}
878
879
880
881
882
883
// Wrapper around the above that also constructs and returns a type_caster
template <typename T> make_caster<T> load_type(const handle &handle) {
    make_caster<T> conv;
    load_type(conv, handle);
    return conv;
}
884
885
886
887
888
889
890
891

NAMESPACE_END(detail)

template <typename T> T cast(const handle &handle) {
    static_assert(!detail::cast_is_temporary_value_reference<T>::value,
            "Unable to cast type to reference: value is local to type caster");
    using type_caster = detail::make_caster<T>;
    return detail::load_type<T>(handle).operator typename type_caster::template cast_op_type<T>();
Wenzel Jakob's avatar
Wenzel Jakob committed
892
893
}

894
895
896
template <typename T> object cast(const T &value,
        return_value_policy policy = return_value_policy::automatic_reference,
        handle parent = handle()) {
Wenzel Jakob's avatar
Wenzel Jakob committed
897
898
    if (policy == return_value_policy::automatic)
        policy = std::is_pointer<T>::value ? return_value_policy::take_ownership : return_value_policy::copy;
899
900
    else if (policy == return_value_policy::automatic_reference)
        policy = std::is_pointer<T>::value ? return_value_policy::reference : return_value_policy::copy;
901
    return object(detail::make_caster<T>::cast(value, policy, parent), false);
Wenzel Jakob's avatar
Wenzel Jakob committed
902
903
}

Wenzel Jakob's avatar
Wenzel Jakob committed
904
template <typename T> T handle::cast() const { return pybind11::cast<T>(*this); }
905
template <> inline void handle::cast() const { return; }
Wenzel Jakob's avatar
Wenzel Jakob committed
906

907
template <typename T>
908
detail::enable_if_t<detail::move_always<T>::value || detail::move_if_unreferenced<T>::value, T> move(object &&obj) {
909
910
911
912
913
914
915
916
917
918
    if (obj.ref_count() > 1)
#if defined(NDEBUG)
        throw cast_error("Unable to cast Python instance to C++ rvalue: instance has multiple references"
            " (compile in debug mode for details)");
#else
        throw cast_error("Unable to move from Python " + (std::string) obj.get_type().str() +
                " instance to C++ " + type_id<T>() + " instance: instance has multiple references");
#endif

    // Move into a temporary and return that, because the reference may be a local value of `conv`
919
    T ret = std::move(detail::load_type<T>(obj).operator T&());
920
921
922
923
924
925
926
927
    return ret;
}

// Calling cast() on an rvalue calls pybind::cast with the object rvalue, which does:
// - If we have to move (because T has no copy constructor), do it.  This will fail if the moved
//   object has multiple references, but trying to copy will fail to compile.
// - If both movable and copyable, check ref count: if 1, move; otherwise copy
// - Otherwise (not movable), copy.
928
template <typename T> detail::enable_if_t<detail::move_always<T>::value, T> cast(object &&object) {
929
930
    return move<T>(std::move(object));
}
931
template <typename T> detail::enable_if_t<detail::move_if_unreferenced<T>::value, T> cast(object &&object) {
932
933
934
935
936
    if (object.ref_count() > 1)
        return cast<T>(object);
    else
        return move<T>(std::move(object));
}
937
template <typename T> detail::enable_if_t<detail::move_never<T>::value, T> cast(object &&object) {
938
939
940
941
942
943
944
945
    return cast<T>(object);
}

template <typename T> T object::cast() const & { return pybind11::cast<T>(*this); }
template <typename T> T object::cast() && { return pybind11::cast<T>(std::move(*this)); }
template <> inline void object::cast() const & { return; }
template <> inline void object::cast() && { return; }

946
947
NAMESPACE_BEGIN(detail)

948
949
950
struct overload_unused {}; // Placeholder type for the unneeded (and dead code) static variable in the OVERLOAD_INT macro
template <typename ret_type> using overload_caster_t = conditional_t<
    cast_is_temporary_value_reference<ret_type>::value, make_caster<ret_type>, overload_unused>;
951
952
953

// Trampoline use: for reference/pointer types to value-converted values, we do a value cast, then
// store the result in the given variable.  For other types, this is a no-op.
954
955
template <typename T> enable_if_t<cast_is_temporary_value_reference<T>::value, T> cast_ref(object &&o, make_caster<T> &caster) {
    return load_type(caster, o).operator typename make_caster<T>::template cast_op_type<T>();
956
}
957
template <typename T> enable_if_t<!cast_is_temporary_value_reference<T>::value, T> cast_ref(object &&, overload_unused &) {
958
959
960
961
962
963
964
965
966
967
968
969
    pybind11_fail("Internal error: cast_ref fallback invoked"); }

// Trampoline use: Having a pybind11::cast with an invalid reference type is going to static_assert, even
// though if it's in dead code, so we provide a "trampoline" to pybind11::cast that only does anything in
// cases where pybind11::cast is valid.
template <typename T> enable_if_t<!cast_is_temporary_value_reference<T>::value, T> cast_safe(object &&o) {
    return pybind11::cast<T>(std::move(o)); }
template <typename T> enable_if_t<cast_is_temporary_value_reference<T>::value, T> cast_safe(object &&) {
    pybind11_fail("Internal error: cast_safe fallback invoked"); }
template <> inline void cast_safe<void>(object &&) {}

NAMESPACE_END(detail)
970
971


972
template <return_value_policy policy = return_value_policy::automatic_reference,
Wenzel Jakob's avatar
Wenzel Jakob committed
973
          typename... Args> tuple make_tuple(Args&&... args_) {
Wenzel Jakob's avatar
Wenzel Jakob committed
974
    const size_t size = sizeof...(Args);
Wenzel Jakob's avatar
Wenzel Jakob committed
975
    std::array<object, size> args {
976
        { object(detail::make_caster<Args>::cast(
977
            std::forward<Args>(args_), policy, nullptr), false)... }
Wenzel Jakob's avatar
Wenzel Jakob committed
978
    };
979
980
981
982
983
984
985
986
987
988
    for (auto &arg_value : args) {
        if (!arg_value) {
#if defined(NDEBUG)
            throw cast_error("make_tuple(): unable to convert arguments to Python object (compile in debug mode for details)");
#else
            throw cast_error("make_tuple(): unable to convert arguments of types '" +
                (std::string) type_id<std::tuple<Args...>>() + "' to Python object");
#endif
        }
    }
989
    tuple result(size);
Wenzel Jakob's avatar
Wenzel Jakob committed
990
    int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
991
    for (auto &arg_value : args)
992
993
994
995
        PyTuple_SET_ITEM(result.ptr(), counter++, arg_value.release().ptr());
    return result;
}

996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
/// Annotation for keyword arguments
struct arg {
    constexpr explicit arg(const char *name) : name(name) { }
    template <typename T> arg_v operator=(T &&value) const;

    const char *name;
};

/// Annotation for keyword arguments with values
struct arg_v : arg {
    template <typename T>
    arg_v(const char *name, T &&x, const char *descr = nullptr)
        : arg(name),
          value(detail::make_caster<T>::cast(x, return_value_policy::automatic, handle()), false),
          descr(descr)
#if !defined(NDEBUG)
        , type(type_id<T>())
#endif
    { }

    object value;
    const char *descr;
#if !defined(NDEBUG)
    std::string type;
#endif
};

template <typename T>
arg_v arg::operator=(T &&value) const { return {name, std::forward<T>(value)}; }

/// Alias for backward compatibility -- to be remove in version 2.0
template <typename /*unused*/> using arg_t = arg_v;

inline namespace literals {
/// String literal version of arg
constexpr arg operator"" _a(const char *name, size_t) { return arg(name); }
}

1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
NAMESPACE_BEGIN(detail)
NAMESPACE_BEGIN(constexpr_impl)
/// Implementation details for constexpr functions
constexpr int first(int i) { return i; }
template <typename T, typename... Ts>
constexpr int first(int i, T v, Ts... vs) { return v ? i : first(i + 1, vs...); }

constexpr int last(int /*i*/, int result) { return result; }
template <typename T, typename... Ts>
constexpr int last(int i, int result, T v, Ts... vs) { return last(i + 1, v ? i : result, vs...); }
NAMESPACE_END(constexpr_impl)

/// Return the index of the first type in Ts which satisfies Predicate<T>
template <template<typename> class Predicate, typename... Ts>
constexpr int constexpr_first() { return constexpr_impl::first(0, Predicate<Ts>::value...); }

/// Return the index of the last type in Ts which satisfies Predicate<T>
template <template<typename> class Predicate, typename... Ts>
constexpr int constexpr_last() { return constexpr_impl::last(0, -1, Predicate<Ts>::value...); }

/// Helper class which collects only positional arguments for a Python function call.
/// A fancier version below can collect any argument, but this one is optimal for simple calls.
template <return_value_policy policy>
class simple_collector {
public:
    template <typename... Ts>
    simple_collector(Ts &&...values)
        : m_args(pybind11::make_tuple<policy>(std::forward<Ts>(values)...)) { }

    const tuple &args() const & { return m_args; }
    dict kwargs() const { return {}; }

    tuple args() && { return std::move(m_args); }

    /// Call a Python function and pass the collected arguments
    object call(PyObject *ptr) const {
        auto result = object(PyObject_CallObject(ptr, m_args.ptr()), false);
        if (!result)
            throw error_already_set();
        return result;
    }

private:
    tuple m_args;
};

/// Helper class which collects positional, keyword, * and ** arguments for a Python function call
template <return_value_policy policy>
class unpacking_collector {
public:
    template <typename... Ts>
    unpacking_collector(Ts &&...values) {
        // Tuples aren't (easily) resizable so a list is needed for collection,
        // but the actual function call strictly requires a tuple.
        auto args_list = list();
        int _[] = { 0, (process(args_list, std::forward<Ts>(values)), 0)... };
        ignore_unused(_);

        m_args = object(PyList_AsTuple(args_list.ptr()), false);
    }

    const tuple &args() const & { return m_args; }
    const dict &kwargs() const & { return m_kwargs; }

    tuple args() && { return std::move(m_args); }
    dict kwargs() && { return std::move(m_kwargs); }

    /// Call a Python function and pass the collected arguments
    object call(PyObject *ptr) const {
        auto result = object(PyObject_Call(ptr, m_args.ptr(), m_kwargs.ptr()), false);
        if (!result)
            throw error_already_set();
        return result;
    }

private:
    template <typename T>
    void process(list &args_list, T &&x) {
        auto o = object(detail::make_caster<T>::cast(std::forward<T>(x), policy, nullptr), false);
        if (!o) {
#if defined(NDEBUG)
            argument_cast_error();
#else
            argument_cast_error(std::to_string(args_list.size()), type_id<T>());
#endif
        }
        args_list.append(o);
    }

    void process(list &args_list, detail::args_proxy ap) {
        for (const auto &a : ap) {
            args_list.append(a.cast<object>());
        }
    }

1129
    void process(list &/*args_list*/, arg_v a) {
1130
1131
1132
1133
1134
1135
1136
        if (m_kwargs[a.name]) {
#if defined(NDEBUG)
            multiple_values_error();
#else
            multiple_values_error(a.name);
#endif
        }
1137
        if (!a.value) {
1138
1139
1140
#if defined(NDEBUG)
            argument_cast_error();
#else
1141
            argument_cast_error(a.name, a.type);
1142
1143
#endif
        }
1144
        m_kwargs[a.name] = a.value;
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
    }

    void process(list &/*args_list*/, detail::kwargs_proxy kp) {
        for (const auto &k : dict(kp, true)) {
            if (m_kwargs[k.first]) {
#if defined(NDEBUG)
                multiple_values_error();
#else
                multiple_values_error(k.first.str());
#endif
            }
            m_kwargs[k.first] = k.second;
        }
    }

    [[noreturn]] static void multiple_values_error() {
        throw type_error("Got multiple values for keyword argument "
                         "(compile in debug mode for details)");
    }

    [[noreturn]] static void multiple_values_error(std::string name) {
        throw type_error("Got multiple values for keyword argument '" + name + "'");
    }

    [[noreturn]] static void argument_cast_error() {
        throw cast_error("Unable to convert call argument to Python object "
                         "(compile in debug mode for details)");
    }

    [[noreturn]] static void argument_cast_error(std::string name, std::string type) {
        throw cast_error("Unable to convert call argument '" + name
                         + "' of type '" + type + "' to Python object");
    }

private:
    tuple m_args;
    dict m_kwargs;
};

/// Collect only positional arguments for a Python function call
template <return_value_policy policy, typename... Args,
          typename = enable_if_t<all_of_t<is_positional, Args...>::value>>
simple_collector<policy> collect_arguments(Args &&...args) {
    return {std::forward<Args>(args)...};
}

/// Collect all arguments, including keywords and unpacking (only instantiated when needed)
template <return_value_policy policy, typename... Args,
          typename = enable_if_t<!all_of_t<is_positional, Args...>::value>>
unpacking_collector<policy> collect_arguments(Args &&...args) {
    // Following argument order rules for generalized unpacking according to PEP 448
    static_assert(
        constexpr_last<is_positional, Args...>() < constexpr_first<is_keyword_or_ds, Args...>()
        && constexpr_last<is_s_unpacking, Args...>() < constexpr_first<is_ds_unpacking, Args...>(),
        "Invalid function call: positional args must precede keywords and ** unpacking; "
        "* unpacking must precede ** unpacking"
    );
    return {std::forward<Args>(args)...};
}

NAMESPACE_END(detail)

template <return_value_policy policy, typename... Args>
object handle::operator()(Args &&...args) const {
    return detail::collect_arguments<policy>(std::forward<Args>(args)...).call(m_ptr);
Wenzel Jakob's avatar
Wenzel Jakob committed
1210
1211
}

1212
1213
1214
template <return_value_policy policy,
          typename... Args> object handle::call(Args &&... args) const {
    return operator()<policy>(std::forward<Args>(args)...);
1215
1216
}

Wenzel Jakob's avatar
Wenzel Jakob committed
1217
1218
1219
1220
1221
#define PYBIND11_MAKE_OPAQUE(Type) \
    namespace pybind11 { namespace detail { \
        template<> class type_caster<Type> : public type_caster_base<Type> { }; \
    }}

1222
NAMESPACE_END(pybind11)