cast.h 34.3 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);
Wenzel Jakob's avatar
Wenzel Jakob committed
52
53
54
55
    }
    return *internals_ptr;
}

56
PYBIND11_NOINLINE inline detail::type_info* get_type_info(PyTypeObject *type, bool throw_if_missing = true) {
Wenzel Jakob's avatar
Wenzel Jakob committed
57
58
59
60
61
62
    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;
63
64
65
66
67
        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
68
69
70
71
72
73
    } while (true);
}

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

74
75
    auto it = types.find(std::type_index(tp));
    if (it != types.end())
Wenzel Jakob's avatar
Wenzel Jakob committed
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
102
103
104
105
106
107
108
        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);
}

109
110
111
112
113
114
115
116
117
118
119
120
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
}

Wenzel Jakob's avatar
Wenzel Jakob committed
121
122
123
124
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
125

Wenzel Jakob's avatar
Wenzel Jakob committed
126
127
    PYBIND11_NOINLINE bool load(handle src, bool convert) {
        if (!src || !typeinfo)
Wenzel Jakob's avatar
Wenzel Jakob committed
128
            return false;
129
130
131
132
        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
133
            value = ((instance<void> *) src.ptr())->value;
Wenzel Jakob's avatar
Wenzel Jakob committed
134
135
136
137
            return true;
        }
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
Wenzel Jakob's avatar
Wenzel Jakob committed
138
139
                temp = object(converter(src.ptr(), typeinfo->type), false);
                if (load(temp, false))
Wenzel Jakob's avatar
Wenzel Jakob committed
140
141
142
143
144
145
                    return true;
            }
        }
        return false;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
