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"
Wenzel Jakob's avatar
Wenzel Jakob committed
15
#include <array>
16
#include <list>
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)

22
#if PY_MAJOR_VERSION >= 3
23
#define PYBIND11_AS_STRING PyBytes_AsString
24
#else
25
#define PYBIND11_AS_STRING PyString_AsString
26
27
#endif

28
/** Linked list descriptor type for function signatures (produces smaller binaries
29
    compared to a previous solution using std::string and operator +=) */
30
31
32
33
34
35
36
37
38
39
40
41
class descr {
public:
    struct entry {
        const std::type_info *type = nullptr;
        const char *str = nullptr;
        entry *next = nullptr;
        entry(const std::type_info *type) : type(type) { }
        entry(const char *str) : str(str) { }
    };

    descr() { }
    descr(descr &&d) : first(d.first), last(d.last) { d.first = d.last = nullptr; }
42
43
    PYBIND11_NOINLINE descr(const char *str) { first = last = new entry { str }; }
    PYBIND11_NOINLINE descr(const std::type_info &type) { first = last = new entry { &type }; }
44

45
    PYBIND11_NOINLINE void operator+(const char *str) {
46
47
48
49
50
        entry *next = new entry { str };
        last->next = next;
        last = next;
    }

51
    PYBIND11_NOINLINE void operator+(const std::type_info *type) {
52
53
54
55
56
        entry *next = new entry { type };
        last->next = next;
        last = next;
    }

57
    PYBIND11_NOINLINE void operator+=(descr &&other) {
58
59
60
61
62
63
        last->next = other.first;
        while (last->next)
            last = last->next;
        other.first = other.last = nullptr;
    }

64
    PYBIND11_NOINLINE friend descr operator+(descr &&l, descr &&r) {
65
66
67
68
69
        descr result(std::move(l));
        result += std::move(r);
        return result;
    }

70
    PYBIND11_NOINLINE std::string str() const {
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
        std::string result;
        auto const& registered_types = get_internals().registered_types;
        for (entry *it = first; it != nullptr; it = it->next) {
            if (it->type) {
                auto it2 = registered_types.find(it->type);
                if (it2 != registered_types.end()) {
                    result += it2->second.type->tp_name;
                } else {
                    std::string tname(it->type->name());
                    detail::clean_type_id(tname);
                    result += tname;
                }
            } else {
                result += it->str;
            }
        }
        return result;
    }

90
    PYBIND11_NOINLINE ~descr() {
91
92
93
94
95
96
97
98
99
100
101
        while (first) {
            entry *tmp = first->next;
            delete first;
            first = tmp;
        }
    }

    entry *first = nullptr;
    entry *last = nullptr;
};

102
class type_caster_custom {
Wenzel Jakob's avatar
Wenzel Jakob committed
103
public:
104
    PYBIND11_NOINLINE type_caster_custom(const std::type_info *type_info) {
105
        auto & registered_types = get_internals().registered_types;
106
        auto it = registered_types.find(type_info);
107
        if (it != registered_types.end()) {
Wenzel Jakob's avatar
Wenzel Jakob committed
108
            typeinfo = &it->second;
109
110
111
112
113
114
115
116
117
118
119
        } else {
            /* Unknown type?! Since std::type_info* often varies across
               module boundaries, the following does an explicit check */
            for (auto const &type : registered_types) {
                if (strcmp(type.first->name(), type_info->name()) == 0) {
                    registered_types[type_info] = type.second;
                    typeinfo = &type.second;
                    break;
                }
            }
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
120
121
    }

122
    PYBIND11_NOINLINE bool load(PyObject *src, bool convert) {
Wenzel Jakob's avatar
Wenzel Jakob committed
123
124
125
        if (src == nullptr || typeinfo == nullptr)
            return false;
        if (PyType_IsSubtype(Py_TYPE(src), typeinfo->type)) {
126
            value = ((instance<void> *) src)->value;
Wenzel Jakob's avatar
Wenzel Jakob committed
127
128
129
130
131
132
133
134
135
136
137
138
            return true;
        }
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
                temp = object(converter(src, typeinfo->type), false);
                if (load(temp.ptr(), false))
                    return true;
            }
        }
        return false;
    }

