cast.h 22.4 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
5
6
7
8
9
10
    C++ and Python types

    Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch>

    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>
Wenzel Jakob's avatar
Wenzel Jakob committed
18

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

Wenzel Jakob's avatar
Wenzel Jakob committed
22
23
24
25
26
27
28
29
30
/// 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;
};
31

Wenzel Jakob's avatar
Wenzel Jakob committed
32
33
34
35
36
PYBIND11_NOINLINE inline internals &get_internals() {
    static internals *internals_ptr = nullptr;
    if (internals_ptr)
        return *internals_ptr;
    handle builtins(PyEval_GetBuiltins());
37
38
    const char *id = PYBIND11_INTERNALS_ID;
    capsule caps(builtins[id]);
Wenzel Jakob's avatar
Wenzel Jakob committed
39
40
41
42
    if (caps.check()) {
        internals_ptr = caps;
    } else {
        internals_ptr = new internals();
43
        builtins[id] = capsule(internals_ptr);
Wenzel Jakob's avatar
Wenzel Jakob committed
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
    }
    return *internals_ptr;
}

PYBIND11_NOINLINE inline detail::type_info* get_type_info(PyTypeObject *type) {
    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;
        if (!type)
            pybind11_fail("pybind11::detail::get_type_info: unable to find type object!");
    } while (true);
}

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

63
64
    auto it = types.find(std::type_index(tp));
    if (it != types.end())
Wenzel Jakob's avatar
Wenzel Jakob committed
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
        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() {
    std::string errorString;
    PyThreadState *tstate = PyThreadState_GET();
    if (tstate == nullptr)
        return "";

    if (tstate->curexc_type) {
        errorString += (std::string) handle(tstate->curexc_type).str();
        errorString += ": ";
    }
    if (tstate->curexc_value)
        errorString += (std::string) handle(tstate->curexc_value).str();

    return errorString;
}

PYBIND11_NOINLINE inline handle get_object_handle(const void *ptr) {
    auto instances = get_internals().registered_instances;
    auto it = instances.find(ptr);
    if (it == instances.end())
        return handle();
    return handle((PyObject *) it->second);
}

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
102

Wenzel Jakob's avatar
Wenzel Jakob committed
103
104
    PYBIND11_NOINLINE bool load(handle src, bool convert) {
        if (!src || !typeinfo)
Wenzel Jakob's avatar
Wenzel Jakob committed
105
            return false;
106
107
108
109
        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
110
            value = ((instance<void> *) src.ptr())->value;
Wenzel Jakob's avatar
Wenzel Jakob committed
111
112
113
114
            return true;
        }
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
Wenzel Jakob's avatar
Wenzel Jakob committed
115
116
                temp = object(converter(src.ptr(), typeinfo->type), false);
                if (load(temp, false))
Wenzel Jakob's avatar
Wenzel Jakob committed
117
118
119
120
121
122
                    return true;
            }
        }
        return false;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
