cast.h 28.2 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>
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
/* Determine suitable casting operator */
template <typename T>
210
using cast_op_type = typename std::conditional<std::is_pointer<typename std::remove_reference<T>::type>::value,
211
212
213
    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
245
246
247
248
249
250
template <typename type> class type_caster<std::reference_wrapper<type>> : public type_caster<type> {
public:
    static handle cast(const std::reference_wrapper<type> &src, return_value_policy policy, handle parent) {
        return type_caster<type>::cast(&src.get(), policy, parent);
    }
};

251
#define PYBIND11_TYPE_CASTER(type, py_name) \
Wenzel Jakob's avatar
Wenzel Jakob committed
252
253
254
    protected: \
        type value; \
    public: \
255
        static PYBIND11_DESCR name() { return type_descr(py_name); } \
Wenzel Jakob's avatar
Wenzel Jakob committed
256
        static handle cast(const type *src, return_value_policy policy, handle parent) { \
Wenzel Jakob's avatar
Wenzel Jakob committed
257
258
259
            return cast(*src, policy, parent); \
        } \
        operator type*() { return &value; } \
260
        operator type&() { return value; } \
261
        template <typename _T> using cast_op_type = pybind11::detail::cast_op_type<_T>
Wenzel Jakob's avatar
Wenzel Jakob committed
262

263
264
265
266
267
268
269
#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
270
271
272
273
274
275
276
277
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
278

Wenzel Jakob's avatar
Wenzel Jakob committed
279
    bool load(handle src, bool) {
Wenzel Jakob's avatar
Wenzel Jakob committed
280
        py_type py_value;
Wenzel Jakob's avatar
Wenzel Jakob committed
281

Wenzel Jakob's avatar
Wenzel Jakob committed
282
        if (std::is_floating_point<T>::value) {
Wenzel Jakob's avatar
Wenzel Jakob committed
283
            py_value = (py_type) PyFloat_AsDouble(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
284
285
        } else if (sizeof(T) <= sizeof(long)) {
            if (std::is_signed<T>::value)
Wenzel Jakob's avatar
Wenzel Jakob committed
286
                py_value = (py_type) PyLong_AsLong(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
287
            else
Wenzel Jakob's avatar
Wenzel Jakob committed
288
                py_value = (py_type) PyLong_AsUnsignedLong(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
289
290
        } else {
            if (std::is_signed<T>::value)
Wenzel Jakob's avatar
Wenzel Jakob committed
291
                py_value = (py_type) PYBIND11_LONG_AS_LONGLONG(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
292
            else
Wenzel Jakob's avatar
Wenzel Jakob committed
293
                py_value = (py_type) PYBIND11_LONG_AS_UNSIGNED_LONGLONG(src.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
294
295
296
297
298
299
300
301
302
        }

        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
303

Wenzel Jakob's avatar
Wenzel Jakob committed
304
305
306
307
        value = (T) py_value;
        return true;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
308
    static handle cast(T src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
        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
324
    static handle cast(const T *src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
325
326
327
        return cast(*src, policy, parent);
    }

328
329
    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
330

331
332
    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
333
334
335
336

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

337
    template <typename T2> using cast_op_type = pybind11::detail::cast_op_type<T2>;
Wenzel Jakob's avatar
Wenzel Jakob committed
338
339
340
protected:
    T value;
};
Wenzel Jakob's avatar
Wenzel Jakob committed
341

342
template <> class type_caster<void_type> {
Wenzel Jakob's avatar
Wenzel Jakob committed
343
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
344
345
346
    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
347
    }
348
    PYBIND11_TYPE_CASTER(void_type, _("NoneType"));
Wenzel Jakob's avatar
Wenzel Jakob committed
349
350
};

351
352
353
354
355
template <> class type_caster<void> : public type_caster<void_type> {
public:
    using type_caster<void_type>::cast;

    bool load(handle h, bool) {
356
357
358
359
        if (h.ptr() == Py_None) {
            value = nullptr;
            return true;
        }
360
361
362
363
364
365
366
367
        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 */) {
368
369
370
371
        if (ptr)
            return capsule(ptr).release();
        else
            return handle(Py_None).inc_ref();
372
    }
373

374
375
    template <typename T> using cast_op_type = void*&;
    operator void *&() { return value; }
376
private:
377
    void *value = nullptr;
378
379
};

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

Wenzel Jakob's avatar
Wenzel Jakob committed
382
383
template <> class type_caster<bool> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
384
385
386
    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
387
388
        else return false;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
389
390
    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
391
    }
392
    PYBIND11_TYPE_CASTER(bool, _("bool"));
Wenzel Jakob's avatar
Wenzel Jakob committed
393
394
395
396
};

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

Wenzel Jakob's avatar
Wenzel Jakob committed
414
    static handle cast(const std::string &src, return_value_policy /* policy */, handle /* parent */) {
415
        return PyUnicode_FromStringAndSize(src.c_str(), src.length());
Wenzel Jakob's avatar
Wenzel Jakob committed
416
    }
417
418

    PYBIND11_TYPE_CASTER(std::string, _(PYBIND11_STRING_NAME));
419
420
protected:
    bool success = false;
Wenzel Jakob's avatar
Wenzel Jakob committed
421
422
};

423
424
425
426
427
428
429
430
431
432
433
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
434
template <> class type_caster<std::wstring> {
Wenzel Jakob's avatar
Wenzel Jakob committed
435
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
436
437
438
439
440
441
442
443
    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;
        }
444
445
446
447
448
449
450
451
452
453
454
455
456
        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
457
        }
458
459
#endif
        if (!buffer) { PyErr_Clear(); return false; }
Wenzel Jakob's avatar
Wenzel Jakob committed
460
461
462
463
        value = std::wstring(buffer, length);
        success = true;
        return true;
    }