139
140
141
    PYBIND11_NOINLINE static PyObject *cast(const void *_src, return_value_policy policy, PyObject *parent,
                                            const std::type_info *type_info, void *(*copy_constructor)(const void *)) {
        void *src = const_cast<void *>(_src);
Wenzel Jakob's avatar
Wenzel Jakob committed
142
143
144
145
146
        if (src == nullptr) {
            Py_INCREF(Py_None);
            return Py_None;
        }
        // avoid an issue with internal references matching their parent's address
Wenzel Jakob's avatar
Wenzel Jakob committed
147
148
        bool dont_cache = policy == return_value_policy::reference_internal &&
                          parent && ((instance<void> *) parent)->value == (void *) src;
Wenzel Jakob's avatar
Wenzel Jakob committed
149
150
151
152
153
154
155
        auto& internals = get_internals();
        auto it_instance = internals.registered_instances.find(src);
        if (it_instance != internals.registered_instances.end() && !dont_cache) {
            PyObject *inst = it_instance->second;
            Py_INCREF(inst);
            return inst;
        }
156
        auto it = internals.registered_types.find(type_info);
Wenzel Jakob's avatar
Wenzel Jakob committed
157
        if (it == internals.registered_types.end()) {
158
159
160
            std::string tname = type_info->name();
            detail::clean_type_id(tname);
            std::string msg = "Unregistered type : " + tname;
Wenzel Jakob's avatar
Wenzel Jakob committed
161
162
163
            PyErr_SetString(PyExc_TypeError, msg.c_str());
            return nullptr;
        }
164
165
        auto &reg_type = it->second;
        instance<void> *inst = (instance<void> *) PyType_GenericAlloc(reg_type.type, 0);
Wenzel Jakob's avatar
Wenzel Jakob committed
166
167
168
169
170
171
        inst->value = src;
        inst->owned = true;
        inst->parent = nullptr;
        if (policy == return_value_policy::automatic)
            policy = return_value_policy::take_ownership;
        if (policy == return_value_policy::copy) {
172
173
174
            inst->value = copy_constructor(inst->value);
            if (inst->value == nullptr)
                throw cast_error("return_value_policy = copy, but the object is non-copyable!");
Wenzel Jakob's avatar
Wenzel Jakob committed
175
176
177
178
179
180
181
        } else if (policy == return_value_policy::reference) {
            inst->owned = false;
        } else if (policy == return_value_policy::reference_internal) {
            inst->owned = false;
            inst->parent = parent;
            Py_XINCREF(parent);
        }
182
183
184
185
186
        PyObject *inst_pyobj = (PyObject *) inst;
        reg_type.init_holder(inst_pyobj);
        if (!dont_cache)
            internals.registered_instances[inst->value] = inst_pyobj;
        return inst_pyobj;
Wenzel Jakob's avatar
Wenzel Jakob committed
187
188
189
190
    }

protected:
    const type_info *typeinfo = nullptr;
191
    void *value = nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
192
193
194
    object temp;
};

195
/// Generic type caster for objects stored on the heap
Wenzel Jakob's avatar
Wenzel Jakob committed
196
template <typename type, typename Enable = void> class type_caster : public type_caster_custom {
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
public:
    static descr name() { return typeid(type); }

    type_caster() : type_caster_custom(&typeid(type)) { }

    static PyObject *cast(const type &src, return_value_policy policy, PyObject *parent) {
        if (policy == return_value_policy::automatic)
            policy = return_value_policy::copy;
        return type_caster_custom::cast(&src, policy, parent, &typeid(type), &copy_constructor);
    }

    static PyObject *cast(const type *src, return_value_policy policy, PyObject *parent) {
        return type_caster_custom::cast(src, policy, parent, &typeid(type), &copy_constructor);
    }

    operator type*() { return (type *) value; }
Wenzel Jakob's avatar
Wenzel Jakob committed
213
    operator type&() { return *((type *) value); }
214
215
216
protected:
    template <typename T = type, typename std::enable_if<std::is_copy_constructible<T>::value, int>::type = 0>
    static void *copy_constructor(const void *arg) {
Wenzel Jakob's avatar
Wenzel Jakob committed
217
        return new type(*((const type *)arg));
218
219
220
221
222
    }
    template <typename T = type, typename std::enable_if<!std::is_copy_constructible<T>::value, int>::type = 0>
    static void *copy_constructor(const void *) { return nullptr; }
};

223
#define PYBIND11_TYPE_CASTER(type, py_name) \
Wenzel Jakob's avatar
Wenzel Jakob committed
224
225
226
    protected: \
        type value; \
    public: \