146
147
    PYBIND11_NOINLINE static handle cast(const void *_src, return_value_policy policy, handle parent,
                                         const std::type_info *type_info,
148
                                         const std::type_info *type_info_backup,
Wenzel Jakob's avatar
Wenzel Jakob committed
149
                                         void *(*copy_constructor)(const void *),
Wenzel Jakob's avatar
Wenzel Jakob committed
150
                                         void *(*move_constructor)(const void *),
Wenzel Jakob's avatar
Wenzel Jakob committed
151
                                         const void *existing_holder = nullptr) {
152
        void *src = const_cast<void *>(_src);
Wenzel Jakob's avatar
Wenzel Jakob committed
153
154
155
        if (src == nullptr)
            return handle(Py_None).inc_ref();

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

Wenzel Jakob's avatar
Wenzel Jakob committed
160
161
        auto& internals = get_internals();
        auto it_instance = internals.registered_instances.find(src);
Wenzel Jakob's avatar
Wenzel Jakob committed
162
163
164
        if (it_instance != internals.registered_instances.end() && !dont_cache)
            return handle((PyObject *) it_instance->second).inc_ref();

165
        auto it = internals.registered_types_cpp.find(std::type_index(*type_info));
166
167
168
169
170
        if (it == internals.registered_types_cpp.end()) {
            type_info = type_info_backup;
            it = internals.registered_types_cpp.find(std::type_index(*type_info));
        }

171
        if (it == internals.registered_types_cpp.end()) {
172
173
174
            std::string tname = type_info->name();
            detail::clean_type_id(tname);
            std::string msg = "Unregistered type : " + tname;
Wenzel Jakob's avatar
Wenzel Jakob committed
175
            PyErr_SetString(PyExc_TypeError, msg.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
176
            return handle();
Wenzel Jakob's avatar
Wenzel Jakob committed
177
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
178

179
        auto tinfo = (const detail::type_info *) it->second;
Wenzel Jakob's avatar
Wenzel Jakob committed
180
181
182
183
184
185
186
187
        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
188
189
        if (policy == return_value_policy::automatic)
            policy = return_value_policy::take_ownership;
190
191
        else if (policy == return_value_policy::automatic_reference)
            policy = return_value_policy::reference;
Wenzel Jakob's avatar
Wenzel Jakob committed
192

Wenzel Jakob's avatar
Wenzel Jakob committed
193
        if (policy == return_value_policy::copy) {
Wenzel Jakob's avatar
Wenzel Jakob committed
194
195
            wrapper->value = copy_constructor(wrapper->value);
            if (wrapper->value == nullptr)
196
                throw cast_error("return_value_policy = copy, but the object is non-copyable!");
Wenzel Jakob's avatar
Wenzel Jakob committed
197
198
199
200
201
202
        } 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
203
        } else if (policy == return_value_policy::reference) {
Wenzel Jakob's avatar
Wenzel Jakob committed
204
            wrapper->owned = false;
Wenzel Jakob's avatar
Wenzel Jakob committed
205
        } else if (policy == return_value_policy::reference_internal) {
Wenzel Jakob's avatar
Wenzel Jakob committed
206
207
            wrapper->owned = false;
            wrapper->parent = parent.inc_ref().ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
208
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
209
210

        tinfo->init_holder(inst.ptr(), existing_holder);
211
        if (!dont_cache)
Wenzel Jakob's avatar
Wenzel Jakob committed
212
213
214
            internals.registered_instances[wrapper->value] = inst.ptr();

        return inst.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
215
216
217
218
    }

protected:
    const type_info *typeinfo = nullptr;
219
    void *value = nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
220
221
222
    object temp;
};

223
224
/* Determine suitable casting operator */
template <typename T>
225
using cast_op_type = typename std::conditional<std::is_pointer<typename std::remove_reference<T>::type>::value,
226
227
228
    typename std::add_pointer<typename intrinsic_type<T>::type>::type,
    typename std::add_lvalue_reference<typename intrinsic_type<T>::type>::type>::type;

229
/// Generic type caster for objects stored on the heap
Wenzel Jakob's avatar
Wenzel Jakob committed
230
template <typename type> class type_caster_base : public type_caster_generic {
231
public:
232
    static PYBIND11_DESCR name() { return type_descr(_<type>()); }
233

Wenzel Jakob's avatar
Wenzel Jakob committed
234
    type_caster_base() : type_caster_generic(typeid(type)) { }
235

Wenzel Jakob's avatar
Wenzel Jakob committed
236
    static handle cast(const type &src, return_value_policy policy, handle parent) {
237
        if (policy == return_value_policy::automatic || policy == return_value_policy::automatic_reference)
238
            policy = return_value_policy::copy;
239
        return cast(&src, policy, parent);
240
241
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
242
243
244
245
246
247
    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
248
    static handle cast(const type *src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
249
250
        return type_caster_generic::cast(
            src, policy, parent, src ? &typeid(*src) : nullptr, &typeid(type),
251
            make_copy_constructor(src), make_move_constructor(src));
252
253
    }

254
255
    template <typename T> using cast_op_type = pybind11::detail::cast_op_type<T>;

256
    operator type*() { return (type *) value; }
257
    operator type&() { if (!value) throw reference_cast_error(); return *((type *) value); }
258

259
protected:
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
    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; }
280
281
};

Wenzel Jakob's avatar
Wenzel Jakob committed
282
283
284
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> {
285
286
public:
    static handle cast(const std::reference_wrapper<type> &src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
287
        return type_caster_base<type>::cast(&src.get(), policy, parent);
288
    }
289
290
    template <typename T> using cast_op_type = std::reference_wrapper<type>;
    operator std::reference_wrapper<type>() { return std::ref(*((type *) this->value)); }
291
292
};

293
#define PYBIND11_TYPE_CASTER(type, py_name) \
Wenzel Jakob's avatar
Wenzel Jakob committed
294
295
296
    protected: \
        type value; \
    public: \
297
        static PYBIND11_DESCR name() { return type_descr(py_name); } \
Wenzel Jakob's avatar
Wenzel Jakob committed
298
        static handle cast(const type *src, return_value_policy policy, handle parent) { \
Wenzel Jakob's avatar
Wenzel Jakob committed
299
300
301
            return cast(*src, policy, parent); \
        } \
        operator type*() { return &value; } \
302
        operator type&() { return value; } \
303
        template <typename _T> using cast_op_type = pybind11::detail::cast_op_type<_T>
Wenzel Jakob's avatar
Wenzel Jakob committed
304

305
306
307
308
309
310
311
#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
312
313
314
315
316
317
318
319
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
320

Wenzel Jakob's avatar
Wenzel Jakob committed
321
    bool load(handle src, bool) {
Wenzel Jakob's avatar
Wenzel Jakob committed
322
        py_type py_value;
Wenzel Jakob's avatar
Wenzel Jakob committed
323

324
325
326
        if (!src) {
            return false;
        } if (std::is_floating_point<T>::value) {
Wenzel Jakob's avatar
Wenzel Jakob committed
327
            py_value = (py_type) PyFloat_AsDouble(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
328
        } else if (sizeof(T) <= sizeof(long)) {
329
330
            if (PyFloat_Check(src.ptr()))
                return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
331
            if (std::is_signed<T>::value)
Wenzel Jakob's avatar
Wenzel Jakob committed
332
                py_value = (py_type) PyLong_AsLong(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
333
            else
Wenzel Jakob's avatar
Wenzel Jakob committed
334
                py_value = (py_type) PyLong_AsUnsignedLong(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
335
        } else {
336
337
            if (PyFloat_Check(src.ptr()))
                return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
338
            if (std::is_signed<T>::value)
Wenzel Jakob's avatar
Wenzel Jakob committed
339
                py_value = (py_type) PYBIND11_LONG_AS_LONGLONG(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
340
            else
Wenzel Jakob's avatar
Wenzel Jakob committed
341
                py_value = (py_type) PYBIND11_LONG_AS_UNSIGNED_LONGLONG(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
342
343
344
345
346
347
348
349
350
        }

        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
351

Wenzel Jakob's avatar
Wenzel Jakob committed
352
353
354
355
        value = (T) py_value;
        return true;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
356
    static handle cast(T src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
        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
372
    static handle cast(const T *src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
373
374
375
        return cast(*src, policy, parent);
    }

376
377
    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
378

379
380
    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
381
382
383
384

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

385
    template <typename T2> using cast_op_type = pybind11::detail::cast_op_type<T2>;
Wenzel Jakob's avatar
Wenzel Jakob committed
386
387
388
protected:
    T value;
};
Wenzel Jakob's avatar
Wenzel Jakob committed
389

390
template <> class type_caster<void_type> {
Wenzel Jakob's avatar
Wenzel Jakob committed
391
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
392
393
394
    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
395
    }
396
    PYBIND11_TYPE_CASTER(void_type, _("NoneType"));
Wenzel Jakob's avatar
Wenzel Jakob committed
397
398
};

399
400
401
402
403
template <> class type_caster<void> : public type_caster<void_type> {
public:
    using type_caster<void_type>::cast;

    bool load(handle h, bool) {
404
405
406
        if (!h) {
            return false;
        } else if (h.ptr() == Py_None) {
407
408
409
            value = nullptr;
            return true;
        }
410
411

        /* Check if this is a capsule */
412
        capsule c(h, true);
413
414
415
416
417
418
419
420
421
422
423
424
425
        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;
426
427
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
428
    static handle cast(const void *ptr, return_value_policy /* policy */, handle /* parent */) {
429
430
431
432
        if (ptr)
            return capsule(ptr).release();
        else
            return handle(Py_None).inc_ref();
433
    }
434

435
436
    template <typename T> using cast_op_type = void*&;
    operator void *&() { return value; }
437
    static PYBIND11_DESCR name() { return _("capsule"); }
438
private:
439
    void *value = nullptr;
440
441
};

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

Wenzel Jakob's avatar
Wenzel Jakob committed
444
445
template <> class type_caster<bool> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
446
    bool load(handle src, bool) {
447
448
        if (!src) return false;
        else if (src.ptr() == Py_True) { value = true; return true; }
Wenzel Jakob's avatar
Wenzel Jakob committed
449
        else if (src.ptr() == Py_False) { value = false; return true; }
Wenzel Jakob's avatar
Wenzel Jakob committed
450
451
        else return false;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
452
453
    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
454
    }
455
    PYBIND11_TYPE_CASTER(bool, _("bool"));
Wenzel Jakob's avatar
Wenzel Jakob committed
456
457
458
459
};

template <> class type_caster<std::string> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
460
    bool load(handle src, bool) {
461
        object temp;
Wenzel Jakob's avatar
Wenzel Jakob committed
462
        handle load_src = src;
463
464
465
        if (!src) {
            return false;
        } else if (PyUnicode_Check(load_src.ptr())) {
Wenzel Jakob's avatar
Wenzel Jakob committed
466
            temp = object(PyUnicode_AsUTF8String(load_src.ptr()), false);
467
            if (!temp) { PyErr_Clear(); return false; }  // UnicodeEncodeError
Wenzel Jakob's avatar
Wenzel Jakob committed
468
            load_src = temp;
469
470
471
        }
        char *buffer;
        ssize_t length;
Wenzel Jakob's avatar
Wenzel Jakob committed
472
        int err = PYBIND11_BYTES_AS_STRING_AND_SIZE(load_src.ptr(), &buffer, &length);
473
        if (err == -1) { PyErr_Clear(); return false; }  // TypeError
474
        value = std::string(buffer, (size_t) length);
475
        success = true;
Wenzel Jakob's avatar
Wenzel Jakob committed
476
477
        return true;
    }
478

Wenzel Jakob's avatar
Wenzel Jakob committed
479
    static handle cast(const std::string &src, return_value_policy /* policy */, handle /* parent */) {
480
        return PyUnicode_FromStringAndSize(src.c_str(), (ssize_t) src.length());
Wenzel Jakob's avatar
Wenzel Jakob committed
481
    }
482
483

    PYBIND11_TYPE_CASTER(std::string, _(PYBIND11_STRING_NAME));
484
485
protected:
    bool success = false;
Wenzel Jakob's avatar
Wenzel Jakob committed
486
487
};

488
489
490
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
491
        handle result = type_caster_base<type>::cast(src.get(), policy, parent);
492
493
494
495
        if (result)
            src.release();
        return result;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
496
    static PYBIND11_DESCR name() { return type_caster_base<type>::name(); }
497
498
};

hulucc's avatar
hulucc committed
499
template <> class type_caster<std::wstring> {
Wenzel Jakob's avatar
Wenzel Jakob committed
500
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
501
502
503
    bool load(handle src, bool) {
        object temp;
        handle load_src = src;
504
505
506
        if (!src) {
            return false;
        } else if (!PyUnicode_Check(load_src.ptr())) {
Wenzel Jakob's avatar
Wenzel Jakob committed
507
508
509
510
            temp = object(PyUnicode_FromObject(load_src.ptr()), false);
            if (!temp) { PyErr_Clear(); return false; }
            load_src = temp;
        }
511
512
513
514
515
516
517
518
519
520
521
522
        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
523
            length = length / (ssize_t) sizeof(wchar_t) - 1; ++buffer; // Skip BOM
524
        }
525
526
#endif
        if (!buffer) { PyErr_Clear(); return false; }
527
        value = std::wstring(buffer, (size_t) length);
Wenzel Jakob's avatar
Wenzel Jakob committed
528
529
530
        success = true;
        return true;
    }
hulucc's avatar
hulucc committed
531

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

Wenzel Jakob's avatar
Wenzel Jakob committed
536
    PYBIND11_TYPE_CASTER(std::wstring, _(PYBIND11_STRING_NAME));
537
538
protected:
    bool success = false;
hulucc's avatar
hulucc committed
539
540
};

541
template <> class type_caster<char> : public type_caster<std::string> {
Wenzel Jakob's avatar
Wenzel Jakob committed
542
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
543
    bool load(handle src, bool convert) {
544
        if (src.ptr() == Py_None) return true;
545
546
547
        return type_caster<std::string>::load(src, convert);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
548
    static handle cast(const char *src, return_value_policy /* policy */, handle /* parent */) {
549
        if (src == nullptr) return handle(Py_None).inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
550
551
552
        return PyUnicode_FromString(src);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
553
    static handle cast(char src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
554
555
556
557
        char str[2] = { src, '\0' };
        return PyUnicode_DecodeLatin1(str, 1, nullptr);
    }

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

561
    static PYBIND11_DESCR name() { return type_descr(_(PYBIND11_STRING_NAME)); }
Wenzel Jakob's avatar
Wenzel Jakob committed
562
563
};

564
template <> class type_caster<wchar_t> : public type_caster<std::wstring> {
hulucc's avatar
hulucc committed
565
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
566
    bool load(handle src, bool convert) {
567
        if (src.ptr() == Py_None) return true;
568
569
570
        return type_caster<std::wstring>::load(src, convert);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
571
    static handle cast(const wchar_t *src, return_value_policy /* policy */, handle /* parent */) {
572
        if (src == nullptr) return handle(Py_None).inc_ref();
573
        return PyUnicode_FromWideChar(src, (ssize_t) wcslen(src));
Wenzel Jakob's avatar
Wenzel Jakob committed
574
    }
hulucc's avatar
hulucc committed
575

Wenzel Jakob's avatar
Wenzel Jakob committed
576
577
578
579
    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
580

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

Wenzel Jakob's avatar
Wenzel Jakob committed
584
    static PYBIND11_DESCR name() { return type_descr(_(PYBIND11_STRING_NAME)); }
hulucc's avatar
hulucc committed
585
586
};

Wenzel Jakob's avatar
Wenzel Jakob committed
587
588
589
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
590
    bool load(handle src, bool convert) {
591
592
593
        if (!src)
            return false;
        else if (!PyTuple_Check(src.ptr()) || PyTuple_Size(src.ptr()) != 2)
Wenzel Jakob's avatar
Wenzel Jakob committed
594
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
595
596
        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
597
598
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
599
600
601
    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);
602
        if (!o1 || !o2)
Wenzel Jakob's avatar
Wenzel Jakob committed
603
604
605
606
607
            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
608
609
    }

610
611
    static PYBIND11_DESCR name() {
        return type_descr(
612
613
            _("(") + type_caster<typename intrinsic_type<T1>::type>::name() +
            _(", ") + type_caster<typename intrinsic_type<T2>::type>::name() + _(")"));
Wenzel Jakob's avatar
Wenzel Jakob committed
614
615
    }

616
617
    template <typename T> using cast_op_type = type;

Wenzel Jakob's avatar
Wenzel Jakob committed
618
    operator type() {
619
620
        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
621
622
    }
protected:
623
624
    type_caster<typename intrinsic_type<T1>::type> first;
    type_caster<typename intrinsic_type<T2>::type> second;
Wenzel Jakob's avatar
Wenzel Jakob committed
625
626
};

627
template <typename... Tuple> class type_caster<std::tuple<Tuple...>> {
Wenzel Jakob's avatar
Wenzel Jakob committed
628
    typedef std::tuple<Tuple...> type;
629
630
631
    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
632
633
634
public:
    enum { size = sizeof...(Tuple) };

635
636
637
    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
638
    bool load(handle src, bool convert) {
639
640
        if (!src || !PyTuple_Check(src.ptr()) || PyTuple_GET_SIZE(src.ptr()) != size)
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
641
        return load(src, convert, typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
642
643
    }

644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
    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;
    }
663

Wenzel Jakob's avatar
Wenzel Jakob committed
664
    static handle cast(const type &src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
665
        return cast(src, policy, parent, typename make_index_sequence<size>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
666
667
    }

668
669
670
    static PYBIND11_DESCR name() {
        return type_descr(
               _("(") +
671
               detail::concat(type_caster<typename intrinsic_type<Tuple>::type>::name()...) +
672
               _(")"));
Wenzel Jakob's avatar
Wenzel Jakob committed
673
674
    }

675
676
    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
677
678
    }

679
    template <typename ReturnValue, typename Func> typename std::enable_if<std::is_void<ReturnValue>::value, void_type>::type call(Func &&f) {
680
        call<ReturnValue>(std::forward<Func>(f), typename make_index_sequence<sizeof...(Tuple)>::type());
681
        return void_type();
Wenzel Jakob's avatar
Wenzel Jakob committed
682
683
    }

684
685
    template <typename T> using cast_op_type = type;

Wenzel Jakob's avatar
Wenzel Jakob committed
686
    operator type() {
Wenzel Jakob's avatar
Wenzel Jakob committed
687
        return cast(typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
688
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
689

Wenzel Jakob's avatar
Wenzel Jakob committed
690
protected:
691
    template <typename ReturnValue, typename Func, size_t ... Index> ReturnValue call(Func &&f, index_sequence<Index...>) {
692
693
        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
694
695
696
    }

    template <size_t ... Index> type cast(index_sequence<Index...>) {
697
698
        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
699
700
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
701
702
    template <size_t ... Indices> bool load(handle src, bool convert, index_sequence<Indices...>) {
        std::array<bool, size> success {{
703
            std::get<Indices>(value).load(PyTuple_GET_ITEM(src.ptr(), Indices), convert)...
Wenzel Jakob's avatar
Wenzel Jakob committed
704
        }};
705
        (void) convert; /* avoid a warning when the tuple is empty */
Wenzel Jakob's avatar
Wenzel Jakob committed
706
        for (bool r : success)
Wenzel Jakob's avatar
Wenzel Jakob committed
707
708
709
710
711
712
            if (!r)
                return false;
        return true;
    }

    /* Implementation: Convert a C++ tuple into a Python tuple */
Wenzel Jakob's avatar
Wenzel Jakob committed
713
714
    template <size_t ... Indices> static handle cast(const type &src, return_value_policy policy, handle parent, index_sequence<Indices...>) {
        std::array<object, size> entries {{
715
            object(type_caster<typename intrinsic_type<Tuple>::type>::cast(std::get<Indices>(src), policy, parent), false)...
Wenzel Jakob's avatar
Wenzel Jakob committed
716
        }};
Wenzel Jakob's avatar
Wenzel Jakob committed
717
718
719
720
        for (const auto &entry: entries)
            if (!entry)
                return handle();
        tuple result(size);
721
        int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
722
723
724
        for (auto & entry: entries)
            PyTuple_SET_ITEM(result.ptr(), counter++, entry.release().ptr());
        return result.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
725
726
727
    }

protected:
728
    std::tuple<type_caster<typename intrinsic_type<Tuple>::type>...> value;
Wenzel Jakob's avatar
Wenzel Jakob committed
729
730
731
};

/// Type caster for holder types like std::shared_ptr, etc.
Wenzel Jakob's avatar
Wenzel Jakob committed
732
template <typename type, typename holder_type> class type_caster_holder : public type_caster_base<type> {
Wenzel Jakob's avatar
Wenzel Jakob committed
733
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
734
735
736
737
    using type_caster_base<type>::cast;
    using type_caster_base<type>::typeinfo;
    using type_caster_base<type>::value;
    using type_caster_base<type>::temp;
738

Wenzel Jakob's avatar
Wenzel Jakob committed
739
    bool load(handle src, bool convert) {
740
        if (!src || !typeinfo) {
Wenzel Jakob's avatar
Wenzel Jakob committed
741
            return false;
742
743
744
745
        } 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
746
            auto inst = (instance<type, holder_type> *) src.ptr();
747
            value = (void *) inst->value;
748
749
750
            holder = inst->holder;
            return true;
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
751

752
753
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
Wenzel Jakob's avatar
Wenzel Jakob committed
754
755
                temp = object(converter(src.ptr(), typeinfo->type), false);
                if (load(temp, false))
756
757
758
759
                    return true;
            }
        }
        return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
760
    }
761

Wenzel Jakob's avatar
Wenzel Jakob committed
762
763
764
    explicit operator type*() { return this->value; }
    explicit operator type&() { return *(this->value); }
    explicit operator holder_type*() { return &holder; }
765

766
767
768
769
770
771
772
773
    // 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

774
    static handle cast(const holder_type &src, return_value_policy, handle) {
775
        return type_caster_generic::cast(
776
            src.get(), return_value_policy::take_ownership, handle(),
777
            src.get() ? &typeid(*src.get()) : nullptr, &typeid(type),
778
            nullptr, nullptr, &src);
779
780
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
781
782
783
784
protected:
    holder_type holder;
};

785
786
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); } };
787
788
template <> struct handle_type_name<args> { static PYBIND11_DESCR name() { return _("*args"); } };
template <> struct handle_type_name<kwargs> { static PYBIND11_DESCR name() { return _("**kwargs"); } };
789

790
791
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
792
public:
793
794
    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(); }
795

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

Wenzel Jakob's avatar
Wenzel Jakob committed
799
800
    static handle cast(const handle &src, return_value_policy /* policy */, handle /* parent */) {
        return src.inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
801
    }
802
    PYBIND11_TYPE_CASTER(type, handle_type_name<type>::name());
Wenzel Jakob's avatar
Wenzel Jakob committed
803
804
805
806
};

NAMESPACE_END(detail)

Wenzel Jakob's avatar
Wenzel Jakob committed
807
template <typename T> T cast(handle handle) {
808
809
    typedef detail::type_caster<typename detail::intrinsic_type<T>::type> type_caster;
    type_caster conv;
810
811
812
813
814
815
816
817
    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
    }
818
    return conv.operator typename type_caster::template cast_op_type<T>();
Wenzel Jakob's avatar
Wenzel Jakob committed
819
820
}