hulucc's avatar
hulucc committed
464

Wenzel Jakob's avatar
Wenzel Jakob committed
465
466
467
    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
468

Wenzel Jakob's avatar
Wenzel Jakob committed
469
    PYBIND11_TYPE_CASTER(std::wstring, _(PYBIND11_STRING_NAME));
470
471
protected:
    bool success = false;
hulucc's avatar
hulucc committed
472
473
};

474
template <> class type_caster<char> : public type_caster<std::string> {
Wenzel Jakob's avatar
Wenzel Jakob committed
475
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
476
477
    bool load(handle src, bool convert) {
        if (src.ptr() == Py_None) { return true; }
478
479
480
        return type_caster<std::string>::load(src, convert);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
481
    static handle cast(const char *src, return_value_policy /* policy */, handle /* parent */) {
482
        if (src == nullptr) return handle(Py_None).inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
483
484
485
        return PyUnicode_FromString(src);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
486
    static handle cast(char src, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
487
488
489
490
        char str[2] = { src, '\0' };
        return PyUnicode_DecodeLatin1(str, 1, nullptr);
    }

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

494
    static PYBIND11_DESCR name() { return type_descr(_(PYBIND11_STRING_NAME)); }
Wenzel Jakob's avatar
Wenzel Jakob committed
495
496
};

497
template <> class type_caster<wchar_t> : public type_caster<std::wstring> {
hulucc's avatar
hulucc committed
498
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
499
500
    bool load(handle src, bool convert) {
        if (src.ptr() == Py_None) { return true; }
501
502
503
        return type_caster<std::wstring>::load(src, convert);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
504
    static handle cast(const wchar_t *src, return_value_policy /* policy */, handle /* parent */) {
505
        if (src == nullptr) return handle(Py_None).inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
506
507
        return PyUnicode_FromWideChar(src, wcslen(src));
    }
hulucc's avatar
hulucc committed
508

Wenzel Jakob's avatar
Wenzel Jakob committed
509
510
511
512
    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
513

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

Wenzel Jakob's avatar
Wenzel Jakob committed
517
    static PYBIND11_DESCR name() { return type_descr(_(PYBIND11_STRING_NAME)); }
hulucc's avatar
hulucc committed
518
519
};

Wenzel Jakob's avatar
Wenzel Jakob committed
520
521
522
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
523
524
    bool load(handle src, bool convert) {
        if (!PyTuple_Check(src.ptr()) || PyTuple_Size(src.ptr()) != 2)
Wenzel Jakob's avatar
Wenzel Jakob committed
525
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
526
527
        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
528
529
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
530
531
532
    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);
533
        if (!o1 || !o2)
Wenzel Jakob's avatar
Wenzel Jakob committed
534
535
536
537
538
            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
539
540
    }

541
542
    static PYBIND11_DESCR name() {
        return type_descr(
543
544
            _("(") + type_caster<typename intrinsic_type<T1>::type>::name() +
            _(", ") + type_caster<typename intrinsic_type<T2>::type>::name() + _(")"));
Wenzel Jakob's avatar
Wenzel Jakob committed
545
546
    }

547
548
    template <typename T> using cast_op_type = type;

Wenzel Jakob's avatar
Wenzel Jakob committed
549
    operator type() {
550
551
        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
552
553
    }
protected:
554
555
    type_caster<typename intrinsic_type<T1>::type> first;
    type_caster<typename intrinsic_type<T2>::type> second;
Wenzel Jakob's avatar
Wenzel Jakob committed
556
557
};

558
template <typename... Tuple> class type_caster<std::tuple<Tuple...>> {
Wenzel Jakob's avatar
Wenzel Jakob committed
559
560
561
562
    typedef std::tuple<Tuple...> type;
public:
    enum { size = sizeof...(Tuple) };

Wenzel Jakob's avatar
Wenzel Jakob committed
563
    bool load(handle src, bool convert) {
Wenzel Jakob's avatar
Wenzel Jakob committed
564
        return load(src, convert, typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
565
566
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
567
    static handle cast(const type &src, return_value_policy policy, handle parent) {
Wenzel Jakob's avatar
Wenzel Jakob committed
568
        return cast(src, policy, parent, typename make_index_sequence<size>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
569
570
    }

571
572
573
    static PYBIND11_DESCR name() {
        return type_descr(
               _("(") +
574
               detail::concat(type_caster<typename intrinsic_type<Tuple>::type>::name()...) +
575
               _(")"));
Wenzel Jakob's avatar
Wenzel Jakob committed
576
577
    }

578
579
    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
580
581
    }

582
    template <typename ReturnValue, typename Func> typename std::enable_if<std::is_void<ReturnValue>::value, void_type>::type call(Func &&f) {
583
        call<ReturnValue>(std::forward<Func>(f), typename make_index_sequence<sizeof...(Tuple)>::type());
584
        return void_type();
Wenzel Jakob's avatar
Wenzel Jakob committed
585
586
    }

587
588
    template <typename T> using cast_op_type = type;

Wenzel Jakob's avatar
Wenzel Jakob committed
589
    operator type() {
Wenzel Jakob's avatar
Wenzel Jakob committed
590
        return cast(typename make_index_sequence<sizeof...(Tuple)>::type());
Wenzel Jakob's avatar
Wenzel Jakob committed
591
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
592

Wenzel Jakob's avatar
Wenzel Jakob committed
593
protected:
594
    template <typename ReturnValue, typename Func, size_t ... Index> ReturnValue call(Func &&f, index_sequence<Index...>) {
595
596
        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
597
598
599
    }

    template <size_t ... Index> type cast(index_sequence<Index...>) {
600
601
        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
602
603
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
604
605
    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
606
            return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
607
608
        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
609
        }};
610
        (void) convert; /* avoid a warning when the tuple is empty */
Wenzel Jakob's avatar
Wenzel Jakob committed
611
        for (bool r : success)
Wenzel Jakob's avatar
Wenzel Jakob committed
612
613
614
615
616
617
            if (!r)
                return false;
        return true;
    }

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

protected:
633
    std::tuple<type_caster<typename intrinsic_type<Tuple>::type>...> value;
Wenzel Jakob's avatar
Wenzel Jakob committed
634
635
636
637
638
};

/// 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:
639
640
641
642
643
    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;
644

Wenzel Jakob's avatar
Wenzel Jakob committed
645
    bool load(handle src, bool convert) {
646
        if (!src || !typeinfo) {
Wenzel Jakob's avatar
Wenzel Jakob committed
647
            return false;
648
649
650
651
        } 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
652
            auto inst = (instance<type, holder_type> *) src.ptr();
653
            value = (void *) inst->value;
654
655
656
            holder = inst->holder;
            return true;
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
657

658
659
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
Wenzel Jakob's avatar
Wenzel Jakob committed
660
661
                temp = object(converter(src.ptr(), typeinfo->type), false);
                if (load(temp, false))
662
663
664
665
                    return true;
            }
        }
        return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
666
    }
