cast.h 39.6 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
56
57
        internals_ptr->registered_exception_translators.push_front(
            [](std::exception_ptr p) -> void {
                try {
                    if (p) std::rethrow_exception(p);
                } catch (const error_already_set &)      {                                                 return;
                } catch (const index_error &e)           { PyErr_SetString(PyExc_IndexError,    e.what()); return;
58
                } catch (const key_error &e)             { PyErr_SetString(PyExc_KeyError,      e.what()); return;
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
                } catch (const value_error &e)           { PyErr_SetString(PyExc_ValueError,    e.what()); return;
                } catch (const stop_iteration &e)        { PyErr_SetString(PyExc_StopIteration, e.what()); return;
                } 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
74
75
76
77
    }
    return *internals_ptr;
}

78
PYBIND11_NOINLINE inline detail::type_info* get_type_info(PyTypeObject *type, bool throw_if_missing = true) {
Wenzel Jakob's avatar
Wenzel Jakob committed
79
80
81
82
83
84
    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;
85
86
87
88
89
        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
90
91
92
93
94
95
    } while (true);
}

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

96
97
    auto it = types.find(std::type_index(tp));
    if (it != types.end())
Wenzel Jakob's avatar
Wenzel Jakob committed
98
99
100
101
102
103
104
105
106
107
        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() {
108
109
   PyObject *type, *value, *traceback;
   PyErr_Fetch(&type, &value, &traceback);
Wenzel Jakob's avatar
Wenzel Jakob committed
110

111
112
113
   std::string errorString;
    if (type) {
        errorString += (std::string) handle(type).str();
Wenzel Jakob's avatar
Wenzel Jakob committed
114
115
        errorString += ": ";
    }
116
117
    if (value)
        errorString += (std::string) handle(value).str();
Wenzel Jakob's avatar
Wenzel Jakob committed
118

119
    PyErr_Restore(type, value, traceback);
Wenzel Jakob's avatar
Wenzel Jakob committed
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
158
159
160
        if (src.ptr() == Py_None) {
            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
182
183
        if (src == nullptr)
            return handle(Py_None).inc_ref();

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

        tinfo->init_holder(inst.ptr(), existing_holder);
239
240

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

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

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

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

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

Wenzel Jakob's avatar
Wenzel Jakob committed
262
    type_caster_base() : type_caster_generic(typeid(type)) { }
263

Wenzel Jakob's avatar
Wenzel Jakob committed
264
    static handle cast(const type &src, return_value_policy policy, handle parent) {
265
        if (policy == return_value_policy::automatic || policy == return_value_policy::automatic_reference)
266
            policy = return_value_policy::copy;
267
        return cast(&src, policy, parent);
268
269
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
270
271
272
273
274
275
    static handle cast(type &&src, return_value_policy policy, handle parent) {
        if (policy == return_value_policy::automatic || policy == return_value_policy::automatic_reference)
            policy = return_value_policy::move;
        return cast(&src, policy, parent);
    }

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

282
283
    template <typename T> using cast_op_type = pybind11::detail::cast_op_type<T>;

284
    operator type*() { return (type *) value; }
285
    operator type&() { if (!value) throw reference_cast_error(); return *((type *) value); }
286

287
protected:
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
    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; }
308
309
};

Wenzel Jakob's avatar
Wenzel Jakob committed
310
311
312
template <typename type, typename SFINAE = void> class type_caster : public type_caster_base<type> { };

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

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

333
334
335
336
337
338
339
#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
340
341
342
343
344
345
346
347
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
348

Wenzel Jakob's avatar
Wenzel Jakob committed
349
    bool load(handle src, bool) {
Wenzel Jakob's avatar
Wenzel Jakob committed
350
        py_type py_value;
Wenzel Jakob's avatar
Wenzel Jakob committed
351

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

        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
379

Wenzel Jakob's avatar
Wenzel Jakob committed
380
381
382
383
        value = (T) py_value;
        return true;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
384
    static handle cast(T src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
        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);
        }
    }