821
822
823
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
824
825
    if (policy == return_value_policy::automatic)
        policy = std::is_pointer<T>::value ? return_value_policy::take_ownership : return_value_policy::copy;
826
827
    else if (policy == return_value_policy::automatic_reference)
        policy = std::is_pointer<T>::value ? return_value_policy::reference : return_value_policy::copy;
828
    return object(detail::type_caster<typename detail::intrinsic_type<T>::type>::cast(value, policy, parent), false);
Wenzel Jakob's avatar
Wenzel Jakob committed
829
830
}

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

834
template <return_value_policy policy = return_value_policy::automatic_reference,
Wenzel Jakob's avatar
Wenzel Jakob committed
835
          typename... Args> tuple make_tuple(Args&&... args_) {
Wenzel Jakob's avatar
Wenzel Jakob committed
836
    const size_t size = sizeof...(Args);
Wenzel Jakob's avatar
Wenzel Jakob committed
837
    std::array<object, size> args {
838
        { object(detail::type_caster<typename detail::intrinsic_type<Args>::type>::cast(
839
            std::forward<Args>(args_), policy, nullptr), false)... }
Wenzel Jakob's avatar
Wenzel Jakob committed
840
    };
841
842
843
844
845
846
847
848
849
850
    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
        }
    }
851
    tuple result(size);