Wenzel Jakob's avatar
Wenzel Jakob committed
227
        static descr name() { return py_name; } \
Wenzel Jakob's avatar
Wenzel Jakob committed
228
229
230
231
        static PyObject *cast(const type *src, return_value_policy policy, PyObject *parent) { \
            return cast(*src, policy, parent); \
        } \
        operator type*() { return &value; } \
Wenzel Jakob's avatar
Wenzel Jakob committed
232
        operator type&() { return value; }
Wenzel Jakob's avatar
Wenzel Jakob committed
233

234
235
236
237
238
239
240
#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
241
242
243
244
245
246
247
248
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
249

Wenzel Jakob's avatar
Wenzel Jakob committed
250
251
    bool load(PyObject *src, bool) {
        py_type py_value;
Wenzel Jakob's avatar
Wenzel Jakob committed
252

Wenzel Jakob's avatar
Wenzel Jakob committed
253
254
255
256
257
258
259
260
261
        if (std::is_floating_point<T>::value) {
            py_value = (py_type) PyFloat_AsDouble(src);
        } else if (sizeof(T) <= sizeof(long)) {
            if (std::is_signed<T>::value)
                py_value = (py_type) PyLong_AsLong(src);
            else
                py_value = (py_type) PyLong_AsUnsignedLong(src);
        } else {
            if (std::is_signed<T>::value)
262
                py_value = (py_type) detail::PyLong_AsLongLong_(src);
Wenzel Jakob's avatar
Wenzel Jakob committed
263
            else
264
                py_value = (py_type) detail::PyLong_AsUnsignedLongLong_(src);
Wenzel Jakob's avatar
Wenzel Jakob committed
265
266
267
268
269
270
271
272
273
        }

        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
274

Wenzel Jakob's avatar
Wenzel Jakob committed
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
        value = (T) py_value;
        return true;
    }

    static PyObject *cast(T src, return_value_policy /* policy */, PyObject * /* parent */) {
        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);
        }
    }

    static PyObject *cast(const T *src, return_value_policy policy, PyObject *parent) {
        return cast(*src, policy, parent);
    }

    static descr name() {
        return std::is_floating_point<T>::value ? "float" : "int";
    }

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

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

310
template <> class type_caster<void_type> {
Wenzel Jakob's avatar
Wenzel Jakob committed
311
public:
312
    bool load(PyObject *, bool) { return false; }
313
    static PyObject *cast(void_type, return_value_policy /* policy */, PyObject * /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
314
315
316
        Py_INCREF(Py_None);
        return Py_None;
    }
317
    PYBIND11_TYPE_CASTER(void_type, "None");
Wenzel Jakob's avatar
Wenzel Jakob committed
318
319
};

Wenzel Jakob's avatar
Wenzel Jakob committed
320
321
template <> class type_caster<void> : public type_caster<void_type> { };
template <> class type_caster<std::nullptr_t> : public type_caster<void_type> { };
322

Wenzel Jakob's avatar
Wenzel Jakob committed
323
324
325
326
327
328
329
330
331
332
333
334
template <> class type_caster<bool> {
public:
    bool load(PyObject *src, bool) {
        if (src == Py_True) { value = true; return true; }
        else if (src == Py_False) { value = false; return true; }
        else return false;
    }
    static PyObject *cast(bool src, return_value_policy /* policy */, PyObject * /* parent */) {
        PyObject *result = src ? Py_True : Py_False;
        Py_INCREF(result);
        return result;
    }
335
    PYBIND11_TYPE_CASTER(bool, "bool");
Wenzel Jakob's avatar
Wenzel Jakob committed
336
337
338
339
340
};