400
    PYBIND11_TYPE_CASTER(T, _<std::is_integral<T>::value>("int", "float"));
Wenzel Jakob's avatar
Wenzel Jakob committed
401
};
Wenzel Jakob's avatar
Wenzel Jakob committed
402

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

412
413
414
415
416
template <> class type_caster<void> : public type_caster<void_type> {
public:
    using type_caster<void_type>::cast;

    bool load(handle h, bool) {
417
418
419
        if (!h) {
            return false;
        } else if (h.ptr() == Py_None) {
420
421
422
            value = nullptr;
            return true;
        }
423
424

        /* Check if this is a capsule */
425
        capsule c(h, true);
426
427
428
429
430
431
432
433
434
435
436
437
438
        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;
439
440
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
441
    static handle cast(const void *ptr, return_value_policy /* policy */, handle /* parent */) {
442
443
444
445
        if (ptr)
            return capsule(ptr).release();
        else
            return handle(Py_None).inc_ref();
446
    }
447

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

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

Wenzel Jakob's avatar
Wenzel Jakob committed
457
458
template <> class type_caster<bool> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
459
    bool load(handle src, bool) {
460
461
        if (!src) return false;
        else if (src.ptr() == Py_True) { value = true; return true; }
Wenzel Jakob's avatar
Wenzel Jakob committed
462
        else if (src.ptr() == Py_False) { value = false; return true; }
Wenzel Jakob's avatar
Wenzel Jakob committed
463
464
        else return false;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
465
466
    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
467
    }
468
    PYBIND11_TYPE_CASTER(bool, _("bool"));
Wenzel Jakob's avatar
Wenzel Jakob committed
469
470
471
472
};

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

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

    PYBIND11_TYPE_CASTER(std::string, _(PYBIND11_STRING_NAME));
497
498
protected:
    bool success = false;
Wenzel Jakob's avatar
Wenzel Jakob committed
499
500
};

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

hulucc's avatar
hulucc committed
512
template <> class type_caster<std::wstring> {
Wenzel Jakob's avatar
Wenzel Jakob committed
513
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
514
515
516
    bool load(handle src, bool) {
        object temp;
        handle load_src = src;
517
518
519
        if (!src) {
            return false;
        } else if (!PyUnicode_Check(load_src.ptr())) {
Wenzel Jakob's avatar
Wenzel Jakob committed
520
521
522
523
            temp = object(PyUnicode_FromObject(load_src.ptr()), false);
            if (!temp) { PyErr_Clear(); return false; }
            load_src = temp;
        }
524
525
526
527
528
529
530
531
532
533
534
535
        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
536
            length = length / (ssize_t) sizeof(wchar_t) - 1; ++buffer; // Skip BOM
537
        }
538
539
#endif
        if (!buffer) { PyErr_Clear(); return false; }
540
        value = std::wstring(buffer, (size_t) length);
Wenzel Jakob's avatar
Wenzel Jakob committed
541
542
543
        success = true;
        return true;
    }
hulucc's avatar
hulucc committed
544

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

Wenzel Jakob's avatar
Wenzel Jakob committed
549
    PYBIND11_TYPE_CASTER(std::wstring, _(PYBIND11_STRING_NAME));
550
551
protected:
    bool success = false;
hulucc's avatar
hulucc committed
552
553
};

