cast.h 27.9 KB
Newer Older
Wenzel Jakob's avatar
Wenzel Jakob committed
1
/*
2
    pybind11/cast.h: Partial template specializations to cast between
Wenzel Jakob's avatar
Wenzel Jakob committed
3
4
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
22
23
24
25
26
27
28
29
30
31
32
33
34

/// Thin wrapper type used to treat certain data types as opaque (e.g. STL vectors, etc.)
template <typename Type> class opaque {
public:
    template <typename... Args> opaque(Args&&... args) : value(std::forward<Args>(args)...) { }
    operator Type&() { return value; }
    operator const Type&() const { return value; }
    operator Type*() { return &value; }
    operator const Type*() const { return &value; }
    Type* operator->() { return &value; }
    const Type* operator->() const { return &value; }
private:
    Type value;
};

Wenzel Jakob's avatar
Wenzel Jakob committed
35
36
NAMESPACE_BEGIN(detail)

Wenzel Jakob's avatar
Wenzel Jakob committed
37
38
39
40
41
42
43
44
45
/// 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;
};
46

Wenzel Jakob's avatar
Wenzel Jakob committed
47
48
49
50
51
PYBIND11_NOINLINE inline internals &get_internals() {
    static internals *internals_ptr = nullptr;
    if (internals_ptr)
        return *internals_ptr;
    handle builtins(PyEval_GetBuiltins());
52
53
    const char *id = PYBIND11_INTERNALS_ID;
    capsule caps(builtins[id]);
Wenzel Jakob's avatar
Wenzel Jakob committed
54
55
56
57
    if (caps.check()) {
        internals_ptr = caps;
    } else {
        internals_ptr = new internals();
58
        builtins[id] = capsule(internals_ptr);
Wenzel Jakob's avatar
Wenzel Jakob committed
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
    }
    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;

78
79
    auto it = types.find(std::type_index(tp));
    if (it != types.end())
Wenzel Jakob's avatar
Wenzel Jakob committed
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
109
110
111
112
113
114
115
116
        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
117

Wenzel Jakob's avatar
Wenzel Jakob committed
118
119
    PYBIND11_NOINLINE bool load(handle src, bool convert) {
        if (!src || !typeinfo)
Wenzel Jakob's avatar
Wenzel Jakob committed
120
            return false;
121
122
123
124
        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
125
            value = ((instance<void> *) src.ptr())->value;
Wenzel Jakob's avatar
Wenzel Jakob committed
126
127
128
129
            return true;
        }
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
Wenzel Jakob's avatar
Wenzel Jakob committed
130
131
                temp = object(converter(src.ptr(), typeinfo->type), false);
                if (load(temp, false))
Wenzel Jakob's avatar
Wenzel Jakob committed
132
133
134
135
136
137
                    return true;
            }
        }
        return false;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
138
139
    PYBIND11_NOINLINE static handle cast(const void *_src, return_value_policy policy, handle parent,
                                         const std::type_info *type_info,
140
                                         const std::type_info *type_info_backup,
Wenzel Jakob's avatar
Wenzel Jakob committed
141
142
                                         void *(*copy_constructor)(const void *),
                                         const void *existing_holder = nullptr) {
143
        void *src = const_cast<void *>(_src);
Wenzel Jakob's avatar
Wenzel Jakob committed
144
145
146
        if (src == nullptr)
            return handle(Py_None).inc_ref();

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

Wenzel Jakob's avatar
Wenzel Jakob committed
151
152
        auto& internals = get_internals();
        auto it_instance = internals.registered_instances.find(src);
Wenzel Jakob's avatar
Wenzel Jakob committed
153
154
155
        if (it_instance != internals.registered_instances.end() && !dont_cache)
            return handle((PyObject *) it_instance->second).inc_ref();

156
        auto it = internals.registered_types_cpp.find(std::type_index(*type_info));
157
158
159
160
161
        if (it == internals.registered_types_cpp.end()) {
            type_info = type_info_backup;
            it = internals.registered_types_cpp.find(std::type_index(*type_info));
        }

162
        if (it == internals.registered_types_cpp.end()) {
163
164
165
            std::string tname = type_info->name();
            detail::clean_type_id(tname);
            std::string msg = "Unregistered type : " + tname;
Wenzel Jakob's avatar
Wenzel Jakob committed
166
            PyErr_SetString(PyExc_TypeError, msg.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
167
            return handle();
Wenzel Jakob's avatar
Wenzel Jakob committed
168
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
169

170
        auto tinfo = (const detail::type_info *) it->second;
Wenzel Jakob's avatar
Wenzel Jakob committed
171
172
173
174
175
176
177
178
        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
179
180
        if (policy == return_value_policy::automatic)
            policy = return_value_policy::take_ownership;
181
182
        else if (policy == return_value_policy::automatic_reference)
            policy = return_value_policy::reference;
Wenzel Jakob's avatar
Wenzel Jakob committed
183

Wenzel Jakob's avatar
Wenzel Jakob committed
184
        if (policy == return_value_policy::copy) {
Wenzel Jakob's avatar
Wenzel Jakob committed
185
186
            wrapper->value = copy_constructor(wrapper->value);
            if (wrapper->value == nullptr)
187
                throw cast_error("return_value_policy = copy, but the object is non-copyable!");
Wenzel Jakob's avatar
Wenzel Jakob committed
188
        } else if (policy == return_value_policy::reference) {
Wenzel Jakob's avatar
Wenzel Jakob committed
189
            wrapper->owned = false;
Wenzel Jakob's avatar
Wenzel Jakob committed
190
        } else if (policy == return_value_policy::reference_internal) {
Wenzel Jakob's avatar
Wenzel Jakob committed
191
192
            wrapper->owned = false;
            wrapper->parent = parent.inc_ref().ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
193
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
194
195

        tinfo->init_holder(inst.ptr(), existing_holder);
196
        if (!dont_cache)
Wenzel Jakob's avatar
Wenzel Jakob committed
197
198
199
            internals.registered_instances[wrapper->value] = inst.ptr();

        return inst.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
200
201
202
203
    }

protected:
    const type_info *typeinfo = nullptr;
204
    void *value = nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
205
206
207
    object temp;
};

208
209
210
211
212
213
/* Determine suitable casting operator */
template <typename T>
using cast_op_type = typename std::conditional<std::is_pointer<T>::value,
    typename std::add_pointer<typename intrinsic_type<T>::type>::type,
    typename std::add_lvalue_reference<typename intrinsic_type<T>::type>::type>::type;