template <> class type_caster<std::string> {
public:
    bool load(PyObject *src, bool) {
341
342
#if PY_MAJOR_VERSION < 3
        if (PyString_Check(src)) { value = PyString_AsString(src); return true; }
343
#endif
344
345
346
        object temp(PyUnicode_AsUTF8String(src), false);
        const char *ptr = nullptr;
        if (temp)
347
            ptr = PYBIND11_AS_STRING(temp.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
348
        if (!ptr) { PyErr_Clear(); return false; }
349
        value = ptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
350
351
352
353
354
        return true;
    }
    static PyObject *cast(const std::string &src, return_value_policy /* policy */, PyObject * /* parent */) {
        return PyUnicode_FromString(src.c_str());
    }
355
    PYBIND11_TYPE_CASTER(std::string, "str");
Wenzel Jakob's avatar
Wenzel Jakob committed
356
357
358
359
360
};

template <> class type_caster<char> {
public:
    bool load(PyObject *src, bool) {
361
362
#if PY_MAJOR_VERSION < 3
        if (PyString_Check(src)) { value = PyString_AsString(src); return true; }
363
#endif
364
365
366
        object temp(PyUnicode_AsUTF8String(src), false);
        const char *ptr = nullptr;
        if (temp)
367
            ptr = PYBIND11_AS_STRING(temp.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
368
369
370
371
372
373
374
375
376
377
378
379
380
381
        if (!ptr) { PyErr_Clear(); return false; }
        value = ptr;
        return true;
    }

    static PyObject *cast(const char *src, return_value_policy /* policy */, PyObject * /* parent */) {
        return PyUnicode_FromString(src);
    }

    static PyObject *cast(char src, return_value_policy /* policy */, PyObject * /* parent */) {
        char str[2] = { src, '\0' };
        return PyUnicode_DecodeLatin1(str, 1, nullptr);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
382
    static descr name() { return "str"; }
Wenzel Jakob's avatar
Wenzel Jakob committed
383

384
385
    operator char*() { return (char *) value.c_str(); }
    operator char() { if (value.length() > 0) return value[0]; else return '\0'; }
Wenzel Jakob's avatar
Wenzel Jakob committed
386
protected:
387
    std::string value;
Wenzel Jakob's avatar
Wenzel Jakob committed
388
389
390
391
392
393
394
395
396
397
398
399
400
401
};

template <typename T1, typename T2> class type_caster<std::pair<T1, T2>> {
    typedef std::pair<T1, T2> type;
public:
    bool load(PyObject *src, bool convert) {
        if (!PyTuple_Check(src) || PyTuple_Size(src) != 2)
            return false;
        if (!first.load(PyTuple_GetItem(src, 0), convert))
            return false;
        return second.load(PyTuple_GetItem(src, 1), convert);
    }

    static PyObject *cast(const type &src, return_value_policy policy, PyObject *parent) {
402
403
404
        object o1(type_caster<typename decay<T1>::type>::cast(src.first, policy, parent), false);
        object o2(type_caster<typename decay<T2>::type>::cast(src.second, policy, parent), false);
        if (!o1 || !o2)
Wenzel Jakob's avatar
Wenzel Jakob committed
405
406
            return nullptr;
        PyObject *tuple = PyTuple_New(2);
407
408
409
410
        if (!tuple)
            return nullptr;
        PyTuple_SetItem(tuple, 0, o1.release());
        PyTuple_SetItem(tuple, 1, o2.release());
Wenzel Jakob's avatar
Wenzel Jakob committed
411
412
413
        return tuple;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
414
    static descr name() {
415
        class descr result("(");
Wenzel Jakob's avatar
Wenzel Jakob committed
416
        result += std::move(type_caster<typename decay<T1>::type>::name());
417
        result += ", ";
Wenzel Jakob's avatar
Wenzel Jakob committed
418
        result += std::move(type_caster<typename decay<T2>::type>::name());
419
420
        result += ")";
        return result;
Wenzel Jakob's avatar
Wenzel Jakob committed
421
422
423
424
425
426
    }

    operator type() {
        return type(first, second);
    }
protected:
427
428
    type_caster<typename decay<T1>::type> first;
    type_caster<typename decay<T2>::type> second;
Wenzel Jakob's avatar
Wenzel Jakob committed
429
430
};

431
template <typename... Tuple> class type_caster<std::tuple<Tuple...>> {
Wenzel Jakob's avatar
Wenzel Jakob committed
432
433
434
435
436
    typedef std::tuple<Tuple...> type;
public:
    enum { size = sizeof...(Tuple) };

    bool load(PyObject *src, bool convert) {
Wenzel Jakob's avatar
Wenzel Jakob committed
437
        return load(src, convert, typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
438
439
440
    }

    static PyObject *cast(const type &src, return_value_policy policy, PyObject *parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
441
        return cast(src, policy, parent, typename make_index_sequence<size>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
442
443
    }

444
445
    static descr name(const std::list<argument_entry> &args = std::list<argument_entry>()) {
        std::array<class descr, size> type_names {{
Wenzel Jakob's avatar
Wenzel Jakob committed
446
            type_caster<typename decay<Tuple>::type>::name()...
Wenzel Jakob's avatar
Wenzel Jakob committed
447
        }};
448
        auto it = args.begin();
449
450
        class descr result("(");
        for (int i=0; i<size; ++i) {
451
452
            if (it != args.end()) {
                result += it->name;
453
454
                result += " : ";
            }
455
456
457
458
459
460
461
            result += std::move(type_names[i]);
            if (it != args.end()) {
                if (it->descr) {
                    result += " = ";
                    result += it->descr;
                }
                ++it;
462
            }
463
            if (i+1 < size)
Wenzel Jakob's avatar
Wenzel Jakob committed
464
                result += ", ";
465
            ++it;
Wenzel Jakob's avatar
Wenzel Jakob committed
466
467
468
469
470
        }
        result += ")";
        return result;
    }

471
472
    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
473
474
    }

475
    template <typename ReturnValue, typename Func> typename std::enable_if<std::is_void<ReturnValue>::value, void_type>::type call(Func &&f) {
476
        call<ReturnValue>(std::forward<Func>(f), typename make_index_sequence<sizeof...(Tuple)>::type());
477
        return void_type();
Wenzel Jakob's avatar
Wenzel Jakob committed
478
479
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
480
    operator type() {
Wenzel Jakob's avatar
Wenzel Jakob committed
481
        return cast(typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
482
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
483

Wenzel Jakob's avatar
Wenzel Jakob committed
484
protected:
485
    template <typename ReturnValue, typename Func, size_t ... Index> ReturnValue call(Func &&f, index_sequence<Index...>) {
Wenzel Jakob's avatar
Wenzel Jakob committed
486
487
488
489
        return f((Tuple) std::get<Index>(value)...);
    }

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

Wenzel Jakob's avatar
Wenzel Jakob committed
493
    template <size_t ... Indices> bool load(PyObject *src, bool convert, index_sequence<Indices...>) {
Wenzel Jakob's avatar
Wenzel Jakob committed
494
495
496
497
498
        if (!PyTuple_Check(src))
            return false;
        if (PyTuple_Size(src) != size)
            return false;
        std::array<bool, size> results {{
499
            (PyTuple_GET_ITEM(src, Indices) != nullptr ? std::get<Indices>(value).load(PyTuple_GET_ITEM(src, Indices), convert) : false)...
Wenzel Jakob's avatar
Wenzel Jakob committed
500
        }};
501
        (void) convert; /* avoid a warning when the tuple is empty */
Wenzel Jakob's avatar
Wenzel Jakob committed
502
503
504
505
506
507
508
        for (bool r : results)
            if (!r)
                return false;
        return true;
    }

    /* Implementation: Convert a C++ tuple into a Python tuple */
Wenzel Jakob's avatar
Wenzel Jakob committed
509
    template <size_t ... Indices> static PyObject *cast(const type &src, return_value_policy policy, PyObject *parent, index_sequence<Indices...>) {
510
511
        std::array<object, size> results {{
            object(type_caster<typename decay<Tuple>::type>::cast(std::get<Indices>(src), policy, parent), false)...
Wenzel Jakob's avatar
Wenzel Jakob committed
512
        }};
513
514
515
516
517
        for (const auto & result : results)
            if (!result)
                return nullptr;
        PyObject *tuple = PyTuple_New(size);
        if (!tuple)
Wenzel Jakob's avatar
Wenzel Jakob committed
518
            return nullptr;
519
520
521
522
        int counter = 0;
        for (auto & result : results)
            PyTuple_SetItem(tuple, counter++, result.release());
        return tuple;
Wenzel Jakob's avatar
Wenzel Jakob committed
523
524
525
    }

protected:
526
    std::tuple<type_caster<typename decay<Tuple>::type>...> value;
Wenzel Jakob's avatar
Wenzel Jakob committed
527
528
529
530
531
532
};

/// 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:
    typedef type_caster<type> parent;
533
534
535
536
537
538
539
540
541
542
543
544

    template <typename T = holder_type,
              typename std::enable_if<std::is_same<std::shared_ptr<type>, T>::value, int>::type = 0>
    bool load(PyObject *src, bool convert) {
        if (!parent::load(src, convert))
            return false;
        holder = holder_type(((type *) parent::value)->shared_from_this());
        return true;
    }

    template <typename T = holder_type,
              typename std::enable_if<!std::is_same<std::shared_ptr<type>, T>::value, int>::type = 0>
Wenzel Jakob's avatar
Wenzel Jakob committed
545
546
547
    bool load(PyObject *src, bool convert) {
        if (!parent::load(src, convert))
            return false;
548
        holder = holder_type((type *) parent::value);
Wenzel Jakob's avatar
Wenzel Jakob committed
549
550
        return true;
    }
551

Wenzel Jakob's avatar
Wenzel Jakob committed
552
553
554
555
    explicit operator type*() { return this->value; }
    explicit operator type&() { return *(this->value); }
    explicit operator holder_type&() { return holder; }
    explicit operator holder_type*() { return &holder; }
556
557
558
559
560
561

    using type_caster<type>::cast;
    static PyObject *cast(const holder_type &src, return_value_policy policy, PyObject *parent) {
        return type_caster<type>::cast(src.get(), policy, parent);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
562
563
564
565
protected:
    holder_type holder;
};

566
567
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
568
public:
569
570
571
572
573
574
    template <typename T = type, typename std::enable_if<std::is_same<T, handle>::value, int>::type = 0>
    bool load(PyObject *src, bool /* convert */) { value = handle(src); return value.check(); }

    template <typename T = type, typename std::enable_if<!std::is_same<T, handle>::value, int>::type = 0>
    bool load(PyObject *src, bool /* convert */) { value = type(src, true); return value.check(); }

Wenzel Jakob's avatar
Wenzel Jakob committed
575
576
577
578
    static PyObject *cast(const handle &src, return_value_policy /* policy */, PyObject * /* parent */) {
        src.inc_ref();
        return (PyObject *) src.ptr();
    }
579
    PYBIND11_TYPE_CASTER(type, typeid(type));
Wenzel Jakob's avatar
Wenzel Jakob committed
580
581
582
583
584
};

NAMESPACE_END(detail)

template <typename T> inline T cast(PyObject *object) {
Wenzel Jakob's avatar
Wenzel Jakob committed
585
    detail::type_caster<typename detail::decay<T>::type> conv;
Wenzel Jakob's avatar
Wenzel Jakob committed
586
587
588
589
590
591
592
593
    if (!conv.load(object, true))
        throw cast_error("Unable to cast Python object to C++ type");
    return conv;
}

template <typename T> inline object cast(const T &value, return_value_policy policy = return_value_policy::automatic, PyObject *parent = nullptr) {
    if (policy == return_value_policy::automatic)
        policy = std::is_pointer<T>::value ? return_value_policy::take_ownership : return_value_policy::copy;
Wenzel Jakob's avatar
Wenzel Jakob committed
594
    return object(detail::type_caster<typename detail::decay<T>::type>::cast(value, policy, parent), false);
Wenzel Jakob's avatar
Wenzel Jakob committed
595
596
}

597
598
template <typename T> inline T handle::cast() const { return pybind11::cast<T>(m_ptr); }
template <> inline void handle::cast() const { return; }
Wenzel Jakob's avatar
Wenzel Jakob committed
599

600
template <typename... Args> inline object handle::call(Args&&... args_) const {
Wenzel Jakob's avatar
Wenzel Jakob committed
601
    const size_t size = sizeof...(Args);
602
603
604
    std::array<object, size> args{
        { object(detail::type_caster<typename detail::decay<Args>::type>::cast(
            std::forward<Args>(args_), return_value_policy::reference, nullptr), false)... }
Wenzel Jakob's avatar
Wenzel Jakob committed
605
    };
606
607
608
609
610
    for (const auto & result : args)
        if (!result)
            throw cast_error("handle::call(): unable to convert input arguments to Python objects");
    object tuple(PyTuple_New(size), false);
    if (!tuple)
Wenzel Jakob's avatar
Wenzel Jakob committed
611
612
        throw cast_error("handle::call(): unable to convert input arguments to Python objects");
    int counter = 0;
613
614
615
    for (auto & result : args)
        PyTuple_SetItem(tuple.ptr(), counter++, result.release());
    PyObject *result = PyObject_CallObject(m_ptr, tuple.ptr());
616
617
    if (result == nullptr && PyErr_Occurred())
        throw error_already_set();
Wenzel Jakob's avatar
Wenzel Jakob committed
618
619
620
    return object(result, false);
}

621
NAMESPACE_END(pybind11)