554
template <> class type_caster<char> : public type_caster<std::string> {
Wenzel Jakob's avatar
Wenzel Jakob committed
555
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
556
    bool load(handle src, bool convert) {
557
        if (src.ptr() == Py_None) return true;
558
559
560
        return type_caster<std::string>::load(src, convert);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
561
    static handle cast(const char *src, return_value_policy /* policy */, handle /* parent */) {
562
        if (src == nullptr) return handle(Py_None).inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
563
564
565
        return PyUnicode_FromString(src);
    }

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

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

574
    static PYBIND11_DESCR name() { return type_descr(_(PYBIND11_STRING_NAME)); }
Wenzel Jakob's avatar
Wenzel Jakob committed
575
576
};

577
template <> class type_caster<wchar_t> : public type_caster<std::wstring> {
hulucc's avatar
hulucc committed
578
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
579
    bool load(handle src, bool convert) {
580
        if (src.ptr() == Py_None) return true;
581
582
583
        return type_caster<std::wstring>::load(src, convert);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
584
    static handle cast(const wchar_t *src, return_value_policy /* policy */, handle /* parent */) {
585
        if (src == nullptr) return handle(Py_None).inc_ref();
586
        return PyUnicode_FromWideChar(src, (ssize_t) wcslen(src));
Wenzel Jakob's avatar
Wenzel Jakob committed
587
    }
hulucc's avatar
hulucc committed
588

Wenzel Jakob's avatar
Wenzel Jakob committed
589
590
591
592
    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
593

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

Wenzel Jakob's avatar
Wenzel Jakob committed
597
    static PYBIND11_DESCR name() { return type_descr(_(PYBIND11_STRING_NAME)); }
hulucc's avatar
hulucc committed
598
599
};

Wenzel Jakob's avatar
Wenzel Jakob committed
600
601
602
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
603
    bool load(handle src, bool convert) {
604
605
606
        if (!src)
            return false;
        else if (!PyTuple_Check(src.ptr()) || PyTuple_Size(src.ptr()) != 2)
Wenzel Jakob's avatar
Wenzel Jakob committed
607
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
608
609
        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
610
611
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
612
613
614
    static handle cast(const type &src, return_value_policy policy, handle parent) {
        object o1 = object(type_caster<typename intrinsic_type<T1>::type>::cast(src.first, policy, parent), false);
        object o2 = object(type_caster<typename intrinsic_type<T2>::type>::cast(src.second, policy, parent), false);
615
        if (!o1 || !o2)
Wenzel Jakob's avatar
Wenzel Jakob committed
616
617
618
619
620
            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
621
622
    }

623
624
    static PYBIND11_DESCR name() {
        return type_descr(
625
626
            _("Tuple[") + type_caster<typename intrinsic_type<T1>::type>::name() +
            _(", ") + type_caster<typename intrinsic_type<T2>::type>::name() + _("]"));
Wenzel Jakob's avatar
Wenzel Jakob committed
627
628
    }

629
630
    template <typename T> using cast_op_type = type;

Wenzel Jakob's avatar
Wenzel Jakob committed
631
    operator type() {
632
633
        return type(first .operator typename type_caster<typename intrinsic_type<T1>::type>::template cast_op_type<T1>(),
                    second.operator typename type_caster<typename intrinsic_type<T2>::type>::template cast_op_type<T2>());
Wenzel Jakob's avatar
Wenzel Jakob committed
634
635
    }
protected:
636
637
    type_caster<typename intrinsic_type<T1>::type> first;
    type_caster<typename intrinsic_type<T2>::type> second;
Wenzel Jakob's avatar
Wenzel Jakob committed
638
639
};

640
template <typename... Tuple> class type_caster<std::tuple<Tuple...>> {
Wenzel Jakob's avatar
Wenzel Jakob committed
641
    typedef std::tuple<Tuple...> type;
642
643
644
    typedef std::tuple<typename intrinsic_type<Tuple>::type...> itype;
    typedef std::tuple<args> args_type;
    typedef std::tuple<args, kwargs> args_kwargs_type;
Wenzel Jakob's avatar
Wenzel Jakob committed
645
646
647
public:
    enum { size = sizeof...(Tuple) };

648
649
650
    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
651
    bool load(handle src, bool convert) {
652
653
        if (!src || !PyTuple_Check(src.ptr()) || PyTuple_GET_SIZE(src.ptr()) != size)
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
654
        return load(src, convert, typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
655
656
    }

657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
    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;
    }
676

Wenzel Jakob's avatar
Wenzel Jakob committed
677
    static handle cast(const type &src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
678
        return cast(src, policy, parent, typename make_index_sequence<size>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
679
680
    }

681
682
683
684
    static PYBIND11_DESCR element_names() {
        return detail::concat(type_caster<typename intrinsic_type<Tuple>::type>::name()...);
    }
    
685
    static PYBIND11_DESCR name() {
686
        return type_descr(_("Tuple[") + element_names() + _("]"));
Wenzel Jakob's avatar
Wenzel Jakob committed
687
688
    }

689
690
    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
691
692
    }

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

698
699
    template <typename T> using cast_op_type = type;

Wenzel Jakob's avatar
Wenzel Jakob committed
700
    operator type() {
Wenzel Jakob's avatar
Wenzel Jakob committed
701
        return cast(typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
702
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
703

Wenzel Jakob's avatar
Wenzel Jakob committed
704
protected:
705
    template <typename ReturnValue, typename Func, size_t ... Index> ReturnValue call(Func &&f, index_sequence<Index...>) {
706
707
        return f(std::get<Index>(value)
            .operator typename type_caster<typename intrinsic_type<Tuple>::type>::template cast_op_type<Tuple>()...);
Wenzel Jakob's avatar
Wenzel Jakob committed
708
709
710
    }

    template <size_t ... Index> type cast(index_sequence<Index...>) {
711
712
        return type(std::get<Index>(value)
            .operator typename type_caster<typename intrinsic_type<Tuple>::type>::template cast_op_type<Tuple>()...);
Wenzel Jakob's avatar
Wenzel Jakob committed
713
714
    }

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

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

protected:
742
    std::tuple<type_caster<typename intrinsic_type<Tuple>::type>...> value;
Wenzel Jakob's avatar
Wenzel Jakob committed
743
744
745
};

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

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

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

Wenzel Jakob's avatar
Wenzel Jakob committed
776
777
778
    explicit operator type*() { return this->value; }
    explicit operator type&() { return *(this->value); }
    explicit operator holder_type*() { return &holder; }
779

780
781
782
783
784
785
786
787
    // 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

788
    static handle cast(const holder_type &src, return_value_policy, handle) {
789
        return type_caster_generic::cast(
790
            src.get(), return_value_policy::take_ownership, handle(),
791
            src.get() ? &typeid(*src.get()) : nullptr, &typeid(type),
792
            nullptr, nullptr, &src);
793
794
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
795
796
797
798
protected:
    holder_type holder;
};

799
800
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); } };
801
802
template <> struct handle_type_name<args> { static PYBIND11_DESCR name() { return _("*args"); } };
template <> struct handle_type_name<kwargs> { static PYBIND11_DESCR name() { return _("**kwargs"); } };
803

804
805
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
806
public:
807
808
    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(); }