Wenzel Jakob's avatar
Wenzel Jakob committed
852
    int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
853
    for (auto &arg_value : args)
854
855
856
857
        PyTuple_SET_ITEM(result.ptr(), counter++, arg_value.release().ptr());
    return result;
}

858
859
860
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
861
862
    object result(PyObject_CallObject(m_ptr, args_tuple.ptr()), false);
    if (!result)
863
        throw error_already_set();
Wenzel Jakob's avatar
Wenzel Jakob committed
864
    return result;
Wenzel Jakob's avatar
Wenzel Jakob committed
865
866
}

867
868
869
template <return_value_policy policy,
          typename... Args> object handle::call(Args &&... args) const {
    return operator()<policy>(std::forward<Args>(args)...);
870
871
}

872
inline object handle::operator()(detail::args_proxy args) const {
873
874
875
876
877
878
    object result(PyObject_CallObject(m_ptr, args.ptr()), false);
    if (!result)
        throw error_already_set();
    return result;
}

879
inline object handle::operator()(detail::args_proxy args, detail::kwargs_proxy kwargs) const {
880
881
882
883
884
885
    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
886
887
888
889
890
#define PYBIND11_MAKE_OPAQUE(Type) \
    namespace pybind11 { namespace detail { \
        template<> class type_caster<Type> : public type_caster_base<Type> { }; \
    }}

891
NAMESPACE_END(pybind11)