From 7f8d1c20f19deff1f1a43d324fd58e456926c140 Mon Sep 17 00:00:00 2001 From: Wenzel Jakob Date: Sun, 29 Nov 2015 13:46:56 +0100 Subject: [PATCH] improved int_ constructor --- include/pybind11/cast.h | 29 +++++---------------------- include/pybind11/pytypes.h | 41 +++++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h index 5792fab53..1ed61460c 100644 --- a/include/pybind11/cast.h +++ b/include/pybind11/cast.h @@ -227,7 +227,7 @@ protected: return cast(*src, policy, parent); \ } \ operator type*() { return &value; } \ - operator type&() { return value; } \ + operator type&() { return value; } #define PYBIND11_TYPE_CASTER_NUMBER(type, py_type, from_type, to_pytype) \ template <> class type_caster { \ @@ -251,41 +251,22 @@ protected: PYBIND11_TYPE_CASTER(type, #type); \ }; -#if PY_MAJOR_VERSION >= 3 -#define PyLong_AsUnsignedLongLong_Fixed PyLong_AsUnsignedLongLong -#define PyLong_AsLongLong_Fixed PyLong_AsLongLong -#else -inline PY_LONG_LONG PyLong_AsLongLong_Fixed(PyObject *o) { - if (PyInt_Check(o)) - return (PY_LONG_LONG) PyLong_AsLong(o); - else - return ::PyLong_AsLongLong(o); -} - -inline unsigned PY_LONG_LONG PyLong_AsUnsignedLongLong_Fixed(PyObject *o) { - if (PyInt_Check(o)) - return (unsigned PY_LONG_LONG) PyLong_AsUnsignedLong(o); - else - return ::PyLong_AsUnsignedLongLong(o); -} -#endif - PYBIND11_TYPE_CASTER_NUMBER(int8_t, long, PyLong_AsLong, PyLong_FromLong) PYBIND11_TYPE_CASTER_NUMBER(uint8_t, unsigned long, PyLong_AsUnsignedLong, PyLong_FromUnsignedLong) PYBIND11_TYPE_CASTER_NUMBER(int16_t, long, PyLong_AsLong, PyLong_FromLong) PYBIND11_TYPE_CASTER_NUMBER(uint16_t, unsigned long, PyLong_AsUnsignedLong, PyLong_FromUnsignedLong) PYBIND11_TYPE_CASTER_NUMBER(int32_t, long, PyLong_AsLong, PyLong_FromLong) PYBIND11_TYPE_CASTER_NUMBER(uint32_t, unsigned long, PyLong_AsUnsignedLong, PyLong_FromUnsignedLong) -PYBIND11_TYPE_CASTER_NUMBER(int64_t, PY_LONG_LONG, PyLong_AsLongLong_Fixed, PyLong_FromLongLong) -PYBIND11_TYPE_CASTER_NUMBER(uint64_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong_Fixed, PyLong_FromUnsignedLongLong) +PYBIND11_TYPE_CASTER_NUMBER(int64_t, PY_LONG_LONG, detail::PyLong_AsLongLong, PyLong_FromLongLong) +PYBIND11_TYPE_CASTER_NUMBER(uint64_t, unsigned PY_LONG_LONG, detail::PyLong_AsUnsignedLongLong, PyLong_FromUnsignedLongLong) #if defined(__APPLE__) // size_t/ssize_t are separate types on Mac OS X #if PY_MAJOR_VERSION >= 3 PYBIND11_TYPE_CASTER_NUMBER(ssize_t, Py_ssize_t, PyLong_AsSsize_t, PyLong_FromSsize_t) PYBIND11_TYPE_CASTER_NUMBER(size_t, size_t, PyLong_AsSize_t, PyLong_FromSize_t) #else -PYBIND11_TYPE_CASTER_NUMBER(ssize_t, PY_LONG_LONG, PyLong_AsLongLong_Fixed, PyLong_FromLongLong) -PYBIND11_TYPE_CASTER_NUMBER(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong_Fixed, PyLong_FromUnsignedLongLong) +PYBIND11_TYPE_CASTER_NUMBER(ssize_t, PY_LONG_LONG, detail::PyLong_AsLongLong, PyLong_FromLongLong) +PYBIND11_TYPE_CASTER_NUMBER(size_t, unsigned PY_LONG_LONG, detail::PyLong_AsUnsignedLongLong, PyLong_FromUnsignedLongLong) #endif #endif diff --git a/include/pybind11/pytypes.h b/include/pybind11/pytypes.h index 48e3d1f33..12dc7737f 100644 --- a/include/pybind11/pytypes.h +++ b/include/pybind11/pytypes.h @@ -208,6 +208,26 @@ private: PyObject *dict, *key, *value; ssize_t pos = 0; }; + +#if PY_MAJOR_VERSION >= 3 +using ::PyLong_AsUnsignedLongLong; +using ::PyLong_AsLongLong; +#else +inline PY_LONG_LONG PyLong_AsLongLong(PyObject *o) { + if (PyInt_Check(o)) + return (PY_LONG_LONG) PyLong_AsLong(o); + else + return ::PyLong_AsLongLong(o); +} + +inline unsigned PY_LONG_LONG PyLong_AsUnsignedLongLong(PyObject *o) { + if (PyInt_Check(o)) + return (unsigned PY_LONG_LONG) PyLong_AsUnsignedLong(o); + else + return ::PyLong_AsUnsignedLongLong(o); +} +#endif + NAMESPACE_END(detail) inline detail::accessor handle::operator[](handle key) { return detail::accessor(ptr(), key.ptr(), false); } @@ -271,12 +291,27 @@ public: class int_ : public object { public: PYBIND11_OBJECT_DEFAULT(int_, object, PyLong_Check) - int_(int value) : object(PyLong_FromLong((long) value), false) { } + int_(int32_t value) : object(PyLong_FromLong((long) value), false) { } + int_(int64_t value) : object(PyLong_FromLongLong((long long) value), false) { } + int_(uint32_t value) : object(PyLong_FromUnsignedLong((unsigned long) value), false) { } + int_(uint64_t value) : object(PyLong_FromUnsignedLongLong((unsigned long long) value), false) { } + operator int32_t() const { return (int32_t) PyLong_AsLong(m_ptr); } + operator uint32_t() const { return (uint32_t) PyLong_AsUnsignedLong(m_ptr); } + operator int64_t() const { return (int64_t) detail::PyLong_AsLongLong(m_ptr); } + operator uint64_t() const { return (uint64_t) detail::PyLong_AsUnsignedLongLong(m_ptr); } +#if defined(__APPLE__) // size_t/ssize_t are separate types on Mac OS X +#if PY_MAJOR_VERSION >= 3 int_(size_t value) : object(PyLong_FromSize_t(value), false) { } -#if !(defined(_WIN32) || defined(__i386__)) || defined(_WIN64) int_(ssize_t value) : object(PyLong_FromSsize_t(value), false) { } + operator size_t() const { return (size_t) PyLong_AsSize_t(m_ptr); } + operator ssize_t() const { return (ssize_t) PyLong_AsSsize_t(m_ptr); } +#else + int_(size_t value) : object(PyLong_FromUnsignedLongLong((unsigned long long) value), false) { } + int_(ssize_t value) : object(PyLong_FromLongLong((long long) value), false) { } + operator size_t() const { return (size_t) detail::PyLong_AsUnsignedLongLong(m_ptr); } + operator ssize_t() const { return (ssize_t) detail::PyLong_AsLongLong(m_ptr); } +#endif #endif - operator int() const { return (int) PyLong_AsLong(m_ptr); } }; class float_ : public object {