809

810
    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
811
    bool load(handle src, bool /* convert */) { value = type(src, true); return value.check(); }
812

Wenzel Jakob's avatar
Wenzel Jakob committed
813
814
    static handle cast(const handle &src, return_value_policy /* policy */, handle /* parent */) {
        return src.inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
815
    }
816
    PYBIND11_TYPE_CASTER(type, handle_type_name<type>::name());
Wenzel Jakob's avatar
Wenzel Jakob committed
817
818
};

819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
// 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>;

Wenzel Jakob's avatar
Wenzel Jakob committed
846
847
NAMESPACE_END(detail)

848
template <typename T> T cast(const handle &handle) {
849
850
    typedef detail::type_caster<typename detail::intrinsic_type<T>::type> type_caster;
    type_caster conv;
851
852
853
854
855
856
857
858
    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
    }
859
    return conv.operator typename type_caster::template cast_op_type<T>();
Wenzel Jakob's avatar
Wenzel Jakob committed
860
861
}

862
863
864
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
865
866
    if (policy == return_value_policy::automatic)
        policy = std::is_pointer<T>::value ? return_value_policy::take_ownership : return_value_policy::copy;
867
868
    else if (policy == return_value_policy::automatic_reference)
        policy = std::is_pointer<T>::value ? return_value_policy::reference : return_value_policy::copy;