123
124
125
126
    PYBIND11_NOINLINE static handle cast(const void *_src, return_value_policy policy, handle parent,
                                         const std::type_info *type_info,
                                         void *(*copy_constructor)(const void *),
                                         const void *existing_holder = nullptr) {
127
        void *src = const_cast<void *>(_src);
Wenzel Jakob's avatar
Wenzel Jakob committed
128
129
130
        if (src == nullptr)
            return handle(Py_None).inc_ref();

Wenzel Jakob's avatar
Wenzel Jakob committed
131
        // avoid an issue with internal references matching their parent's address
Wenzel Jakob's avatar
Wenzel Jakob committed
132
        bool dont_cache = policy == return_value_policy::reference_internal &&
Wenzel Jakob's avatar
Wenzel Jakob committed
133
134
                          parent && ((instance<void> *) parent.ptr())->value == (void *) src;

Wenzel Jakob's avatar
Wenzel Jakob committed
135
136
        auto& internals = get_internals();
        auto it_instance = internals.registered_instances.find(src);
Wenzel Jakob's avatar
Wenzel Jakob committed
137
138
139
        if (it_instance != internals.registered_instances.end() && !dont_cache)
            return handle((PyObject *) it_instance->second).inc_ref();

140
        auto it = internals.registered_types_cpp.find(std::type_index(*type_info));
141
        if (it == internals.registered_types_cpp.end()) {
142
143
144
            std::string tname = type_info->name();
            detail::clean_type_id(tname);
            std::string msg = "Unregistered type : " + tname;
Wenzel Jakob's avatar
Wenzel Jakob committed
145
            PyErr_SetString(PyExc_TypeError, msg.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
146
            return handle();
Wenzel Jakob's avatar
Wenzel Jakob committed
147
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
148

149
        auto tinfo = (const detail::type_info *) it->second;
Wenzel Jakob's avatar
Wenzel Jakob committed
150
151
152
153
154
155
156
157
        object inst(PyType_GenericAlloc(tinfo->type, 0), false);

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

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

Wenzel Jakob's avatar
Wenzel Jakob committed
158
159
        if (policy == return_value_policy::automatic)
            policy = return_value_policy::take_ownership;
Wenzel Jakob's avatar
Wenzel Jakob committed
160

Wenzel Jakob's avatar
Wenzel Jakob committed
161
        if (policy == return_value_policy::copy) {
Wenzel Jakob's avatar
Wenzel Jakob committed
162
163
            wrapper->value = copy_constructor(wrapper->value);
            if (wrapper->value == nullptr)
164
                throw cast_error("return_value_policy = copy, but the object is non-copyable!");
Wenzel Jakob's avatar
Wenzel Jakob committed
165
        } else if (policy == return_value_policy::reference) {
Wenzel Jakob's avatar
Wenzel Jakob committed
166
            wrapper->owned = false;
Wenzel Jakob's avatar
Wenzel Jakob committed
167
        } else if (policy == return_value_policy::reference_internal) {
Wenzel Jakob's avatar
Wenzel Jakob committed
168
169
            wrapper->owned = false;
            wrapper->parent = parent.inc_ref().ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
170
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
171
172

        tinfo->init_holder(inst.ptr(), existing_holder);
173
        if (!dont_cache)
Wenzel Jakob's avatar
Wenzel Jakob committed
174
175
176
            internals.registered_instances[wrapper->value] = inst.ptr();

        return inst.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
177
178
179
180
    }

protected:
    const type_info *typeinfo = nullptr;
181
    void *value = nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
182
183
184
    object temp;
};

185
/// Generic type caster for objects stored on the heap
186
template <typename type, typename Enable = void> class type_caster : public type_caster_generic {
187
public:
188
    static PYBIND11_DESCR name() { return type_descr(_<type>()); }
189

Wenzel Jakob's avatar
Wenzel Jakob committed
190
    type_caster() : type_caster_generic(typeid(type)) { }
191

Wenzel Jakob's avatar
Wenzel Jakob committed
192
    static handle cast(const type &src, return_value_policy policy, handle parent) {
193
194
        if (policy == return_value_policy::automatic)
            policy = return_value_policy::copy;
195
        return type_caster_generic::cast(&src, policy, parent, &typeid(type), &copy_constructor);
196
197
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
198
    static handle cast(const type *src, return_value_policy policy, handle parent) {
199
        return type_caster_generic::cast(src, policy, parent, &typeid(type), &copy_constructor);
200
201
202
    }

    operator type*() { return (type *) value; }
Wenzel Jakob's avatar
Wenzel Jakob committed
203
    operator type&() { return *((type *) value); }
204
protected:
205
    template <typename T = type, typename std::enable_if<detail::is_copy_constructible<T>::value, int>::type = 0>
206
    static void *copy_constructor(const void *arg) {
207
        return (void *) new type(*((const type *) arg));
208
    }
209
    template <typename T = type, typename std::enable_if<!detail::is_copy_constructible<T>::value, int>::type = 0>
210
211
212
    static void *copy_constructor(const void *) { return nullptr; }
};

213
#define PYBIND11_TYPE_CASTER(type, py_name) \
Wenzel Jakob's avatar
Wenzel Jakob committed
214
215
216
    protected: \
        type value; \
    public: \
217
        static PYBIND11_DESCR name() { return type_descr(py_name); } \
Wenzel Jakob's avatar
Wenzel Jakob committed
218
        static handle cast(const type *src, return_value_policy policy, handle parent) { \
Wenzel Jakob's avatar
Wenzel Jakob committed
219
220
221
            return cast(*src, policy, parent); \
        } \
        operator type*() { return &value; } \
Wenzel Jakob's avatar
Wenzel Jakob committed
222
        operator type&() { return value; }
Wenzel Jakob's avatar
Wenzel Jakob committed
223

224
225
226
227
228
229
230
#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
231
232
233
234
235
236
237
238
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
239

Wenzel Jakob's avatar
Wenzel Jakob committed
240
    bool load(handle src, bool) {
Wenzel Jakob's avatar
Wenzel Jakob committed
241
        py_type py_value;
Wenzel Jakob's avatar
Wenzel Jakob committed
242

Wenzel Jakob's avatar
Wenzel Jakob committed
243
        if (std::is_floating_point<T>::value) {
Wenzel Jakob's avatar
Wenzel Jakob committed
244
            py_value = (py_type) PyFloat_AsDouble(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
245
246
        } else if (sizeof(T) <= sizeof(long)) {
            if (std::is_signed<T>::value)
Wenzel Jakob's avatar
Wenzel Jakob committed
247
                py_value = (py_type) PyLong_AsLong(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
248
            else
Wenzel Jakob's avatar
Wenzel Jakob committed
249
                py_value = (py_type) PyLong_AsUnsignedLong(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
250
251
        } else {
            if (std::is_signed<T>::value)
Wenzel Jakob's avatar
Wenzel Jakob committed
252
                py_value = (py_type) PYBIND11_LONG_AS_LONGLONG(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
253
            else
Wenzel Jakob's avatar
Wenzel Jakob committed
254
                py_value = (py_type) PYBIND11_LONG_AS_UNSIGNED_LONGLONG(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
255
256
257
258
259
260
261
262
263
        }

        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
264

Wenzel Jakob's avatar
Wenzel Jakob committed
265
266
267
268
        value = (T) py_value;
        return true;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
269
    static handle cast(T src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
        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);
        }
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
285
    static handle cast(const T *src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
286
287
288
        return cast(*src, policy, parent);
    }

289
290
    template <typename T2 = T, typename std::enable_if<std::is_integral<T2>::value, int>::type = 0>
    static PYBIND11_DESCR name() { return type_descr(_("int")); }
Wenzel Jakob's avatar
Wenzel Jakob committed
291

292
293
    template <typename T2 = T, typename std::enable_if<!std::is_integral<T2>::value, int>::type = 0>
    static PYBIND11_DESCR name() { return type_descr(_("float")); }
Wenzel Jakob's avatar
Wenzel Jakob committed
294
295
296
297
298
299
300

    operator T*() { return &value; }
    operator T&() { return value; }

protected:
    T value;
};
Wenzel Jakob's avatar
Wenzel Jakob committed
301

302
template <> class type_caster<void_type> {
Wenzel Jakob's avatar
Wenzel Jakob committed
303
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
304
305
306
    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
307
    }
308
    PYBIND11_TYPE_CASTER(void_type, _("NoneType"));
Wenzel Jakob's avatar
Wenzel Jakob committed
309
310
};

Wenzel Jakob's avatar
Wenzel Jakob committed
311
312
template <> class type_caster<void> : public type_caster<void_type> { };
template <> class type_caster<std::nullptr_t> : public type_caster<void_type> { };
313

Wenzel Jakob's avatar
Wenzel Jakob committed
314
315
template <> class type_caster<bool> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
316
317
318
    bool load(handle src, bool) {
        if (src.ptr() == Py_True) { value = true; return true; }
        else if (src.ptr() == Py_False) { value = false; return true; }
Wenzel Jakob's avatar
Wenzel Jakob committed
319
320
        else return false;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
321
322
    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
323
    }
324
    PYBIND11_TYPE_CASTER(bool, _("bool"));
Wenzel Jakob's avatar
Wenzel Jakob committed
325
326
327
328
};

template <> class type_caster<std::string> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
329
    bool load(handle src, bool) {
330
        object temp;
Wenzel Jakob's avatar
Wenzel Jakob committed
331
332
333
        handle load_src = src;
        if (PyUnicode_Check(load_src.ptr())) {
            temp = object(PyUnicode_AsUTF8String(load_src.ptr()), false);
334
            if (!temp) { PyErr_Clear(); return false; }  // UnicodeEncodeError
Wenzel Jakob's avatar
Wenzel Jakob committed
335
            load_src = temp;
336
337
338
        }
        char *buffer;
        ssize_t length;
Wenzel Jakob's avatar
Wenzel Jakob committed
339
        int err = PYBIND11_BYTES_AS_STRING_AND_SIZE(load_src.ptr(), &buffer, &length);
340
341
        if (err == -1) { PyErr_Clear(); return false; }  // TypeError
        value = std::string(buffer, length);
Wenzel Jakob's avatar
Wenzel Jakob committed
342
343
        return true;
    }
344

Wenzel Jakob's avatar
Wenzel Jakob committed
345
    static handle cast(const std::string &src, return_value_policy /* policy */, handle /* parent */) {
346
        return PyUnicode_FromStringAndSize(src.c_str(), src.length());
Wenzel Jakob's avatar
Wenzel Jakob committed
347
    }
348
349

    PYBIND11_TYPE_CASTER(std::string, _(PYBIND11_STRING_NAME));
Wenzel Jakob's avatar
Wenzel Jakob committed
350
351
352
353
};

template <> class type_caster<char> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
354
    bool load(handle src, bool) {
355
        object temp;
Wenzel Jakob's avatar
Wenzel Jakob committed
356
357
358
        handle load_src = src;
        if (PyUnicode_Check(load_src.ptr())) {
            temp = object(PyUnicode_AsUTF8String(load_src.ptr()), false);
359
            if (!temp) { PyErr_Clear(); return false; }  // UnicodeEncodeError
Wenzel Jakob's avatar
Wenzel Jakob committed
360
            load_src = temp;
361
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
362
        const char *ptr = PYBIND11_BYTES_AS_STRING(load_src.ptr());
363
364
        if (!ptr) { PyErr_Clear(); return false; }  // TypeError
        value = std::string(ptr);
Wenzel Jakob's avatar
Wenzel Jakob committed
365
366
367
        return true;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
368
    static handle cast(const char *src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
369
370
371
        return PyUnicode_FromString(src);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
372
    static handle cast(char src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
373
374
375
376
        char str[2] = { src, '\0' };
        return PyUnicode_DecodeLatin1(str, 1, nullptr);
    }

377
378
    operator char*() { return (char *) value.c_str(); }
    operator char() { if (value.length() > 0) return value[0]; else return '\0'; }
379
380

    static PYBIND11_DESCR name() { return type_descr(_(PYBIND11_STRING_NAME)); }
Wenzel Jakob's avatar
Wenzel Jakob committed
381
protected:
382
    std::string value;
Wenzel Jakob's avatar
Wenzel Jakob committed
383
384
385
386
387
};

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
388
389
    bool load(handle src, bool convert) {
        if (!PyTuple_Check(src.ptr()) || PyTuple_Size(src.ptr()) != 2)
Wenzel Jakob's avatar
Wenzel Jakob committed
390
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
391
392
        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
393
394
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
395
396
397
    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);
398
        if (!o1 || !o2)
Wenzel Jakob's avatar
Wenzel Jakob committed
399
400
401
402
403
            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
404
405
    }

406
407
    static PYBIND11_DESCR name() {
        return type_descr(
408
409
            _("(") + type_caster<typename intrinsic_type<T1>::type>::name() +
            _(", ") + type_caster<typename intrinsic_type<T2>::type>::name() + _(")"));
Wenzel Jakob's avatar
Wenzel Jakob committed
410
411
412
413
414
415
    }

    operator type() {
        return type(first, second);
    }
protected:
416
417
    type_caster<typename intrinsic_type<T1>::type> first;
    type_caster<typename intrinsic_type<T2>::type> second;
Wenzel Jakob's avatar
Wenzel Jakob committed
418
419
};

420
template <typename... Tuple> class type_caster<std::tuple<Tuple...>> {
Wenzel Jakob's avatar
Wenzel Jakob committed
421
422
423
424
    typedef std::tuple<Tuple...> type;
public:
    enum { size = sizeof...(Tuple) };

Wenzel Jakob's avatar
Wenzel Jakob committed
425
    bool load(handle src, bool convert) {
Wenzel Jakob's avatar
Wenzel Jakob committed
426
        return load(src, convert, typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
427
428
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
429
    static handle cast(const type &src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
430
        return cast(src, policy, parent, typename make_index_sequence<size>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
431
432
    }

433
434
435
    static PYBIND11_DESCR name() {
        return type_descr(
               _("(") +
436
               detail::concat(type_caster<typename intrinsic_type<Tuple>::type>::name()...) +
437
               _(")"));
Wenzel Jakob's avatar
Wenzel Jakob committed
438
439
    }

440
441
    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
442
443
    }

444
    template <typename ReturnValue, typename Func> typename std::enable_if<std::is_void<ReturnValue>::value, void_type>::type call(Func &&f) {
445
        call<ReturnValue>(std::forward<Func>(f), typename make_index_sequence<sizeof...(Tuple)>::type());
446
        return void_type();
Wenzel Jakob's avatar
Wenzel Jakob committed
447
448
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
449
    operator type() {
Wenzel Jakob's avatar
Wenzel Jakob committed
450
        return cast(typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
451
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
452

Wenzel Jakob's avatar
Wenzel Jakob committed
453
protected:
454
    template <typename ReturnValue, typename Func, size_t ... Index> ReturnValue call(Func &&f, index_sequence<Index...>) {
Wenzel Jakob's avatar
Wenzel Jakob committed
455
456
457
458
        return f((Tuple) std::get<Index>(value)...);
    }

    template <size_t ... Index> type cast(index_sequence<Index...>) {
Wenzel Jakob's avatar
Wenzel Jakob committed
459
460
461
        return type((Tuple) std::get<Index>(value)...);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
462
463
    template <size_t ... Indices> bool load(handle src, bool convert, index_sequence<Indices...>) {
        if (!PyTuple_Check(src.ptr()) || PyTuple_Size(src.ptr()) != size)
Wenzel Jakob's avatar
Wenzel Jakob committed
464
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
465
466
        std::array<bool, size> success {{
            (PyTuple_GET_ITEM(src.ptr(), Indices) != nullptr ? std::get<Indices>(value).load(PyTuple_GET_ITEM(src.ptr(), Indices), convert) : false)...
Wenzel Jakob's avatar
Wenzel Jakob committed
467
        }};
468
        (void) convert; /* avoid a warning when the tuple is empty */
Wenzel Jakob's avatar
Wenzel Jakob committed
469
        for (bool r : success)
Wenzel Jakob's avatar
Wenzel Jakob committed
470
471
472
473
474
475
            if (!r)
                return false;
        return true;
    }

    /* Implementation: Convert a C++ tuple into a Python tuple */
Wenzel Jakob's avatar
Wenzel Jakob committed
476
477
    template <size_t ... Indices> static handle cast(const type &src, return_value_policy policy, handle parent, index_sequence<Indices...>) {
        std::array<object, size> entries {{
478
            object(type_caster<typename intrinsic_type<Tuple>::type>::cast(std::get<Indices>(src), policy, parent), false)...
Wenzel Jakob's avatar
Wenzel Jakob committed
479
        }};
Wenzel Jakob's avatar
Wenzel Jakob committed
480
481
482
483
        for (const auto &entry: entries)
            if (!entry)
                return handle();
        tuple result(size);
484
        int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
485
486
487
        for (auto & entry: entries)
            PyTuple_SET_ITEM(result.ptr(), counter++, entry.release().ptr());
        return result.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
488
489
490
    }

protected:
491
    std::tuple<type_caster<typename intrinsic_type<Tuple>::type>...> value;
Wenzel Jakob's avatar
Wenzel Jakob committed
492
493
494
495
496
};

/// Type caster for holder types like std::shared_ptr, etc.
template <typename type, typename holder_type> class type_caster_holder : public type_caster<type> {
public:
497
498
499
500
501
    using type_caster<type>::cast;
    using type_caster<type>::typeinfo;
    using type_caster<type>::value;
    using type_caster<type>::temp;
    using type_caster<type>::copy_constructor;
502

Wenzel Jakob's avatar
Wenzel Jakob committed
503
    bool load(handle src, bool convert) {
504
        if (!src || !typeinfo) {
Wenzel Jakob's avatar
Wenzel Jakob committed
505
            return false;
506
507
508
509
        } 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
510
            auto inst = (instance<type, holder_type> *) src.ptr();
511
            value = (void *) inst->value;
512
513
514
            holder = inst->holder;
            return true;
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
515

516
517
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
Wenzel Jakob's avatar
Wenzel Jakob committed
518
519
                temp = object(converter(src.ptr(), typeinfo->type), false);
                if (load(temp, false))
520
521
522
523
                    return true;
            }
        }
        return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
524
    }
525

Wenzel Jakob's avatar
Wenzel Jakob committed
526
527
528
    explicit operator type*() { return this->value; }
    explicit operator type&() { return *(this->value); }
    explicit operator holder_type*() { return &holder; }
529

530
531
532
533
534
535
536
537
    // 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

Wenzel Jakob's avatar
Wenzel Jakob committed
538
    static handle cast(const holder_type &src, return_value_policy policy, handle parent) {
539
540
        return type_caster_generic::cast(
            src.get(), policy, parent, &typeid(type), &copy_constructor, &src);
541
542
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
543
544
545
546
protected:
    holder_type holder;
};

547
548
549
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); } };

550
551
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
552
public:
553
    template <typename T = type, typename std::enable_if<std::is_same<T, handle>::value, int>::type = 0>
Wenzel Jakob's avatar
Wenzel Jakob committed
554
    bool load(handle src, bool /* convert */) { value = src; return value.check(); }
555
556

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

Wenzel Jakob's avatar
Wenzel Jakob committed
559
560
    static handle cast(const handle &src, return_value_policy /* policy */, handle /* parent */) {
        return src.inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
561
    }
562
    PYBIND11_TYPE_CASTER(type, handle_type_name<type>::name());
Wenzel Jakob's avatar
Wenzel Jakob committed
563
564
565
566
};

NAMESPACE_END(detail)

Wenzel Jakob's avatar
Wenzel Jakob committed
567
template <typename T> inline T cast(handle handle) {
568
    detail::type_caster<typename detail::intrinsic_type<T>::type> conv;
Wenzel Jakob's avatar
Wenzel Jakob committed
569
    if (!conv.load(handle, true))
Wenzel Jakob's avatar
Wenzel Jakob committed
570
        throw cast_error("Unable to cast Python object to C++ type");
571
    return (T) conv;
Wenzel Jakob's avatar
Wenzel Jakob committed
572
573
}

Wenzel Jakob's avatar
Wenzel Jakob committed
574
template <typename T> inline object cast(const T &value, return_value_policy policy = return_value_policy::automatic, handle parent = handle()) {
Wenzel Jakob's avatar
Wenzel Jakob committed
575
576
    if (policy == return_value_policy::automatic)
        policy = std::is_pointer<T>::value ? return_value_policy::take_ownership : return_value_policy::copy;
577
    return object(detail::type_caster<typename detail::intrinsic_type<T>::type>::cast(value, policy, parent), false);
Wenzel Jakob's avatar
Wenzel Jakob committed
578
579
}

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

583
template <typename... Args> inline object handle::call(Args&&... args_) const {
Wenzel Jakob's avatar
Wenzel Jakob committed
584
    const size_t size = sizeof...(Args);
Wenzel Jakob's avatar
Wenzel Jakob committed
585
    std::array<object, size> args {
586
        { object(detail::type_caster<typename detail::intrinsic_type<Args>::type>::cast(
587
            std::forward<Args>(args_), return_value_policy::reference, nullptr), false)... }
Wenzel Jakob's avatar
Wenzel Jakob committed
588
    };
Wenzel Jakob's avatar
Wenzel Jakob committed
589
590
591
592
593
    for (auto &arg_value : args)
        if (!arg_value)
            throw cast_error("handle::call(): unable to convert input "
                             "arguments to Python objects");
    tuple args_tuple(size);
Wenzel Jakob's avatar
Wenzel Jakob committed
594
    int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
595
596
597
598
    for (auto &arg_value : args)
        PyTuple_SET_ITEM(args_tuple.ptr(), counter++, arg_value.release().ptr());
    object result(PyObject_CallObject(m_ptr, args_tuple.ptr()), false);
    if (!result)
599
        throw error_already_set();
Wenzel Jakob's avatar
Wenzel Jakob committed
600
    return result;
Wenzel Jakob's avatar
Wenzel Jakob committed
601
602
}

603
NAMESPACE_END(pybind11)