667

Wenzel Jakob's avatar
Wenzel Jakob committed
668
669
670
    explicit operator type*() { return this->value; }
    explicit operator type&() { return *(this->value); }
    explicit operator holder_type*() { return &holder; }
671

672
673
674
675
676
677
678
679
    // 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
680
    static handle cast(const holder_type &src, return_value_policy policy, handle parent) {
681
        return type_caster_generic::cast(
682
683
684
            src.get(), policy, parent,
            src.get() ? &typeid(*src.get()) : nullptr, &typeid(type),
            &copy_constructor, &src);
685
686
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
687
688
689
690
protected:
    holder_type holder;
};

691
692
693
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); } };

694
695
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
696
public:
697
    template <typename T = type, typename std::enable_if<std::is_same<T, handle>::value, int>::type = 0>
Wenzel Jakob's avatar
Wenzel Jakob committed
698
    bool load(handle src, bool /* convert */) { value = src; return value.check(); }
699
700

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

Wenzel Jakob's avatar
Wenzel Jakob committed
703
704
    static handle cast(const handle &src, return_value_policy /* policy */, handle /* parent */) {
        return src.inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
705
    }
706
    PYBIND11_TYPE_CASTER(type, handle_type_name<type>::name());
Wenzel Jakob's avatar
Wenzel Jakob committed
707
708
709
710
};