214
/// Generic type caster for objects stored on the heap
215
template <typename type, typename Enable = void> class type_caster : public type_caster_generic {
216
public:
217
    static PYBIND11_DESCR name() { return type_descr(_<type>()); }
218

Wenzel Jakob's avatar
Wenzel Jakob committed
219
    type_caster() : type_caster_generic(typeid(type)) { }
220

Wenzel Jakob's avatar
Wenzel Jakob committed
221
    static handle cast(const type &src, return_value_policy policy, handle parent) {
222
        if (policy == return_value_policy::automatic || policy == return_value_policy::automatic_reference)
223
            policy = return_value_policy::copy;
224
        return cast(&src, policy, parent);
225
226
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
227
    static handle cast(const type *src, return_value_policy policy, handle parent) {
228
        return type_caster_generic::cast(src, policy, parent, src ? &typeid(*src) : nullptr, &typeid(type), &copy_constructor);
229
230
    }

231
232
    template <typename T> using cast_op_type = pybind11::detail::cast_op_type<T>;

233
    operator type*() { return (type *) value; }
Wenzel Jakob's avatar
Wenzel Jakob committed
234
    operator type&() { return *((type *) value); }
235
protected:
236
    template <typename T = type, typename std::enable_if<detail::is_copy_constructible<T>::value, int>::type = 0>
237
    static void *copy_constructor(const void *arg) {
238
        return (void *) new type(*((const type *) arg));
239
    }
240
    template <typename T = type, typename std::enable_if<!detail::is_copy_constructible<T>::value, int>::type = 0>
241
242
243
    static void *copy_constructor(const void *) { return nullptr; }
};

244
#define PYBIND11_TYPE_CASTER(type, py_name) \
Wenzel Jakob's avatar
Wenzel Jakob committed
245
246
247
    protected: \
        type value; \
    public: \
248
        static PYBIND11_DESCR name() { return type_descr(py_name); } \
Wenzel Jakob's avatar
Wenzel Jakob committed
249
        static handle cast(const type *src, return_value_policy policy, handle parent) { \
Wenzel Jakob's avatar
Wenzel Jakob committed
250
251
252
            return cast(*src, policy, parent); \
        } \
        operator type*() { return &value; } \
253
        operator type&() { return value; } \
254
        template <typename _T> using cast_op_type = pybind11::detail::cast_op_type<_T>
Wenzel Jakob's avatar
Wenzel Jakob committed
255

256
257
258
259
260
261
262
#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
263
264
265
266
267
268
269
270
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
271

Wenzel Jakob's avatar
Wenzel Jakob committed
272
    bool load(handle src, bool) {
Wenzel Jakob's avatar
Wenzel Jakob committed
273
        py_type py_value;
Wenzel Jakob's avatar
Wenzel Jakob committed
274

Wenzel Jakob's avatar
Wenzel Jakob committed
275
        if (std::is_floating_point<T>::value) {
Wenzel Jakob's avatar
Wenzel Jakob committed
276
            py_value = (py_type) PyFloat_AsDouble(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
277
278
        } else if (sizeof(T) <= sizeof(long)) {
            if (std::is_signed<T>::value)
Wenzel Jakob's avatar
Wenzel Jakob committed
279
                py_value = (py_type) PyLong_AsLong(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
280
            else
Wenzel Jakob's avatar
Wenzel Jakob committed
281
                py_value = (py_type) PyLong_AsUnsignedLong(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
282
283
        } else {
            if (std::is_signed<T>::value)
Wenzel Jakob's avatar
Wenzel Jakob committed
284
                py_value = (py_type) PYBIND11_LONG_AS_LONGLONG(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
285
            else
Wenzel Jakob's avatar
Wenzel Jakob committed
286
                py_value = (py_type) PYBIND11_LONG_AS_UNSIGNED_LONGLONG(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
287
288
289
290
291
292
293
294
295
        }

        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
296

Wenzel Jakob's avatar
Wenzel Jakob committed
297
298
299
300
        value = (T) py_value;
        return true;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
301
    static handle cast(T src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
        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
317
    static handle cast(const T *src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
318
319
320
        return cast(*src, policy, parent);
    }

321
322
    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
323

324
325
    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
326
327
328
329

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

330
    template <typename T2> using cast_op_type = pybind11::detail::cast_op_type<T2>;
Wenzel Jakob's avatar
Wenzel Jakob committed
331
332
333
protected:
    T value;
};
Wenzel Jakob's avatar
Wenzel Jakob committed
334

335
template <> class type_caster<void_type> {
Wenzel Jakob's avatar
Wenzel Jakob committed
336
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
337
338
339
    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
340
    }
341
    PYBIND11_TYPE_CASTER(void_type, _("NoneType"));
Wenzel Jakob's avatar
Wenzel Jakob committed
342
343
};

344
345
346
347
348
template <> class type_caster<void> : public type_caster<void_type> {
public:
    using type_caster<void_type>::cast;

    bool load(handle h, bool) {
349
350
351
352
        if (h.ptr() == Py_None) {
            value = nullptr;
            return true;
        }
353
354
355
356
357
358
359
360
        capsule c(h, true);
        if (!c.check())
            return false;
        value = (void *) c;
        return true;
    }

    static handle cast(void *ptr, return_value_policy /* policy */, handle /* parent */) {
361
362
363
364
        if (ptr)
            return capsule(ptr).release();
        else
            return handle(Py_None).inc_ref();
365
    }
366

367
368
    template <typename T> using cast_op_type = void*&;
    operator void *&() { return value; }
369
private:
370
    void *value = nullptr;
371
372
};

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

Wenzel Jakob's avatar
Wenzel Jakob committed
375
376
template <> class type_caster<bool> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
377
378
379
    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
380
381
        else return false;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
382
383
    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
384
    }
385
    PYBIND11_TYPE_CASTER(bool, _("bool"));
Wenzel Jakob's avatar
Wenzel Jakob committed
386
387
388
389
};

template <> class type_caster<std::string> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
390
    bool load(handle src, bool) {
391
        object temp;
Wenzel Jakob's avatar
Wenzel Jakob committed
392
393
394
        handle load_src = src;
        if (PyUnicode_Check(load_src.ptr())) {
            temp = object(PyUnicode_AsUTF8String(load_src.ptr()), false);
395
            if (!temp) { PyErr_Clear(); return false; }  // UnicodeEncodeError
Wenzel Jakob's avatar
Wenzel Jakob committed
396
            load_src = temp;
397
398
399
        }
        char *buffer;
        ssize_t length;
Wenzel Jakob's avatar
Wenzel Jakob committed
400
        int err = PYBIND11_BYTES_AS_STRING_AND_SIZE(load_src.ptr(), &buffer, &length);
401
402
        if (err == -1) { PyErr_Clear(); return false; }  // TypeError
        value = std::string(buffer, length);
403
        success = true;
Wenzel Jakob's avatar
Wenzel Jakob committed
404
405
        return true;
    }
406

Wenzel Jakob's avatar
Wenzel Jakob committed
407
    static handle cast(const std::string &src, return_value_policy /* policy */, handle /* parent */) {
408
        return PyUnicode_FromStringAndSize(src.c_str(), src.length());
Wenzel Jakob's avatar
Wenzel Jakob committed
409
    }
410
411

    PYBIND11_TYPE_CASTER(std::string, _(PYBIND11_STRING_NAME));
412
413
protected:
    bool success = false;
Wenzel Jakob's avatar
Wenzel Jakob committed
414
415
};

416
417
418
419
420
421
422
423
424
425
426
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) {
        handle result = type_caster<type>::cast(src.get(), policy, parent);
        if (result)
            src.release();
        return result;
    }
    static PYBIND11_DESCR name() { return type_caster<type>::name(); }
};

hulucc's avatar
hulucc committed
427
template <> class type_caster<std::wstring> {
Wenzel Jakob's avatar
Wenzel Jakob committed
428
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
429
430
431
432
433
434
435
436
    bool load(handle src, bool) {
        object temp;
        handle load_src = src;
        if (!PyUnicode_Check(load_src.ptr())) {
            temp = object(PyUnicode_FromObject(load_src.ptr()), false);
            if (!temp) { PyErr_Clear(); return false; }
            load_src = temp;
        }
437
438
439
440
441
442
443
444
445
446
447
448
449
        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
            length = length / sizeof(wchar_t) - 1; ++buffer; // Skip BOM
450
        }
451
452
#endif
        if (!buffer) { PyErr_Clear(); return false; }
Wenzel Jakob's avatar
Wenzel Jakob committed
453
454
455
456
        value = std::wstring(buffer, length);
        success = true;
        return true;
    }
hulucc's avatar
hulucc committed
457

Wenzel Jakob's avatar
Wenzel Jakob committed
458
459
460
    static handle cast(const std::wstring &src, return_value_policy /* policy */, handle /* parent */) {
        return PyUnicode_FromWideChar(src.c_str(), src.length());
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
461

Wenzel Jakob's avatar
Wenzel Jakob committed
462
    PYBIND11_TYPE_CASTER(std::wstring, _(PYBIND11_STRING_NAME));
463
464
protected:
    bool success = false;
hulucc's avatar
hulucc committed
465
466
};

467
template <> class type_caster<char> : public type_caster<std::string> {
Wenzel Jakob's avatar
Wenzel Jakob committed
468
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
469
470
    bool load(handle src, bool convert) {
        if (src.ptr() == Py_None) { return true; }
471
472
473
        return type_caster<std::string>::load(src, convert);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
474
    static handle cast(const char *src, return_value_policy /* policy */, handle /* parent */) {
475
        if (src == nullptr) return handle(Py_None).inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
476
477
478
        return PyUnicode_FromString(src);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
479
    static handle cast(char src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
480
481
482
483
        char str[2] = { src, '\0' };
        return PyUnicode_DecodeLatin1(str, 1, nullptr);
    }

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

487
    static PYBIND11_DESCR name() { return type_descr(_(PYBIND11_STRING_NAME)); }
Wenzel Jakob's avatar
Wenzel Jakob committed
488
489
};

490
template <> class type_caster<wchar_t> : public type_caster<std::wstring> {
hulucc's avatar
hulucc committed
491
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
492
493
    bool load(handle src, bool convert) {
        if (src.ptr() == Py_None) { return true; }
494
495
496
        return type_caster<std::wstring>::load(src, convert);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
497
    static handle cast(const wchar_t *src, return_value_policy /* policy */, handle /* parent */) {
498
        if (src == nullptr) return handle(Py_None).inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
499
500
        return PyUnicode_FromWideChar(src, wcslen(src));
    }
hulucc's avatar
hulucc committed
501

Wenzel Jakob's avatar
Wenzel Jakob committed
502
503
504
505
    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
506

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

Wenzel Jakob's avatar
Wenzel Jakob committed
510
    static PYBIND11_DESCR name() { return type_descr(_(PYBIND11_STRING_NAME)); }
hulucc's avatar
hulucc committed
511
512
};

Wenzel Jakob's avatar
Wenzel Jakob committed
513
514
515
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
516
517
    bool load(handle src, bool convert) {
        if (!PyTuple_Check(src.ptr()) || PyTuple_Size(src.ptr()) != 2)
Wenzel Jakob's avatar
Wenzel Jakob committed
518
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
519
520
        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
521
522
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
523
524
525
    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);
526
        if (!o1 || !o2)
Wenzel Jakob's avatar
Wenzel Jakob committed
527
528
529
530
531
            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
532
533
    }

534
535
    static PYBIND11_DESCR name() {
        return type_descr(
536
537
            _("(") + type_caster<typename intrinsic_type<T1>::type>::name() +
            _(", ") + type_caster<typename intrinsic_type<T2>::type>::name() + _(")"));
Wenzel Jakob's avatar
Wenzel Jakob committed
538
539
    }

540
541
    template <typename T> using cast_op_type = type;

Wenzel Jakob's avatar
Wenzel Jakob committed
542
    operator type() {
543
544
        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
545
546
    }
protected:
547
548
    type_caster<typename intrinsic_type<T1>::type> first;
    type_caster<typename intrinsic_type<T2>::type> second;
Wenzel Jakob's avatar
Wenzel Jakob committed
549
550
};

551
template <typename... Tuple> class type_caster<std::tuple<Tuple...>> {
Wenzel Jakob's avatar
Wenzel Jakob committed
552
553
554
555
    typedef std::tuple<Tuple...> type;
public:
    enum { size = sizeof...(Tuple) };

Wenzel Jakob's avatar
Wenzel Jakob committed
556
    bool load(handle src, bool convert) {
Wenzel Jakob's avatar
Wenzel Jakob committed
557
        return load(src, convert, typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
558
559
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
560
    static handle cast(const type &src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
561
        return cast(src, policy, parent, typename make_index_sequence<size>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
562
563
    }

564
565
566
    static PYBIND11_DESCR name() {
        return type_descr(
               _("(") +
567
               detail::concat(type_caster<typename intrinsic_type<Tuple>::type>::name()...) +
568
               _(")"));
Wenzel Jakob's avatar
Wenzel Jakob committed
569
570
    }

571
572
    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
573
574
    }

575
    template <typename ReturnValue, typename Func> typename std::enable_if<std::is_void<ReturnValue>::value, void_type>::type call(Func &&f) {
576
        call<ReturnValue>(std::forward<Func>(f), typename make_index_sequence<sizeof...(Tuple)>::type());
577
        return void_type();
Wenzel Jakob's avatar
Wenzel Jakob committed
578
579
    }

580
581
    template <typename T> using cast_op_type = type;

Wenzel Jakob's avatar
Wenzel Jakob committed
582
    operator type() {
Wenzel Jakob's avatar
Wenzel Jakob committed
583
        return cast(typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
584
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
585

Wenzel Jakob's avatar
Wenzel Jakob committed
586
protected:
587
    template <typename ReturnValue, typename Func, size_t ... Index> ReturnValue call(Func &&f, index_sequence<Index...>) {
588
589
        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
590
591
592
    }

    template <size_t ... Index> type cast(index_sequence<Index...>) {
593
594
        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
595
596
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
597
598
    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
599
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
600
601
        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
602
        }};
603
        (void) convert; /* avoid a warning when the tuple is empty */
Wenzel Jakob's avatar
Wenzel Jakob committed
604
        for (bool r : success)
Wenzel Jakob's avatar
Wenzel Jakob committed
605
606
607
608
609
610
            if (!r)
                return false;
        return true;
    }

    /* Implementation: Convert a C++ tuple into a Python tuple */
Wenzel Jakob's avatar
Wenzel Jakob committed
611
612
    template <size_t ... Indices> static handle cast(const type &src, return_value_policy policy, handle parent, index_sequence<Indices...>) {
        std::array<object, size> entries {{
613
            object(type_caster<typename intrinsic_type<Tuple>::type>::cast(std::get<Indices>(src), policy, parent), false)...
Wenzel Jakob's avatar
Wenzel Jakob committed
614
        }};
Wenzel Jakob's avatar
Wenzel Jakob committed
615
616
617
618
        for (const auto &entry: entries)
            if (!entry)
                return handle();
        tuple result(size);
619
        int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
620
621
622
        for (auto & entry: entries)
            PyTuple_SET_ITEM(result.ptr(), counter++, entry.release().ptr());
        return result.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
623
624
625
    }

protected:
626
    std::tuple<type_caster<typename intrinsic_type<Tuple>::type>...> value;
Wenzel Jakob's avatar
Wenzel Jakob committed
627
628
629
630
631
};

/// 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:
632
633
634
635
636
    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;
637

Wenzel Jakob's avatar
Wenzel Jakob committed
638
    bool load(handle src, bool convert) {
639
        if (!src || !typeinfo) {
Wenzel Jakob's avatar
Wenzel Jakob committed
640
            return false;
641
642
643
644
        } 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
645
            auto inst = (instance<type, holder_type> *) src.ptr();
646
            value = (void *) inst->value;
647
648
649
            holder = inst->holder;
            return true;
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
650

651
652
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
Wenzel Jakob's avatar
Wenzel Jakob committed
653
654
                temp = object(converter(src.ptr(), typeinfo->type), false);
                if (load(temp, false))
655
656
657
658
                    return true;
            }
        }
        return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
659
    }
660

Wenzel Jakob's avatar
Wenzel Jakob committed
661
662
663
    explicit operator type*() { return this->value; }
    explicit operator type&() { return *(this->value); }
    explicit operator holder_type*() { return &holder; }
664

665
666
667
668
669
670
671
672
    // 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
673
    static handle cast(const holder_type &src, return_value_policy policy, handle parent) {
674
        return type_caster_generic::cast(
675
676
677
            src.get(), policy, parent,
            src.get() ? &typeid(*src.get()) : nullptr, &typeid(type),
            &copy_constructor, &src);
678
679
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
680
681
682
683
protected:
    holder_type holder;
};

684
685
686
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); } };