869
    return object(detail::type_caster<typename detail::intrinsic_type<T>::type>::cast(value, policy, parent), false);
Wenzel Jakob's avatar
Wenzel Jakob committed
870
871
}

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

875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
template <typename T>
typename std::enable_if<detail::move_always<T>::value || detail::move_if_unreferenced<T>::value, T>::type move(object &&obj) {
    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

    typedef detail::type_caster<T> type_caster;
    type_caster conv;
    if (!conv.load(obj, 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) obj.get_type().str() + " to C++ type '" + type_id<T>() + "''");
#endif

    // Move into a temporary and return that, because the reference may be a local value of `conv`
    T ret = std::move(conv.operator T&());
    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.
template <typename T> typename std::enable_if<detail::move_always<T>::value, T>::type cast(object &&object) {
    return move<T>(std::move(object));
}
template <typename T> typename std::enable_if<detail::move_if_unreferenced<T>::value, T>::type cast(object &&object) {
    if (object.ref_count() > 1)
        return cast<T>(object);
    else
        return move<T>(std::move(object));
}
template <typename T> typename std::enable_if<detail::move_never<T>::value, T>::type cast(object &&object) {
    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; }



926
template <return_value_policy policy = return_value_policy::automatic_reference,
Wenzel Jakob's avatar
Wenzel Jakob committed
927
          typename... Args> tuple make_tuple(Args&&... args_) {
Wenzel Jakob's avatar
Wenzel Jakob committed
928
    const size_t size = sizeof...(Args);
Wenzel Jakob's avatar
Wenzel Jakob committed
929
    std::array<object, size> args {
930
        { object(detail::type_caster<typename detail::intrinsic_type<Args>::type>::cast(
931
            std::forward<Args>(args_), policy, nullptr), false)... }
Wenzel Jakob's avatar
Wenzel Jakob committed
932
    };
933
934
935
936
937
938
939
940
941
942
    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
        }
    }
943
    tuple result(size);
Wenzel Jakob's avatar
Wenzel Jakob committed
944
    int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
945
    for (auto &arg_value : args)
946
947
948
949
        PyTuple_SET_ITEM(result.ptr(), counter++, arg_value.release().ptr());
    return result;
}

950
951
952
template <return_value_policy policy,
          typename... Args> object handle::operator()(Args&&... args) const {
    tuple args_tuple = pybind11::make_tuple<policy>(std::forward<Args>(args)...);
Wenzel Jakob's avatar
Wenzel Jakob committed
953
954
    object result(PyObject_CallObject(m_ptr, args_tuple.ptr()), false);
    if (!result)
955
        throw error_already_set();
Wenzel Jakob's avatar
Wenzel Jakob committed
956
    return result;
Wenzel Jakob's avatar
Wenzel Jakob committed
957
958
}

959
960
961
template <return_value_policy policy,
          typename... Args> object handle::call(Args &&... args) const {
    return operator()<policy>(std::forward<Args>(args)...);
962
963
}

964
inline object handle::operator()(detail::args_proxy args) const {
965
966
967
968
969
970
    object result(PyObject_CallObject(m_ptr, args.ptr()), false);
    if (!result)
        throw error_already_set();
    return result;
}

971
inline object handle::operator()(detail::args_proxy args, detail::kwargs_proxy kwargs) const {
972
973
974
975
976
977
    object result(PyObject_Call(m_ptr, args.ptr(), kwargs.ptr()), false);
    if (!result)
        throw error_already_set();
    return result;
}

Wenzel Jakob's avatar
Wenzel Jakob committed
978
979
980
981
982
#define PYBIND11_MAKE_OPAQUE(Type) \
    namespace pybind11 { namespace detail { \
        template<> class type_caster<Type> : public type_caster_base<Type> { }; \
    }}

983
NAMESPACE_END(pybind11)