Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 1 | /* |
Wenzel Jakob | 8f4eb00 | 2015-10-15 18:13:33 +0200 | [diff] [blame] | 2 | pybind11/common.h -- Basic macros |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 3 | |
Wenzel Jakob | 8cb6cb3 | 2016-04-17 20:21:41 +0200 | [diff] [blame] | 4 | Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch> |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 5 | |
| 6 | All rights reserved. Use of this source code is governed by a |
| 7 | BSD-style license that can be found in the LICENSE file. |
| 8 | */ |
| 9 | |
Wenzel Jakob | bd4a529 | 2015-07-11 17:41:48 +0200 | [diff] [blame] | 10 | #pragma once |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 11 | |
| 12 | #if !defined(NAMESPACE_BEGIN) |
Wenzel Jakob | 53b2654 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 13 | # define NAMESPACE_BEGIN(name) namespace name { |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 14 | #endif |
| 15 | #if !defined(NAMESPACE_END) |
Wenzel Jakob | 53b2654 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 16 | # define NAMESPACE_END(name) } |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 17 | #endif |
| 18 | |
Jason Rhinelander | f1b44a0 | 2016-11-04 09:49:37 -0400 | [diff] [blame] | 19 | // Neither MSVC nor Intel support enough of C++14 yet (in particular, as of MSVC 2015 and ICC 17 |
| 20 | // beta, neither support extended constexpr, which we rely on in descr.h), so don't enable pybind |
| 21 | // CPP14 features for them. |
| 22 | #if !defined(_MSC_VER) && !defined(__INTEL_COMPILER) |
| 23 | # if __cplusplus >= 201402L |
| 24 | # define PYBIND11_CPP14 |
| 25 | # if __cplusplus > 201402L /* Temporary: should be updated to >= the final C++17 value once known */ |
| 26 | # define PYBIND11_CPP17 |
| 27 | # endif |
| 28 | # endif |
| 29 | #endif |
| 30 | |
Wenzel Jakob | b1b7140 | 2015-10-18 16:48:30 +0200 | [diff] [blame] | 31 | #if !defined(PYBIND11_EXPORT) |
Wenzel Jakob | 53b2654 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 32 | # if defined(WIN32) || defined(_WIN32) |
| 33 | # define PYBIND11_EXPORT __declspec(dllexport) |
| 34 | # else |
| 35 | # define PYBIND11_EXPORT __attribute__ ((visibility("default"))) |
| 36 | # endif |
Wenzel Jakob | 0fb8528 | 2015-10-19 23:50:51 +0200 | [diff] [blame] | 37 | #endif |
| 38 | |
Wenzel Jakob | 53b2654 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 39 | #if defined(_MSC_VER) |
| 40 | # define PYBIND11_NOINLINE __declspec(noinline) |
| 41 | #else |
| 42 | # define PYBIND11_NOINLINE __attribute__ ((noinline)) |
| 43 | #endif |
| 44 | |
Jason Rhinelander | f1b44a0 | 2016-11-04 09:49:37 -0400 | [diff] [blame] | 45 | #if defined(PYBIND11_CPP14) |
Wenzel Jakob | bad589a | 2016-09-12 12:03:20 +0900 | [diff] [blame] | 46 | # define PYBIND11_DEPRECATED(reason) [[deprecated(reason)]] |
| 47 | #elif defined(__clang__) |
| 48 | # define PYBIND11_DEPRECATED(reason) __attribute__((deprecated(reason))) |
| 49 | #elif defined(__GNUG__) |
| 50 | # define PYBIND11_DEPRECATED(reason) __attribute__((deprecated)) |
| 51 | #elif defined(_MSC_VER) |
| 52 | # define PYBIND11_DEPRECATED(reason) __declspec(deprecated) |
| 53 | #endif |
| 54 | |
Wenzel Jakob | e33ef9c | 2017-01-01 13:55:06 +0100 | [diff] [blame] | 55 | #define PYBIND11_VERSION_MAJOR 2 |
Wenzel Jakob | fb4e104 | 2017-01-01 14:29:40 +0100 | [diff] [blame] | 56 | #define PYBIND11_VERSION_MINOR 1 |
| 57 | #define PYBIND11_VERSION_PATCH dev0 |
Wenzel Jakob | 1ae77fe | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 58 | |
Wenzel Jakob | 53b2654 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 59 | /// Include Python header, disable linking to pythonX_d.lib on Windows in debug mode |
| 60 | #if defined(_MSC_VER) |
| 61 | # define HAVE_ROUND |
| 62 | # pragma warning(push) |
| 63 | # pragma warning(disable: 4510 4610 4512 4005) |
Matthias Möller | c2d1d95 | 2017-01-31 16:54:49 +0100 | [diff] [blame] | 64 | # if defined(_DEBUG) |
Wenzel Jakob | 8cb6cb3 | 2016-04-17 20:21:41 +0200 | [diff] [blame] | 65 | # define PYBIND11_DEBUG_MARKER |
Wenzel Jakob | 53b2654 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 66 | # undef _DEBUG |
| 67 | # endif |
| 68 | #endif |
| 69 | |
| 70 | #include <Python.h> |
| 71 | #include <frameobject.h> |
Wenzel Jakob | 39e97e6 | 2016-04-25 03:26:15 +0200 | [diff] [blame] | 72 | #include <pythread.h> |
Wenzel Jakob | 53b2654 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 73 | |
Wenzel Jakob | a771e36 | 2016-07-19 17:47:59 +0200 | [diff] [blame] | 74 | #if defined(_WIN32) && (defined(min) || defined(max)) |
| 75 | # error Macro clash with min and max -- define NOMINMAX when compiling your program on Windows |
| 76 | #endif |
| 77 | |
| 78 | #if defined(isalnum) |
Wenzel Jakob | 53b2654 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 79 | # undef isalnum |
| 80 | # undef isalpha |
| 81 | # undef islower |
| 82 | # undef isspace |
| 83 | # undef isupper |
| 84 | # undef tolower |
| 85 | # undef toupper |
| 86 | #endif |
| 87 | |
| 88 | #if defined(_MSC_VER) |
Wenzel Jakob | 8cb6cb3 | 2016-04-17 20:21:41 +0200 | [diff] [blame] | 89 | # if defined(PYBIND11_DEBUG_MARKER) |
Wenzel Jakob | 53b2654 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 90 | # define _DEBUG |
Wenzel Jakob | 8cb6cb3 | 2016-04-17 20:21:41 +0200 | [diff] [blame] | 91 | # undef PYBIND11_DEBUG_MARKER |
| 92 | # endif |
Wenzel Jakob | 53b2654 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 93 | # pragma warning(pop) |
| 94 | #endif |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 95 | |
Wenzel Jakob | 06bd27f | 2016-11-15 06:37:39 +0100 | [diff] [blame] | 96 | #include <cstddef> |
Pim Schellart | 5a7d17f | 2016-06-17 17:35:59 -0400 | [diff] [blame] | 97 | #include <forward_list> |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 98 | #include <vector> |
| 99 | #include <string> |
| 100 | #include <stdexcept> |
Wenzel Jakob | a2f6fde | 2015-10-01 16:46:03 +0200 | [diff] [blame] | 101 | #include <unordered_set> |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 102 | #include <unordered_map> |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 103 | #include <memory> |
Wenzel Jakob | b6cf75d | 2016-01-29 11:39:32 +0100 | [diff] [blame] | 104 | #include <typeindex> |
Wenzel Jakob | 8e5dceb | 2016-09-11 20:00:40 +0900 | [diff] [blame] | 105 | #include <type_traits> |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 106 | |
Wenzel Jakob | 27e8e10 | 2016-01-17 22:36:37 +0100 | [diff] [blame] | 107 | #if PY_MAJOR_VERSION >= 3 /// Compatibility macros for various Python versions |
Wenzel Jakob | 48548ea | 2016-01-17 22:36:44 +0100 | [diff] [blame] | 108 | #define PYBIND11_INSTANCE_METHOD_NEW(ptr, class_) PyInstanceMethod_New(ptr) |
Wenzel Jakob | 27e8e10 | 2016-01-17 22:36:37 +0100 | [diff] [blame] | 109 | #define PYBIND11_BYTES_CHECK PyBytes_Check |
| 110 | #define PYBIND11_BYTES_FROM_STRING PyBytes_FromString |
| 111 | #define PYBIND11_BYTES_FROM_STRING_AND_SIZE PyBytes_FromStringAndSize |
| 112 | #define PYBIND11_BYTES_AS_STRING_AND_SIZE PyBytes_AsStringAndSize |
| 113 | #define PYBIND11_BYTES_AS_STRING PyBytes_AsString |
| 114 | #define PYBIND11_LONG_CHECK(o) PyLong_Check(o) |
| 115 | #define PYBIND11_LONG_AS_LONGLONG(o) PyLong_AsLongLong(o) |
| 116 | #define PYBIND11_LONG_AS_UNSIGNED_LONGLONG(o) PyLong_AsUnsignedLongLong(o) |
Wenzel Jakob | 56e9f49 | 2016-01-17 22:36:38 +0100 | [diff] [blame] | 117 | #define PYBIND11_BYTES_NAME "bytes" |
Wenzel Jakob | 27e8e10 | 2016-01-17 22:36:37 +0100 | [diff] [blame] | 118 | #define PYBIND11_STRING_NAME "str" |
| 119 | #define PYBIND11_SLICE_OBJECT PyObject |
Wenzel Jakob | d561cb0 | 2016-01-17 22:36:41 +0100 | [diff] [blame] | 120 | #define PYBIND11_FROM_STRING PyUnicode_FromString |
Ivan Smirnov | 1cdd171 | 2016-08-13 12:39:16 +0100 | [diff] [blame] | 121 | #define PYBIND11_STR_TYPE ::pybind11::str |
Wenzel Jakob | d561cb0 | 2016-01-17 22:36:41 +0100 | [diff] [blame] | 122 | #define PYBIND11_OB_TYPE(ht_type) (ht_type).ob_base.ob_base.ob_type |
| 123 | #define PYBIND11_PLUGIN_IMPL(name) \ |
| 124 | extern "C" PYBIND11_EXPORT PyObject *PyInit_##name() |
Wenzel Jakob | 27e8e10 | 2016-01-17 22:36:37 +0100 | [diff] [blame] | 125 | #else |
Wenzel Jakob | 48548ea | 2016-01-17 22:36:44 +0100 | [diff] [blame] | 126 | #define PYBIND11_INSTANCE_METHOD_NEW(ptr, class_) PyMethod_New(ptr, nullptr, class_) |
Wenzel Jakob | 27e8e10 | 2016-01-17 22:36:37 +0100 | [diff] [blame] | 127 | #define PYBIND11_BYTES_CHECK PyString_Check |
| 128 | #define PYBIND11_BYTES_FROM_STRING PyString_FromString |
| 129 | #define PYBIND11_BYTES_FROM_STRING_AND_SIZE PyString_FromStringAndSize |
| 130 | #define PYBIND11_BYTES_AS_STRING_AND_SIZE PyString_AsStringAndSize |
| 131 | #define PYBIND11_BYTES_AS_STRING PyString_AsString |
| 132 | #define PYBIND11_LONG_CHECK(o) (PyInt_Check(o) || PyLong_Check(o)) |
| 133 | #define PYBIND11_LONG_AS_LONGLONG(o) (PyInt_Check(o) ? (long long) PyLong_AsLong(o) : PyLong_AsLongLong(o)) |
| 134 | #define PYBIND11_LONG_AS_UNSIGNED_LONGLONG(o) (PyInt_Check(o) ? (unsigned long long) PyLong_AsUnsignedLong(o) : PyLong_AsUnsignedLongLong(o)) |
Wenzel Jakob | 56e9f49 | 2016-01-17 22:36:38 +0100 | [diff] [blame] | 135 | #define PYBIND11_BYTES_NAME "str" |
Wenzel Jakob | 27e8e10 | 2016-01-17 22:36:37 +0100 | [diff] [blame] | 136 | #define PYBIND11_STRING_NAME "unicode" |
| 137 | #define PYBIND11_SLICE_OBJECT PySliceObject |
Wenzel Jakob | d561cb0 | 2016-01-17 22:36:41 +0100 | [diff] [blame] | 138 | #define PYBIND11_FROM_STRING PyString_FromString |
Ivan Smirnov | 1cdd171 | 2016-08-13 12:39:16 +0100 | [diff] [blame] | 139 | #define PYBIND11_STR_TYPE ::pybind11::bytes |
Wenzel Jakob | d561cb0 | 2016-01-17 22:36:41 +0100 | [diff] [blame] | 140 | #define PYBIND11_OB_TYPE(ht_type) (ht_type).ob_type |
| 141 | #define PYBIND11_PLUGIN_IMPL(name) \ |
Alexander Stukowski | 05bc1ff | 2017-01-13 11:12:22 +0100 | [diff] [blame] | 142 | static PyObject *pybind11_init_wrapper(); \ |
| 143 | extern "C" PYBIND11_EXPORT void init##name() { \ |
| 144 | (void)pybind11_init_wrapper(); \ |
| 145 | } \ |
| 146 | PyObject *pybind11_init_wrapper() |
Wenzel Jakob | 27e8e10 | 2016-01-17 22:36:37 +0100 | [diff] [blame] | 147 | #endif |
Wenzel Jakob | 5708221 | 2015-09-04 23:42:12 +0200 | [diff] [blame] | 148 | |
Wenzel Jakob | fbafdea | 2016-04-25 15:02:43 +0200 | [diff] [blame] | 149 | #if PY_VERSION_HEX >= 0x03050000 && PY_VERSION_HEX < 0x03050200 |
| 150 | extern "C" { |
| 151 | struct _Py_atomic_address { void *value; }; |
| 152 | PyAPI_DATA(_Py_atomic_address) _PyThreadState_Current; |
Ivan Smirnov | 3ae5bd7 | 2016-06-17 22:29:10 +0100 | [diff] [blame] | 153 | } |
Wenzel Jakob | fbafdea | 2016-04-25 15:02:43 +0200 | [diff] [blame] | 154 | #endif |
| 155 | |
Wenzel Jakob | d561cb0 | 2016-01-17 22:36:41 +0100 | [diff] [blame] | 156 | #define PYBIND11_TRY_NEXT_OVERLOAD ((PyObject *) 1) // special failure return code |
Wenzel Jakob | 77586fd | 2016-03-06 13:38:18 +0100 | [diff] [blame] | 157 | #define PYBIND11_STRINGIFY(x) #x |
| 158 | #define PYBIND11_TOSTRING(x) PYBIND11_STRINGIFY(x) |
| 159 | #define PYBIND11_INTERNALS_ID "__pybind11_" \ |
| 160 | PYBIND11_TOSTRING(PYBIND11_VERSION_MAJOR) "_" PYBIND11_TOSTRING(PYBIND11_VERSION_MINOR) "__" |
Wenzel Jakob | d561cb0 | 2016-01-17 22:36:41 +0100 | [diff] [blame] | 161 | |
Dean Moldovan | 57a9bbc | 2017-01-31 16:54:08 +0100 | [diff] [blame] | 162 | /** \rst |
| 163 | This macro creates the entry point that will be invoked when the Python interpreter |
| 164 | imports a plugin library. Please create a `module` in the function body and return |
| 165 | the pointer to its underlying Python object at the end. |
| 166 | |
| 167 | .. code-block:: cpp |
| 168 | |
| 169 | PYBIND11_PLUGIN(example) { |
| 170 | pybind11::module m("example", "pybind11 example plugin"); |
| 171 | /// Set up bindings here |
| 172 | return m.ptr(); |
| 173 | } |
| 174 | \endrst */ |
Wenzel Jakob | 4c00fd9 | 2016-10-09 19:40:15 +0200 | [diff] [blame] | 175 | #define PYBIND11_PLUGIN(name) \ |
| 176 | static PyObject *pybind11_init(); \ |
| 177 | PYBIND11_PLUGIN_IMPL(name) { \ |
| 178 | int major, minor; \ |
| 179 | if (sscanf(Py_GetVersion(), "%i.%i", &major, &minor) != 2) { \ |
| 180 | PyErr_SetString(PyExc_ImportError, "Can't parse Python version."); \ |
| 181 | return nullptr; \ |
| 182 | } else if (major != PY_MAJOR_VERSION || minor != PY_MINOR_VERSION) { \ |
| 183 | PyErr_Format(PyExc_ImportError, \ |
| 184 | "Python version mismatch: module was compiled for " \ |
| 185 | "version %i.%i, while the interpreter is running " \ |
| 186 | "version %i.%i.", PY_MAJOR_VERSION, PY_MINOR_VERSION, \ |
| 187 | major, minor); \ |
| 188 | return nullptr; \ |
| 189 | } \ |
| 190 | try { \ |
| 191 | return pybind11_init(); \ |
| 192 | } catch (const std::exception &e) { \ |
| 193 | PyErr_SetString(PyExc_ImportError, e.what()); \ |
| 194 | return nullptr; \ |
| 195 | } \ |
| 196 | } \ |
Wenzel Jakob | d561cb0 | 2016-01-17 22:36:41 +0100 | [diff] [blame] | 197 | PyObject *pybind11_init() |
| 198 | |
Jason Rhinelander | 6e036e7 | 2016-12-13 20:06:41 -0500 | [diff] [blame] | 199 | // Function return value and argument type deduction support. When compiling under C++17 these |
| 200 | // differ as C++17 makes the noexcept specifier part of the function type, while it is not part of |
| 201 | // the type under earlier standards. |
| 202 | #ifdef __cpp_noexcept_function_type |
| 203 | # define PYBIND11_NOEXCEPT_TPL_ARG , bool NoExceptions |
| 204 | # define PYBIND11_NOEXCEPT_SPECIFIER noexcept(NoExceptions) |
| 205 | #else |
| 206 | # define PYBIND11_NOEXCEPT_TPL_ARG |
| 207 | # define PYBIND11_NOEXCEPT_SPECIFIER |
| 208 | #endif |
| 209 | |
Wenzel Jakob | 8f4eb00 | 2015-10-15 18:13:33 +0200 | [diff] [blame] | 210 | NAMESPACE_BEGIN(pybind11) |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 211 | |
Wenzel Jakob | 06bd27f | 2016-11-15 06:37:39 +0100 | [diff] [blame] | 212 | using ssize_t = Py_ssize_t; |
| 213 | using size_t = std::size_t; |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 214 | |
| 215 | /// Approach used to cast a previously unknown C++ instance into a Python object |
Wenzel Jakob | 178c8a8 | 2016-05-10 15:59:01 +0100 | [diff] [blame] | 216 | enum class return_value_policy : uint8_t { |
Wenzel Jakob | f7b5874 | 2016-04-25 23:04:27 +0200 | [diff] [blame] | 217 | /** This is the default return value policy, which falls back to the policy |
| 218 | return_value_policy::take_ownership when the return value is a pointer. |
| 219 | Otherwise, it uses return_value::move or return_value::copy for rvalue |
| 220 | and lvalue references, respectively. See below for a description of what |
| 221 | all of these different policies do. */ |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 222 | automatic = 0, |
Wenzel Jakob | 7d0162a | 2016-04-25 03:24:46 +0200 | [diff] [blame] | 223 | |
Wenzel Jakob | f7b5874 | 2016-04-25 23:04:27 +0200 | [diff] [blame] | 224 | /** As above, but use policy return_value_policy::reference when the return |
Wenzel Jakob | 37e1f61 | 2016-06-22 14:29:13 +0200 | [diff] [blame] | 225 | value is a pointer. This is the default conversion policy for function |
| 226 | arguments when calling Python functions manually from C++ code (i.e. via |
| 227 | handle::operator()). You probably won't need to use this. */ |
Wenzel Jakob | 8bd31c7 | 2016-04-14 14:26:13 +0200 | [diff] [blame] | 228 | automatic_reference, |
Wenzel Jakob | 7d0162a | 2016-04-25 03:24:46 +0200 | [diff] [blame] | 229 | |
Wenzel Jakob | f7b5874 | 2016-04-25 23:04:27 +0200 | [diff] [blame] | 230 | /** Reference an existing object (i.e. do not create a new copy) and take |
| 231 | ownership. Python will call the destructor and delete operator when the |
| 232 | object’s reference count reaches zero. Undefined behavior ensues when |
| 233 | the C++ side does the same.. */ |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 234 | take_ownership, |
Wenzel Jakob | 7d0162a | 2016-04-25 03:24:46 +0200 | [diff] [blame] | 235 | |
Wenzel Jakob | f7b5874 | 2016-04-25 23:04:27 +0200 | [diff] [blame] | 236 | /** Create a new copy of the returned object, which will be owned by |
| 237 | Python. This policy is comparably safe because the lifetimes of the two |
| 238 | instances are decoupled. */ |
| 239 | copy, |
| 240 | |
| 241 | /** Use std::move to move the return value contents into a new instance |
| 242 | that will be owned by Python. This policy is comparably safe because the |
| 243 | lifetimes of the two instances (move source and destination) are |
| 244 | decoupled. */ |
| 245 | move, |
| 246 | |
| 247 | /** Reference an existing object, but do not take ownership. The C++ side |
| 248 | is responsible for managing the object’s lifetime and deallocating it |
| 249 | when it is no longer used. Warning: undefined behavior will ensue when |
Wenzel Jakob | e84f557 | 2016-04-26 23:19:19 +0200 | [diff] [blame] | 250 | the C++ side deletes an object that is still referenced and used by |
| 251 | Python. */ |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 252 | reference, |
Wenzel Jakob | 7d0162a | 2016-04-25 03:24:46 +0200 | [diff] [blame] | 253 | |
Wenzel Jakob | e84f557 | 2016-04-26 23:19:19 +0200 | [diff] [blame] | 254 | /** This policy only applies to methods and properties. It references the |
| 255 | object without taking ownership similar to the above |
| 256 | return_value_policy::reference policy. In contrast to that policy, the |
| 257 | function or property’s implicit this argument (called the parent) is |
| 258 | considered to be the the owner of the return value (the child). |
| 259 | pybind11 then couples the lifetime of the parent to the child via a |
| 260 | reference relationship that ensures that the parent cannot be garbage |
| 261 | collected while Python is still using the child. More advanced |
| 262 | variations of this scheme are also possible using combinations of |
| 263 | return_value_policy::reference and the keep_alive call policy */ |
Wenzel Jakob | f7b5874 | 2016-04-25 23:04:27 +0200 | [diff] [blame] | 264 | reference_internal |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 265 | }; |
| 266 | |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 267 | /// Information record describing a Python buffer object |
| 268 | struct buffer_info { |
Jason Newton | 3718c38 | 2016-09-02 17:10:02 -0400 | [diff] [blame] | 269 | void *ptr = nullptr; // Pointer to the underlying storage |
| 270 | size_t itemsize = 0; // Size of individual items in bytes |
| 271 | size_t size = 0; // Total number of entries |
Ivan Smirnov | 5e71e17 | 2016-06-26 12:42:34 +0100 | [diff] [blame] | 272 | std::string format; // For homogeneous buffers, this should be set to format_descriptor<T>::format() |
Jason Newton | 3718c38 | 2016-09-02 17:10:02 -0400 | [diff] [blame] | 273 | size_t ndim = 0; // Number of dimensions |
Wenzel Jakob | e45b290 | 2016-01-17 22:36:41 +0100 | [diff] [blame] | 274 | std::vector<size_t> shape; // Shape of the tensor (1 entry per dimension) |
| 275 | std::vector<size_t> strides; // Number of entries between adjacent entries (for each per dimension) |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 276 | |
Wenzel Jakob | f3be07c | 2016-09-04 23:03:48 +0900 | [diff] [blame] | 277 | buffer_info() { } |
Ivan Smirnov | 98ba98c | 2016-07-24 20:29:44 +0100 | [diff] [blame] | 278 | |
Wenzel Jakob | 0a07805 | 2016-05-29 13:40:40 +0200 | [diff] [blame] | 279 | buffer_info(void *ptr, size_t itemsize, const std::string &format, size_t ndim, |
Wenzel Jakob | d4258ba | 2015-07-26 16:33:49 +0200 | [diff] [blame] | 280 | const std::vector<size_t> &shape, const std::vector<size_t> &strides) |
Wenzel Jakob | d33361a | 2016-01-17 22:36:40 +0100 | [diff] [blame] | 281 | : ptr(ptr), itemsize(itemsize), size(1), format(format), |
| 282 | ndim(ndim), shape(shape), strides(strides) { |
Wenzel Jakob | 0a07805 | 2016-05-29 13:40:40 +0200 | [diff] [blame] | 283 | for (size_t i = 0; i < ndim; ++i) |
| 284 | size *= shape[i]; |
Wenzel Jakob | d4258ba | 2015-07-26 16:33:49 +0200 | [diff] [blame] | 285 | } |
Wenzel Jakob | d33361a | 2016-01-17 22:36:40 +0100 | [diff] [blame] | 286 | |
Ivan Smirnov | 98ba98c | 2016-07-24 20:29:44 +0100 | [diff] [blame] | 287 | buffer_info(void *ptr, size_t itemsize, const std::string &format, size_t size) |
| 288 | : buffer_info(ptr, itemsize, format, 1, std::vector<size_t> { size }, |
| 289 | std::vector<size_t> { itemsize }) { } |
| 290 | |
Jason Rhinelander | 12d7660 | 2016-10-16 16:27:42 -0400 | [diff] [blame] | 291 | explicit buffer_info(Py_buffer *view, bool ownview = true) |
Wenzel Jakob | 0a07805 | 2016-05-29 13:40:40 +0200 | [diff] [blame] | 292 | : ptr(view->buf), itemsize((size_t) view->itemsize), size(1), format(view->format), |
Jason Newton | 514c6da | 2016-09-02 17:10:25 -0400 | [diff] [blame] | 293 | ndim((size_t) view->ndim), shape((size_t) view->ndim), strides((size_t) view->ndim), view(view), ownview(ownview) { |
Wenzel Jakob | 0a07805 | 2016-05-29 13:40:40 +0200 | [diff] [blame] | 294 | for (size_t i = 0; i < (size_t) view->ndim; ++i) { |
Wenzel Jakob | d33361a | 2016-01-17 22:36:40 +0100 | [diff] [blame] | 295 | shape[i] = (size_t) view->shape[i]; |
| 296 | strides[i] = (size_t) view->strides[i]; |
| 297 | size *= shape[i]; |
| 298 | } |
| 299 | } |
| 300 | |
Jason Newton | 10d46e7 | 2016-09-02 18:39:47 -0400 | [diff] [blame] | 301 | buffer_info(const buffer_info &) = delete; |
| 302 | buffer_info& operator=(const buffer_info &) = delete; |
| 303 | |
Wenzel Jakob | f3be07c | 2016-09-04 23:03:48 +0900 | [diff] [blame] | 304 | buffer_info(buffer_info &&other) { |
Jason Newton | 4764698 | 2016-09-02 17:11:30 -0400 | [diff] [blame] | 305 | (*this) = std::move(other); |
| 306 | } |
| 307 | |
Wenzel Jakob | cc4e406 | 2016-09-05 08:25:10 +0900 | [diff] [blame] | 308 | buffer_info& operator=(buffer_info &&rhs) { |
Jason Newton | 4764698 | 2016-09-02 17:11:30 -0400 | [diff] [blame] | 309 | ptr = rhs.ptr; |
| 310 | itemsize = rhs.itemsize; |
| 311 | size = rhs.size; |
| 312 | format = std::move(rhs.format); |
| 313 | ndim = rhs.ndim; |
| 314 | shape = std::move(rhs.shape); |
| 315 | strides = std::move(rhs.strides); |
| 316 | std::swap(view, rhs.view); |
| 317 | std::swap(ownview, rhs.ownview); |
| 318 | return *this; |
| 319 | } |
| 320 | |
Wenzel Jakob | d33361a | 2016-01-17 22:36:40 +0100 | [diff] [blame] | 321 | ~buffer_info() { |
Jason Newton | 514c6da | 2016-09-02 17:10:25 -0400 | [diff] [blame] | 322 | if (view && ownview) { PyBuffer_Release(view); delete view; } |
Wenzel Jakob | d33361a | 2016-01-17 22:36:40 +0100 | [diff] [blame] | 323 | } |
Ivan Smirnov | a7e62e1 | 2016-06-19 14:37:55 +0100 | [diff] [blame] | 324 | |
Wenzel Jakob | d33361a | 2016-01-17 22:36:40 +0100 | [diff] [blame] | 325 | private: |
| 326 | Py_buffer *view = nullptr; |
Jason Newton | 514c6da | 2016-09-02 17:10:25 -0400 | [diff] [blame] | 327 | bool ownview = false; |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 328 | }; |
| 329 | |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 330 | NAMESPACE_BEGIN(detail) |
| 331 | |
Wenzel Jakob | e611823 | 2016-05-05 21:54:24 +0200 | [diff] [blame] | 332 | inline static constexpr int log2(size_t n, int k = 0) { return (n <= 1) ? k : log2(n >> 1, k + 1); } |
Wenzel Jakob | 876eeab | 2016-05-04 22:22:48 +0200 | [diff] [blame] | 333 | |
Wenzel Jakob | 96c1053 | 2015-10-01 16:42:15 +0200 | [diff] [blame] | 334 | inline std::string error_string(); |
| 335 | |
Wenzel Jakob | 88d1d04 | 2016-01-20 01:26:42 +0100 | [diff] [blame] | 336 | /// Core part of the 'instance' type which POD (needed to be able to use 'offsetof') |
| 337 | template <typename type> struct instance_essentials { |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 338 | PyObject_HEAD |
| 339 | type *value; |
Wenzel Jakob | 5f218b3 | 2016-01-17 22:36:39 +0100 | [diff] [blame] | 340 | PyObject *weakrefs; |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 341 | bool owned : 1; |
Jason Rhinelander | c07ec31 | 2016-11-06 13:12:48 -0500 | [diff] [blame] | 342 | bool holder_constructed : 1; |
Wenzel Jakob | 88d1d04 | 2016-01-20 01:26:42 +0100 | [diff] [blame] | 343 | }; |
| 344 | |
| 345 | /// PyObject wrapper around generic types, includes a special holder type that is responsible for lifetime management |
| 346 | template <typename type, typename holder_type = std::unique_ptr<type>> struct instance : instance_essentials<type> { |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 347 | holder_type holder; |
| 348 | }; |
| 349 | |
Wenzel Jakob | a2f6fde | 2015-10-01 16:46:03 +0200 | [diff] [blame] | 350 | struct overload_hash { |
Wenzel Jakob | 06bd27f | 2016-11-15 06:37:39 +0100 | [diff] [blame] | 351 | inline size_t operator()(const std::pair<const PyObject *, const char *>& v) const { |
Wenzel Jakob | a2f6fde | 2015-10-01 16:46:03 +0200 | [diff] [blame] | 352 | size_t value = std::hash<const void *>()(v.first); |
| 353 | value ^= std::hash<const void *>()(v.second) + 0x9e3779b9 + (value<<6) + (value>>2); |
| 354 | return value; |
| 355 | } |
| 356 | }; |
| 357 | |
Wenzel Jakob | 43398a8 | 2015-07-28 16:12:20 +0200 | [diff] [blame] | 358 | /// Internal data struture used to track registered instances and types |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 359 | struct internals { |
Jason Rhinelander | 1b05ce5 | 2016-08-09 17:57:59 -0400 | [diff] [blame] | 360 | std::unordered_map<std::type_index, void*> registered_types_cpp; // std::type_index -> type_info |
| 361 | std::unordered_map<const void *, void*> registered_types_py; // PyTypeObject* -> type_info |
| 362 | std::unordered_multimap<const void *, void*> registered_instances; // void * -> PyObject* |
Wenzel Jakob | a2f6fde | 2015-10-01 16:46:03 +0200 | [diff] [blame] | 363 | std::unordered_set<std::pair<const PyObject *, const char *>, overload_hash> inactive_overload_cache; |
Ivan Smirnov | c275ee6 | 2016-10-20 16:09:31 +0100 | [diff] [blame] | 364 | std::unordered_map<std::type_index, std::vector<bool (*)(PyObject *, void *&)>> direct_conversions; |
Pim Schellart | 5a7d17f | 2016-06-17 17:35:59 -0400 | [diff] [blame] | 365 | std::forward_list<void (*) (std::exception_ptr)> registered_exception_translators; |
Ivan Smirnov | 2dbf029 | 2016-10-31 14:11:10 +0000 | [diff] [blame] | 366 | std::unordered_map<std::string, void *> shared_data; // Custom data to be shared across extensions |
Wenzel Jakob | 39e97e6 | 2016-04-25 03:26:15 +0200 | [diff] [blame] | 367 | #if defined(WITH_THREAD) |
Boris Schäling | 20ee935 | 2016-05-28 12:26:18 +0200 | [diff] [blame] | 368 | decltype(PyThread_create_key()) tstate = 0; // Usually an int but a long on Cygwin64 with Python 3.x |
Wenzel Jakob | 39e97e6 | 2016-04-25 03:26:15 +0200 | [diff] [blame] | 369 | PyInterpreterState *istate = nullptr; |
| 370 | #endif |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 371 | }; |
| 372 | |
Wenzel Jakob | d4258ba | 2015-07-26 16:33:49 +0200 | [diff] [blame] | 373 | /// Return a reference to the current 'internals' information |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 374 | inline internals &get_internals(); |
| 375 | |
Jason Rhinelander | fa5d05e | 2016-12-12 18:11:49 -0500 | [diff] [blame] | 376 | /// from __cpp_future__ import (convenient aliases from C++14/17) |
Dean Moldovan | 8c85a85 | 2016-11-27 20:56:04 +0100 | [diff] [blame] | 377 | #ifdef PYBIND11_CPP14 |
Jason Rhinelander | fa5d05e | 2016-12-12 18:11:49 -0500 | [diff] [blame] | 378 | using std::enable_if_t; |
| 379 | using std::conditional_t; |
| 380 | #else |
| 381 | template <bool B, typename T = void> using enable_if_t = typename std::enable_if<B, T>::type; |
| 382 | template <bool B, typename T, typename F> using conditional_t = typename std::conditional<B, T, F>::type; |
| 383 | #endif |
| 384 | |
| 385 | /// Index sequences |
| 386 | #if defined(PYBIND11_CPP14) || defined(_MSC_VER) |
Dean Moldovan | 8c85a85 | 2016-11-27 20:56:04 +0100 | [diff] [blame] | 387 | using std::index_sequence; |
| 388 | using std::make_index_sequence; |
| 389 | #else |
Wenzel Jakob | d4258ba | 2015-07-26 16:33:49 +0200 | [diff] [blame] | 390 | template<size_t ...> struct index_sequence { }; |
Dean Moldovan | 8c85a85 | 2016-11-27 20:56:04 +0100 | [diff] [blame] | 391 | template<size_t N, size_t ...S> struct make_index_sequence_impl : make_index_sequence_impl <N - 1, N - 1, S...> { }; |
| 392 | template<size_t ...S> struct make_index_sequence_impl <0, S...> { typedef index_sequence<S...> type; }; |
| 393 | template<size_t N> using make_index_sequence = typename make_index_sequence_impl<N>::type; |
| 394 | #endif |
Wenzel Jakob | d4258ba | 2015-07-26 16:33:49 +0200 | [diff] [blame] | 395 | |
Jason Rhinelander | fa5d05e | 2016-12-12 18:11:49 -0500 | [diff] [blame] | 396 | #if defined(PYBIND11_CPP17) || defined(_MSC_VER) |
| 397 | using std::bool_constant; |
| 398 | using std::negation; |
| 399 | #else |
| 400 | template <bool B> using bool_constant = std::integral_constant<bool, B>; |
| 401 | template <class T> using negation = bool_constant<!T::value>; |
| 402 | #endif |
| 403 | |
Dean Moldovan | 57a9bbc | 2017-01-31 16:54:08 +0100 | [diff] [blame] | 404 | /// Compile-time all/any/none of that check the boolean value of all template types |
Jason Rhinelander | 6ae68fe | 2016-12-13 12:23:12 -0500 | [diff] [blame] | 405 | #ifdef PYBIND11_CPP17 |
| 406 | template <class... Ts> using all_of = bool_constant<(Ts::value && ...)>; |
| 407 | template <class... Ts> using any_of = bool_constant<(Ts::value || ...)>; |
| 408 | #elif !defined(_MSC_VER) |
Jason Rhinelander | fa5d05e | 2016-12-12 18:11:49 -0500 | [diff] [blame] | 409 | template <bool...> struct bools {}; |
| 410 | template <class... Ts> using all_of = std::is_same< |
| 411 | bools<Ts::value..., true>, |
| 412 | bools<true, Ts::value...>>; |
| 413 | template <class... Ts> using any_of = negation<all_of<negation<Ts>...>>; |
| 414 | #else |
| 415 | // MSVC has trouble with the above, but supports std::conjunction, which we can use instead (albeit |
| 416 | // at a slight loss of compilation efficiency). |
| 417 | template <class... Ts> using all_of = std::conjunction<Ts...>; |
| 418 | template <class... Ts> using any_of = std::disjunction<Ts...>; |
| 419 | #endif |
| 420 | template <class... Ts> using none_of = negation<any_of<Ts...>>; |
| 421 | |
Jason Rhinelander | f7f5bc8 | 2017-01-31 11:00:15 -0500 | [diff] [blame] | 422 | template <class T, template<class> class... Predicates> using satisfies_all_of = all_of<Predicates<T>...>; |
| 423 | template <class T, template<class> class... Predicates> using satisfies_any_of = any_of<Predicates<T>...>; |
| 424 | template <class T, template<class> class... Predicates> using satisfies_none_of = none_of<Predicates<T>...>; |
| 425 | |
Wenzel Jakob | d4258ba | 2015-07-26 16:33:49 +0200 | [diff] [blame] | 426 | /// Strip the class from a method type |
Wenzel Jakob | ad69634 | 2016-05-03 13:28:40 +0200 | [diff] [blame] | 427 | template <typename T> struct remove_class { }; |
Wenzel Jakob | d4258ba | 2015-07-26 16:33:49 +0200 | [diff] [blame] | 428 | template <typename C, typename R, typename... A> struct remove_class<R (C::*)(A...)> { typedef R type(A...); }; |
| 429 | template <typename C, typename R, typename... A> struct remove_class<R (C::*)(A...) const> { typedef R type(A...); }; |
| 430 | |
| 431 | /// Helper template to strip away type modifiers |
Wenzel Jakob | 4177ed4 | 2016-01-17 22:36:38 +0100 | [diff] [blame] | 432 | template <typename T> struct intrinsic_type { typedef T type; }; |
| 433 | template <typename T> struct intrinsic_type<const T> { typedef typename intrinsic_type<T>::type type; }; |
| 434 | template <typename T> struct intrinsic_type<T*> { typedef typename intrinsic_type<T>::type type; }; |
| 435 | template <typename T> struct intrinsic_type<T&> { typedef typename intrinsic_type<T>::type type; }; |
| 436 | template <typename T> struct intrinsic_type<T&&> { typedef typename intrinsic_type<T>::type type; }; |
| 437 | template <typename T, size_t N> struct intrinsic_type<const T[N]> { typedef typename intrinsic_type<T>::type type; }; |
| 438 | template <typename T, size_t N> struct intrinsic_type<T[N]> { typedef typename intrinsic_type<T>::type type; }; |
Dean Moldovan | c743e1b | 2016-08-29 03:05:42 +0200 | [diff] [blame] | 439 | template <typename T> using intrinsic_t = typename intrinsic_type<T>::type; |
Wenzel Jakob | d4258ba | 2015-07-26 16:33:49 +0200 | [diff] [blame] | 440 | |
| 441 | /// Helper type to replace 'void' in some expressions |
| 442 | struct void_type { }; |
Wenzel Jakob | 281aa0e | 2015-07-30 15:29:00 +0200 | [diff] [blame] | 443 | |
Dean Moldovan | 719c173 | 2016-11-27 18:19:34 +0100 | [diff] [blame] | 444 | /// Helper template which holds a list of types |
| 445 | template <typename...> struct type_list { }; |
| 446 | |
Dean Moldovan | c743e1b | 2016-08-29 03:05:42 +0200 | [diff] [blame] | 447 | /// Compile-time integer sum |
| 448 | constexpr size_t constexpr_sum() { return 0; } |
| 449 | template <typename T, typename... Ts> |
| 450 | constexpr size_t constexpr_sum(T n, Ts... ns) { return size_t{n} + constexpr_sum(ns...); } |
| 451 | |
Jason Rhinelander | 34d308a | 2017-01-22 19:12:24 -0500 | [diff] [blame] | 452 | NAMESPACE_BEGIN(constexpr_impl) |
| 453 | /// Implementation details for constexpr functions |
| 454 | constexpr int first(int i) { return i; } |
| 455 | template <typename T, typename... Ts> |
| 456 | constexpr int first(int i, T v, Ts... vs) { return v ? i : first(i + 1, vs...); } |
| 457 | |
| 458 | constexpr int last(int /*i*/, int result) { return result; } |
| 459 | template <typename T, typename... Ts> |
| 460 | constexpr int last(int i, int result, T v, Ts... vs) { return last(i + 1, v ? i : result, vs...); } |
| 461 | NAMESPACE_END(constexpr_impl) |
| 462 | |
| 463 | /// Return the index of the first type in Ts which satisfies Predicate<T>. Returns sizeof...(Ts) if |
| 464 | /// none match. |
| 465 | template <template<typename> class Predicate, typename... Ts> |
| 466 | constexpr int constexpr_first() { return constexpr_impl::first(0, Predicate<Ts>::value...); } |
| 467 | |
| 468 | /// Return the index of the last type in Ts which satisfies Predicate<T>, or -1 if none match. |
| 469 | template <template<typename> class Predicate, typename... Ts> |
| 470 | constexpr int constexpr_last() { return constexpr_impl::last(0, -1, Predicate<Ts>::value...); } |
| 471 | |
Jason Rhinelander | 6b52c83 | 2016-09-06 12:27:00 -0400 | [diff] [blame] | 472 | // Extracts the first type from the template parameter pack matching the predicate, or Default if none match. |
| 473 | template <template<class> class Predicate, class Default, class... Ts> struct first_of; |
| 474 | template <template<class> class Predicate, class Default> struct first_of<Predicate, Default> { |
| 475 | using type = Default; |
Jason Rhinelander | 5fffe20 | 2016-09-06 12:17:06 -0400 | [diff] [blame] | 476 | }; |
Jason Rhinelander | 6b52c83 | 2016-09-06 12:27:00 -0400 | [diff] [blame] | 477 | template <template<class> class Predicate, class Default, class T, class... Ts> |
| 478 | struct first_of<Predicate, Default, T, Ts...> { |
Jason Rhinelander | 5fffe20 | 2016-09-06 12:17:06 -0400 | [diff] [blame] | 479 | using type = typename std::conditional< |
| 480 | Predicate<T>::value, |
| 481 | T, |
Jason Rhinelander | 6b52c83 | 2016-09-06 12:27:00 -0400 | [diff] [blame] | 482 | typename first_of<Predicate, Default, Ts...>::type |
Jason Rhinelander | 5fffe20 | 2016-09-06 12:17:06 -0400 | [diff] [blame] | 483 | >::type; |
| 484 | }; |
Jason Rhinelander | 6b52c83 | 2016-09-06 12:27:00 -0400 | [diff] [blame] | 485 | template <template<class> class Predicate, class Default, class... T> using first_of_t = typename first_of<Predicate, Default, T...>::type; |
Jason Rhinelander | 5fffe20 | 2016-09-06 12:17:06 -0400 | [diff] [blame] | 486 | |
Dean Moldovan | 56e86ed | 2016-09-04 21:30:08 +0200 | [diff] [blame] | 487 | /// Defer the evaluation of type T until types Us are instantiated |
| 488 | template <typename T, typename... /*Us*/> struct deferred_type { using type = T; }; |
| 489 | template <typename T, typename... Us> using deferred_t = typename deferred_type<T, Us...>::type; |
| 490 | |
Dean Moldovan | 71af3b0 | 2016-09-24 23:54:02 +0200 | [diff] [blame] | 491 | template <template<typename...> class Base> |
| 492 | struct is_template_base_of_impl { |
| 493 | template <typename... Us> static std::true_type check(Base<Us...> *); |
| 494 | static std::false_type check(...); |
| 495 | }; |
| 496 | |
| 497 | /// Check if a template is the base of a type. For example: |
| 498 | /// `is_template_base_of<Base, T>` is true if `struct T : Base<U> {}` where U can be anything |
| 499 | template <template<typename...> class Base, typename T> |
| 500 | #if !defined(_MSC_VER) |
| 501 | using is_template_base_of = decltype(is_template_base_of_impl<Base>::check((T*)nullptr)); |
| 502 | #else // MSVC2015 has trouble with decltype in template aliases |
| 503 | struct is_template_base_of : decltype(is_template_base_of_impl<Base>::check((T*)nullptr)) { }; |
| 504 | #endif |
| 505 | |
Dean Moldovan | 5d28dd1 | 2016-10-18 13:56:33 +0200 | [diff] [blame] | 506 | /// Check if T is std::shared_ptr<U> where U can be anything |
| 507 | template <typename T> struct is_shared_ptr : std::false_type { }; |
| 508 | template <typename U> struct is_shared_ptr<std::shared_ptr<U>> : std::true_type { }; |
| 509 | |
Dean Moldovan | c743e1b | 2016-08-29 03:05:42 +0200 | [diff] [blame] | 510 | /// Ignore that a variable is unused in compiler warnings |
| 511 | inline void ignore_unused(const int *) { } |
| 512 | |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 513 | NAMESPACE_END(detail) |
Wenzel Jakob | a2f6fde | 2015-10-01 16:46:03 +0200 | [diff] [blame] | 514 | |
Ivan Smirnov | 2dbf029 | 2016-10-31 14:11:10 +0000 | [diff] [blame] | 515 | /// Returns a named pointer that is shared among all extension modules (using the same |
| 516 | /// pybind11 version) running in the current interpreter. Names starting with underscores |
| 517 | /// are reserved for internal usage. Returns `nullptr` if no matching entry was found. |
| 518 | inline PYBIND11_NOINLINE void* get_shared_data(const std::string& name) { |
| 519 | auto& internals = detail::get_internals(); |
| 520 | auto it = internals.shared_data.find(name); |
| 521 | return it != internals.shared_data.end() ? it->second : nullptr; |
| 522 | } |
| 523 | |
| 524 | /// Set the shared data that can be later recovered by `get_shared_data()`. |
| 525 | inline PYBIND11_NOINLINE void *set_shared_data(const std::string& name, void *data) { |
| 526 | detail::get_internals().shared_data[name] = data; |
| 527 | return data; |
| 528 | } |
| 529 | |
| 530 | /// Returns a typed reference to a shared data entry (by using `get_shared_data()`) if |
| 531 | /// such entry exists. Otherwise, a new object of default-constructible type `T` is |
| 532 | /// added to the shared data under the given name and a reference to it is returned. |
| 533 | template<typename T> T& get_or_create_shared_data(const std::string& name) { |
| 534 | auto& internals = detail::get_internals(); |
| 535 | auto it = internals.shared_data.find(name); |
| 536 | T* ptr = (T*) (it != internals.shared_data.end() ? it->second : nullptr); |
| 537 | if (!ptr) { |
| 538 | ptr = new T(); |
| 539 | internals.shared_data[name] = ptr; |
| 540 | } |
| 541 | return *ptr; |
| 542 | } |
| 543 | |
Dean Moldovan | 135ba8d | 2016-09-10 11:58:02 +0200 | [diff] [blame] | 544 | /// Fetch and hold an error which was already set in Python |
| 545 | class error_already_set : public std::runtime_error { |
| 546 | public: |
| 547 | error_already_set() : std::runtime_error(detail::error_string()) { |
| 548 | PyErr_Fetch(&type, &value, &trace); |
| 549 | } |
Wenzel Jakob | fbec17c | 2016-11-24 12:30:11 +0100 | [diff] [blame] | 550 | |
| 551 | error_already_set(const error_already_set &) = delete; |
| 552 | |
| 553 | error_already_set(error_already_set &&e) |
| 554 | : std::runtime_error(e.what()), type(e.type), value(e.value), |
| 555 | trace(e.trace) { e.type = e.value = e.trace = nullptr; } |
| 556 | |
Wenzel Jakob | 8d396fc | 2016-11-24 23:11:02 +0100 | [diff] [blame] | 557 | inline ~error_already_set(); // implementation in pybind11.h |
Wenzel Jakob | 099d6e9 | 2016-11-24 18:52:31 +0100 | [diff] [blame] | 558 | |
| 559 | error_already_set& operator=(const error_already_set &) = delete; |
Dean Moldovan | 135ba8d | 2016-09-10 11:58:02 +0200 | [diff] [blame] | 560 | |
| 561 | /// Give the error back to Python |
| 562 | void restore() { PyErr_Restore(type, value, trace); type = value = trace = nullptr; } |
| 563 | |
| 564 | private: |
| 565 | PyObject *type, *value, *trace; |
| 566 | }; |
| 567 | |
Dean Moldovan | f69071c | 2016-09-10 14:43:28 +0200 | [diff] [blame] | 568 | /// C++ bindings of builtin Python exceptions |
| 569 | class builtin_exception : public std::runtime_error { |
| 570 | public: |
| 571 | using std::runtime_error::runtime_error; |
Dean Moldovan | 57a9bbc | 2017-01-31 16:54:08 +0100 | [diff] [blame] | 572 | /// Set the error using the Python C API |
| 573 | virtual void set_error() const = 0; |
Dean Moldovan | f69071c | 2016-09-10 14:43:28 +0200 | [diff] [blame] | 574 | }; |
| 575 | |
| 576 | #define PYBIND11_RUNTIME_EXCEPTION(name, type) \ |
| 577 | class name : public builtin_exception { public: \ |
| 578 | using builtin_exception::builtin_exception; \ |
| 579 | name() : name("") { } \ |
| 580 | void set_error() const override { PyErr_SetString(type, what()); } \ |
Wenzel Jakob | ad69634 | 2016-05-03 13:28:40 +0200 | [diff] [blame] | 581 | }; |
| 582 | |
Dean Moldovan | f69071c | 2016-09-10 14:43:28 +0200 | [diff] [blame] | 583 | PYBIND11_RUNTIME_EXCEPTION(stop_iteration, PyExc_StopIteration) |
| 584 | PYBIND11_RUNTIME_EXCEPTION(index_error, PyExc_IndexError) |
| 585 | PYBIND11_RUNTIME_EXCEPTION(key_error, PyExc_KeyError) |
| 586 | PYBIND11_RUNTIME_EXCEPTION(value_error, PyExc_ValueError) |
| 587 | PYBIND11_RUNTIME_EXCEPTION(type_error, PyExc_TypeError) |
| 588 | PYBIND11_RUNTIME_EXCEPTION(cast_error, PyExc_RuntimeError) /// Thrown when pybind11::cast or handle::call fail due to a type casting error |
| 589 | PYBIND11_RUNTIME_EXCEPTION(reference_cast_error, PyExc_RuntimeError) /// Used internally |
Wenzel Jakob | a2f6fde | 2015-10-01 16:46:03 +0200 | [diff] [blame] | 590 | |
Wenzel Jakob | fc92d82 | 2016-04-30 23:55:44 +0200 | [diff] [blame] | 591 | [[noreturn]] PYBIND11_NOINLINE inline void pybind11_fail(const char *reason) { throw std::runtime_error(reason); } |
| 592 | [[noreturn]] PYBIND11_NOINLINE inline void pybind11_fail(const std::string &reason) { throw std::runtime_error(reason); } |
Wenzel Jakob | 678d787 | 2016-01-17 22:36:41 +0100 | [diff] [blame] | 593 | |
Wenzel Jakob | 876eeab | 2016-05-04 22:22:48 +0200 | [diff] [blame] | 594 | template <typename T, typename SFINAE = void> struct format_descriptor { }; |
Ivan Smirnov | 42ad328 | 2016-06-19 14:39:41 +0100 | [diff] [blame] | 595 | |
Jason Rhinelander | f7f5bc8 | 2017-01-31 11:00:15 -0500 | [diff] [blame] | 596 | NAMESPACE_BEGIN(detail) |
| 597 | // Returns the index of the given type in the type char array below, and in the list in numpy.h |
| 598 | // The order here is: bool; 8 ints ((signed,unsigned)x(8,16,32,64)bits); float,double,long double; |
| 599 | // complex float,double,long double. Note that the long double types only participate when long |
| 600 | // double is actually longer than double (it isn't under MSVC). |
| 601 | // NB: not only the string below but also complex.h and numpy.h rely on this order. |
| 602 | template <typename T, typename SFINAE = void> struct is_fmt_numeric { static constexpr bool value = false; }; |
| 603 | template <typename T> struct is_fmt_numeric<T, enable_if_t<std::is_arithmetic<T>::value>> { |
| 604 | static constexpr bool value = true; |
| 605 | static constexpr int index = std::is_same<T, bool>::value ? 0 : 1 + ( |
| 606 | std::is_integral<T>::value ? detail::log2(sizeof(T))*2 + std::is_unsigned<T>::value : 8 + ( |
| 607 | std::is_same<T, double>::value ? 1 : std::is_same<T, long double>::value ? 2 : 0)); |
| 608 | }; |
| 609 | NAMESPACE_END(detail) |
| 610 | |
| 611 | template <typename T> struct format_descriptor<T, detail::enable_if_t<detail::is_fmt_numeric<T>::value>> { |
| 612 | static constexpr const char c = "?bBhHiIqQfdgFDG"[detail::is_fmt_numeric<T>::index]; |
Wenzel Jakob | b0c4444 | 2016-09-27 11:23:52 +0200 | [diff] [blame] | 613 | static constexpr const char value[2] = { c, '\0' }; |
| 614 | static std::string format() { return std::string(1, c); } |
Wenzel Jakob | 876eeab | 2016-05-04 22:22:48 +0200 | [diff] [blame] | 615 | }; |
Ivan Smirnov | 42ad328 | 2016-06-19 14:39:41 +0100 | [diff] [blame] | 616 | |
Wenzel Jakob | 876eeab | 2016-05-04 22:22:48 +0200 | [diff] [blame] | 617 | template <typename T> constexpr const char format_descriptor< |
Jason Rhinelander | f7f5bc8 | 2017-01-31 11:00:15 -0500 | [diff] [blame] | 618 | T, detail::enable_if_t<detail::is_fmt_numeric<T>::value>>::value[2]; |
Ivan Smirnov | 42ad328 | 2016-06-19 14:39:41 +0100 | [diff] [blame] | 619 | |
Wenzel Jakob | 720136b | 2016-09-10 16:32:17 +0900 | [diff] [blame] | 620 | /// RAII wrapper that temporarily clears any Python error state |
| 621 | struct error_scope { |
| 622 | PyObject *type, *value, *trace; |
| 623 | error_scope() { PyErr_Fetch(&type, &value, &trace); } |
| 624 | ~error_scope() { PyErr_Restore(type, value, trace); } |
| 625 | }; |
| 626 | |
Wenzel Jakob | 5e4e477 | 2016-08-28 02:03:15 +0200 | [diff] [blame] | 627 | /// Dummy destructor wrapper that can be used to expose classes with a private destructor |
| 628 | struct nodelete { template <typename T> void operator()(T*) { } }; |
Nickolai Belakovski | 6333825 | 2016-08-27 11:57:55 -0700 | [diff] [blame] | 629 | |
Dean Moldovan | 4e959c9 | 2016-12-08 11:07:52 +0100 | [diff] [blame] | 630 | // overload_cast requires variable templates: C++14 or MSVC 2015 Update 2 |
| 631 | #if defined(PYBIND11_CPP14) || _MSC_FULL_VER >= 190023918 |
| 632 | #define PYBIND11_OVERLOAD_CAST 1 |
| 633 | |
| 634 | NAMESPACE_BEGIN(detail) |
| 635 | template <typename... Args> |
| 636 | struct overload_cast_impl { |
Jason Rhinelander | 6e036e7 | 2016-12-13 20:06:41 -0500 | [diff] [blame] | 637 | template <typename Return /*,*/ PYBIND11_NOEXCEPT_TPL_ARG> |
| 638 | constexpr auto operator()(Return (*pf)(Args...) PYBIND11_NOEXCEPT_SPECIFIER) const noexcept |
Dean Moldovan | 4e959c9 | 2016-12-08 11:07:52 +0100 | [diff] [blame] | 639 | -> decltype(pf) { return pf; } |
| 640 | |
Jason Rhinelander | 6e036e7 | 2016-12-13 20:06:41 -0500 | [diff] [blame] | 641 | template <typename Return, typename Class /*,*/ PYBIND11_NOEXCEPT_TPL_ARG> |
| 642 | constexpr auto operator()(Return (Class::*pmf)(Args...) PYBIND11_NOEXCEPT_SPECIFIER, std::false_type = {}) const noexcept |
Dean Moldovan | 4e959c9 | 2016-12-08 11:07:52 +0100 | [diff] [blame] | 643 | -> decltype(pmf) { return pmf; } |
| 644 | |
Jason Rhinelander | 6e036e7 | 2016-12-13 20:06:41 -0500 | [diff] [blame] | 645 | template <typename Return, typename Class /*,*/ PYBIND11_NOEXCEPT_TPL_ARG> |
| 646 | constexpr auto operator()(Return (Class::*pmf)(Args...) const PYBIND11_NOEXCEPT_SPECIFIER, std::true_type) const noexcept |
Dean Moldovan | 4e959c9 | 2016-12-08 11:07:52 +0100 | [diff] [blame] | 647 | -> decltype(pmf) { return pmf; } |
| 648 | }; |
| 649 | NAMESPACE_END(detail) |
| 650 | |
| 651 | /// Syntax sugar for resolving overloaded function pointers: |
| 652 | /// - regular: static_cast<Return (Class::*)(Arg0, Arg1, Arg2)>(&Class::func) |
| 653 | /// - sweet: overload_cast<Arg0, Arg1, Arg2>(&Class::func) |
| 654 | template <typename... Args> |
| 655 | static constexpr detail::overload_cast_impl<Args...> overload_cast = {}; |
| 656 | // MSVC 2015 only accepts this particular initialization syntax for this variable template. |
| 657 | |
| 658 | /// Const member function selector for overload_cast |
| 659 | /// - regular: static_cast<Return (Class::*)(Arg) const>(&Class::func) |
| 660 | /// - sweet: overload_cast<Arg>(&Class::func, const_) |
| 661 | static constexpr auto const_ = std::true_type{}; |
| 662 | |
| 663 | #endif // overload_cast |
| 664 | |
Wenzel Jakob | 8f4eb00 | 2015-10-15 18:13:33 +0200 | [diff] [blame] | 665 | NAMESPACE_END(pybind11) |