687
688
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
689
public:
690
    template <typename T = type, typename std::enable_if<std::is_same<T, handle>::value, int>::type = 0>
Wenzel Jakob's avatar
Wenzel Jakob committed
691
    bool load(handle src, bool /* convert */) { value = src; return value.check(); }
692
693

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

Wenzel Jakob's avatar
Wenzel Jakob committed
696
697
    static handle cast(const handle &src, return_value_policy /* policy */, handle /* parent */) {
        return src.inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
698
    }
699
    PYBIND11_TYPE_CASTER(type, handle_type_name<type>::name());
Wenzel Jakob's avatar
Wenzel Jakob committed
700
701
702
703
};

NAMESPACE_END(detail)

Wenzel Jakob's avatar
Wenzel Jakob committed
704
template <typename T> inline T cast(handle handle) {
705
    detail::type_caster<typename detail::intrinsic_type<T>::type> conv;
Wenzel Jakob's avatar
Wenzel Jakob committed
706
    if (!conv.load(handle, true))
Wenzel Jakob's avatar
Wenzel Jakob committed
707
        throw cast_error("Unable to cast Python object to C++ type");
708
    return (T) conv;
Wenzel Jakob's avatar
Wenzel Jakob committed
709
710
}

711
template <typename T> inline object cast(const T &value, return_value_policy policy = return_value_policy::automatic_reference, handle parent = handle()) {
Wenzel Jakob's avatar
Wenzel Jakob committed
712
713
    if (policy == return_value_policy::automatic)
        policy = std::is_pointer<T>::value ? return_value_policy::take_ownership : return_value_policy::copy;
714
715
    else if (policy == return_value_policy::automatic_reference)
        policy = std::is_pointer<T>::value ? return_value_policy::reference : return_value_policy::copy;
716
    return object(detail::type_caster<typename detail::intrinsic_type<T>::type>::cast(value, policy, parent), false);
Wenzel Jakob's avatar
Wenzel Jakob committed
717
718
}

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