NAMESPACE_END(detail)

Wenzel Jakob's avatar
Wenzel Jakob committed
711
template <typename T> inline T cast(handle handle) {
712
    detail::type_caster<typename detail::intrinsic_type<T>::type> conv;
Wenzel Jakob's avatar
Wenzel Jakob committed
713
    if (!conv.load(handle, true))
Wenzel Jakob's avatar
Wenzel Jakob committed
714
        throw cast_error("Unable to cast Python object to C++ type");
715
    return (T) conv;
Wenzel Jakob's avatar
Wenzel Jakob committed
716
717
}

718
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
719
720
    if (policy == return_value_policy::automatic)
        policy = std::is_pointer<T>::value ? return_value_policy::take_ownership : return_value_policy::copy;
721
722
    else if (policy == return_value_policy::automatic_reference)
        policy = std::is_pointer<T>::value ? return_value_policy::reference : return_value_policy::copy;
723
    return object(detail::type_caster<typename detail::intrinsic_type<T>::type>::cast(value, policy, parent), false);
Wenzel Jakob's avatar
Wenzel Jakob committed
724
725
}

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

729
730
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
731
    const size_t size = sizeof...(Args);
Wenzel Jakob's avatar
Wenzel Jakob committed
732
    std::array<object, size> args {
733
        { object(detail::type_caster<typename detail::intrinsic_type<Args>::type>::cast(
734
            std::forward<Args>(args_), policy, nullptr), false)... }
Wenzel Jakob's avatar
Wenzel Jakob committed
735
    };
Wenzel Jakob's avatar
Wenzel Jakob committed
736
737
    for (auto &arg_value : args)
        if (!arg_value)
738
739
            throw cast_error("make_tuple(): unable to convert arguments to Python objects");
    tuple result(size);
Wenzel Jakob's avatar
Wenzel Jakob committed
740
    int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
741
    for (auto &arg_value : args)
742
743
744
745
746
        PyTuple_SET_ITEM(result.ptr(), counter++, arg_value.release().ptr());
    return result;
}

template <typename... Args> inline object handle::call(Args&&... args) const {
747
    tuple args_tuple = pybind11::make_tuple(std::forward<Args>(args)...);
Wenzel Jakob's avatar
Wenzel Jakob committed
748
749
    object result(PyObject_CallObject(m_ptr, args_tuple.ptr()), false);
    if (!result)
750
        throw error_already_set();
Wenzel Jakob's avatar
Wenzel Jakob committed
751
    return result;
Wenzel Jakob's avatar
Wenzel Jakob committed
752
753
}

754
NAMESPACE_END(pybind11)