Skip to content

Commit 7f8d1c2

Browse files
author
Wenzel Jakob
committed
improved int_ constructor
1 parent 4ee0f2a commit 7f8d1c2

File tree

2 files changed

+43
-27
lines changed

2 files changed

+43
-27
lines changed

include/pybind11/cast.h

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ template <typename type> class type_caster : public type_caster_custom {
227227
return cast(*src, policy, parent); \
228228
} \
229229
operator type*() { return &value; } \
230-
operator type&() { return value; } \
230+
operator type&() { return value; }
231231

232232
#define PYBIND11_TYPE_CASTER_NUMBER(type, py_type, from_type, to_pytype) \
233233
template <> class type_caster<type> { \
@@ -251,41 +251,22 @@ template <typename type> class type_caster : public type_caster_custom {
251251
PYBIND11_TYPE_CASTER(type, #type); \
252252
};
253253

254-
#if PY_MAJOR_VERSION >= 3
255-
#define PyLong_AsUnsignedLongLong_Fixed PyLong_AsUnsignedLongLong
256-
#define PyLong_AsLongLong_Fixed PyLong_AsLongLong
257-
#else
258-
inline PY_LONG_LONG PyLong_AsLongLong_Fixed(PyObject *o) {
259-
if (PyInt_Check(o))
260-
return (PY_LONG_LONG) PyLong_AsLong(o);
261-
else
262-
return ::PyLong_AsLongLong(o);
263-
}
264-
265-
inline unsigned PY_LONG_LONG PyLong_AsUnsignedLongLong_Fixed(PyObject *o) {
266-
if (PyInt_Check(o))
267-
return (unsigned PY_LONG_LONG) PyLong_AsUnsignedLong(o);
268-
else
269-
return ::PyLong_AsUnsignedLongLong(o);
270-
}
271-
#endif
272-
273254
PYBIND11_TYPE_CASTER_NUMBER(int8_t, long, PyLong_AsLong, PyLong_FromLong)
274255
PYBIND11_TYPE_CASTER_NUMBER(uint8_t, unsigned long, PyLong_AsUnsignedLong, PyLong_FromUnsignedLong)
275256
PYBIND11_TYPE_CASTER_NUMBER(int16_t, long, PyLong_AsLong, PyLong_FromLong)
276257
PYBIND11_TYPE_CASTER_NUMBER(uint16_t, unsigned long, PyLong_AsUnsignedLong, PyLong_FromUnsignedLong)
277258
PYBIND11_TYPE_CASTER_NUMBER(int32_t, long, PyLong_AsLong, PyLong_FromLong)
278259
PYBIND11_TYPE_CASTER_NUMBER(uint32_t, unsigned long, PyLong_AsUnsignedLong, PyLong_FromUnsignedLong)
279-
PYBIND11_TYPE_CASTER_NUMBER(int64_t, PY_LONG_LONG, PyLong_AsLongLong_Fixed, PyLong_FromLongLong)
280-
PYBIND11_TYPE_CASTER_NUMBER(uint64_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong_Fixed, PyLong_FromUnsignedLongLong)
260+
PYBIND11_TYPE_CASTER_NUMBER(int64_t, PY_LONG_LONG, detail::PyLong_AsLongLong, PyLong_FromLongLong)
261+
PYBIND11_TYPE_CASTER_NUMBER(uint64_t, unsigned PY_LONG_LONG, detail::PyLong_AsUnsignedLongLong, PyLong_FromUnsignedLongLong)
281262

282263
#if defined(__APPLE__) // size_t/ssize_t are separate types on Mac OS X
283264
#if PY_MAJOR_VERSION >= 3
284265
PYBIND11_TYPE_CASTER_NUMBER(ssize_t, Py_ssize_t, PyLong_AsSsize_t, PyLong_FromSsize_t)
285266
PYBIND11_TYPE_CASTER_NUMBER(size_t, size_t, PyLong_AsSize_t, PyLong_FromSize_t)
286267
#else
287-
PYBIND11_TYPE_CASTER_NUMBER(ssize_t, PY_LONG_LONG, PyLong_AsLongLong_Fixed, PyLong_FromLongLong)
288-
PYBIND11_TYPE_CASTER_NUMBER(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong_Fixed, PyLong_FromUnsignedLongLong)
268+
PYBIND11_TYPE_CASTER_NUMBER(ssize_t, PY_LONG_LONG, detail::PyLong_AsLongLong, PyLong_FromLongLong)
269+
PYBIND11_TYPE_CASTER_NUMBER(size_t, unsigned PY_LONG_LONG, detail::PyLong_AsUnsignedLongLong, PyLong_FromUnsignedLongLong)
289270
#endif
290271
#endif
291272

include/pybind11/pytypes.h

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,26 @@ struct dict_iterator {
208208
PyObject *dict, *key, *value;
209209
ssize_t pos = 0;
210210
};
211+
212+
#if PY_MAJOR_VERSION >= 3
213+
using ::PyLong_AsUnsignedLongLong;
214+
using ::PyLong_AsLongLong;
215+
#else
216+
inline PY_LONG_LONG PyLong_AsLongLong(PyObject *o) {
217+
if (PyInt_Check(o))
218+
return (PY_LONG_LONG) PyLong_AsLong(o);
219+
else
220+
return ::PyLong_AsLongLong(o);
221+
}
222+
223+
inline unsigned PY_LONG_LONG PyLong_AsUnsignedLongLong(PyObject *o) {
224+
if (PyInt_Check(o))
225+
return (unsigned PY_LONG_LONG) PyLong_AsUnsignedLong(o);
226+
else
227+
return ::PyLong_AsUnsignedLongLong(o);
228+
}
229+
#endif
230+
211231
NAMESPACE_END(detail)
212232

213233
inline detail::accessor handle::operator[](handle key) { return detail::accessor(ptr(), key.ptr(), false); }
@@ -271,12 +291,27 @@ class bool_ : public object {
271291
class int_ : public object {
272292
public:
273293
PYBIND11_OBJECT_DEFAULT(int_, object, PyLong_Check)
274-
int_(int value) : object(PyLong_FromLong((long) value), false) { }
294+
int_(int32_t value) : object(PyLong_FromLong((long) value), false) { }
295+
int_(int64_t value) : object(PyLong_FromLongLong((long long) value), false) { }
296+
int_(uint32_t value) : object(PyLong_FromUnsignedLong((unsigned long) value), false) { }
297+
int_(uint64_t value) : object(PyLong_FromUnsignedLongLong((unsigned long long) value), false) { }
298+
operator int32_t() const { return (int32_t) PyLong_AsLong(m_ptr); }
299+
operator uint32_t() const { return (uint32_t) PyLong_AsUnsignedLong(m_ptr); }
300+
operator int64_t() const { return (int64_t) detail::PyLong_AsLongLong(m_ptr); }
301+
operator uint64_t() const { return (uint64_t) detail::PyLong_AsUnsignedLongLong(m_ptr); }
302+
#if defined(__APPLE__) // size_t/ssize_t are separate types on Mac OS X
303+
#if PY_MAJOR_VERSION >= 3
275304
int_(size_t value) : object(PyLong_FromSize_t(value), false) { }
276-
#if !(defined(_WIN32) || defined(__i386__)) || defined(_WIN64)
277305
int_(ssize_t value) : object(PyLong_FromSsize_t(value), false) { }
306+
operator size_t() const { return (size_t) PyLong_AsSize_t(m_ptr); }
307+
operator ssize_t() const { return (ssize_t) PyLong_AsSsize_t(m_ptr); }
308+
#else
309+
int_(size_t value) : object(PyLong_FromUnsignedLongLong((unsigned long long) value), false) { }
310+
int_(ssize_t value) : object(PyLong_FromLongLong((long long) value), false) { }
311+
operator size_t() const { return (size_t) detail::PyLong_AsUnsignedLongLong(m_ptr); }
312+
operator ssize_t() const { return (ssize_t) detail::PyLong_AsLongLong(m_ptr); }
313+
#endif
278314
#endif
279-
operator int() const { return (int) PyLong_AsLong(m_ptr); }
280315
};
281316

282317
class float_ : public object {

0 commit comments

Comments
 (0)