722
723
template <return_value_policy policy = return_value_policy::automatic_reference,
          typename... Args> inline tuple make_tuple(Args&&... args_) {
Wenzel Jakob's avatar
Wenzel Jakob committed
724
    const size_t size = sizeof...(Args);
Wenzel Jakob's avatar
Wenzel Jakob committed
725
    std::array<object, size> args {
726
        { object(detail::type_caster<typename detail::intrinsic_type<Args>::type>::cast(
727
            std::forward<Args>(args_), policy, nullptr), false)... }
Wenzel Jakob's avatar
Wenzel Jakob committed
728
    };
Wenzel Jakob's avatar
Wenzel Jakob committed
729
730
    for (auto &arg_value : args)
        if (!arg_value)
731
732
            throw cast_error("make_tuple(): unable to convert arguments to Python objects");
    tuple result(size);
Wenzel Jakob's avatar
Wenzel Jakob committed
733
    int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
734
    for (auto &arg_value : args)
735
736
737
738
739
        PyTuple_SET_ITEM(result.ptr(), counter++, arg_value.release().ptr());
    return result;
}

template <typename... Args> inline object handle::call(Args&&... args) const {
740
    tuple args_tuple = pybind11::make_tuple(std::forward<Args>(args)...);
Wenzel Jakob's avatar
Wenzel Jakob committed
741
742
    object result(PyObject_CallObject(m_ptr, args_tuple.ptr()), false);
    if (!result)
743
        throw error_already_set();
Wenzel Jakob's avatar
Wenzel Jakob committed
744
    return result;
Wenzel Jakob's avatar
Wenzel Jakob committed
745
746
}

747
NAMESPACE_END(pybind11)