diff --git a/doc/v2/reference.html b/doc/v2/reference.html index 1dc9a96d..927eadd8 100644 --- a/doc/v2/reference.html +++ b/doc/v2/reference.html @@ -1094,6 +1094,16 @@ + +
ssize_t.hpp
+ +
+
+
Typedefs
+ +
Constants
+
+

Topics

diff --git a/doc/v2/ssize_t.html b/doc/v2/ssize_t.html new file mode 100644 index 00000000..137f6d14 --- /dev/null +++ b/doc/v2/ssize_t.html @@ -0,0 +1,96 @@ + + + + + + + + + + + + Boost.Python - <boost/python/ssize_t.hpp> + + + + + + + + + +
+

C++ Boost

+
+

Boost.Python

+ +

Header + <boost/python/ssize_t.hpp>

+
+
+ +

Contents

+ +
+
Introduction
+ +
Typedef
+ +
Constants
+
+
+ +

Introduction

+ +

Python 2.5 introduces a new Py_ssize_t typedef and + two related macros (PEP 353). The + <boost/python/ssize_t.hpp> header imports these + definitions into the boost::python namespace as + ssize_t, ssize_t_max, and ssize_t_min. + Appropriate definitions are provided for backward compatibility + with previous Python versions.

+ +

Typedefs

Imports + Py_ssize_t into the boost::python namespace if + available, or provides an appropriate typedef for backward + compatibility: +
+#if PY_VERSION_HEX >= 0x02050000
+typedef Py_ssize_t ssize_t;
+#else
+typedef int ssize_t;
+#endif
+
+ +

Constants

Imports + PY_SSIZE_T_MAX and PY_SSIZE_T_MIN as constants + into the boost::python namespace if available, or + provides appropriate constants for backward compatibility: +
+#if PY_VERSION_HEX >= 0x02050000
+ssize_t const ssize_t_max = PY_SSIZE_T_MAX;
+ssize_t const ssize_t_min = PY_SSIZE_T_MIN;
+#else
+ssize_t const ssize_t_max = INT_MAX;
+ssize_t const ssize_t_min = INT_MIN;
+#endif
+
+ +

Revised + + 25 September, 2006 +

+ +

© Copyright Ralf W. + Grosse-Kunstleve 2006.

+ + diff --git a/include/boost/python/converter/builtin_converters.hpp b/include/boost/python/converter/builtin_converters.hpp index b7406632..dddb154c 100644 --- a/include/boost/python/converter/builtin_converters.hpp +++ b/include/boost/python/converter/builtin_converters.hpp @@ -7,6 +7,7 @@ # include # include # include +# include # include # include # include @@ -115,9 +116,9 @@ BOOST_PYTHON_TO_PYTHON_BY_VALUE(unsigned BOOST_PYTHON_LONG_LONG, ::PyLong_FromUn BOOST_PYTHON_TO_PYTHON_BY_VALUE(char, converter::do_return_to_python(x)) BOOST_PYTHON_TO_PYTHON_BY_VALUE(char const*, converter::do_return_to_python(x)) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::string, ::PyString_FromStringAndSize(x.data(),implicit_cast(x.size()))) +BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::string, ::PyString_FromStringAndSize(x.data(),implicit_cast(x.size()))) #if defined(Py_USING_UNICODE) && !defined(BOOST_NO_STD_WSTRING) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::wstring, ::PyUnicode_FromWideChar(x.data(),implicit_cast(x.size()))) +BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::wstring, ::PyUnicode_FromWideChar(x.data(),implicit_cast(x.size()))) # endif BOOST_PYTHON_TO_PYTHON_BY_VALUE(float, ::PyFloat_FromDouble(x)) BOOST_PYTHON_TO_PYTHON_BY_VALUE(double, ::PyFloat_FromDouble(x)) diff --git a/include/boost/python/detail/wrap_python.hpp b/include/boost/python/detail/wrap_python.hpp index 60448ac9..88597b58 100644 --- a/include/boost/python/detail/wrap_python.hpp +++ b/include/boost/python/detail/wrap_python.hpp @@ -141,12 +141,6 @@ typedef int pid_t; # include #endif -#if PY_VERSION_HEX < 0x02050000 -typedef int Py_ssize_t; -#define PY_SSIZE_T_MIN INT_MIN -#define PY_SSIZE_T_MAX INT_MAX -#endif - #ifdef BOOST_PYTHON_ULONG_MAX_UNDEFINED # undef ULONG_MAX # undef BOOST_PYTHON_ULONG_MAX_UNDEFINED diff --git a/include/boost/python/list.hpp b/include/boost/python/list.hpp index c6ba7323..0f6d1e8e 100644 --- a/include/boost/python/list.hpp +++ b/include/boost/python/list.hpp @@ -9,6 +9,7 @@ # include # include +# include namespace boost { namespace python { @@ -24,11 +25,11 @@ namespace detail long index(object_cref value) const; // return index of first occurrence of value - void insert(Py_ssize_t index, object_cref); // insert object before index + void insert(ssize_t index, object_cref); // insert object before index void insert(object const& index, object_cref); object pop(); // remove and return item at index (default last) - object pop(Py_ssize_t index); + object pop(ssize_t index); object pop(object const& index); void remove(object_cref value); // remove first occurrence of value @@ -86,7 +87,7 @@ class list : public detail::list_base } template - void insert(Py_ssize_t index, T const& x) // insert object before index + void insert(ssize_t index, T const& x) // insert object before index { base::insert(index, object(x)); } @@ -98,7 +99,7 @@ class list : public detail::list_base } object pop() { return base::pop(); } - object pop(Py_ssize_t index) { return base::pop(index); } + object pop(ssize_t index) { return base::pop(index); } template object pop(T const& index) diff --git a/include/boost/python/object.hpp b/include/boost/python/object.hpp index 2e36b632..9adec90f 100755 --- a/include/boost/python/object.hpp +++ b/include/boost/python/object.hpp @@ -5,7 +5,7 @@ #ifndef OBJECT_DWA2002612_HPP # define OBJECT_DWA2002612_HPP -# include +# include # include # include # include @@ -15,9 +15,9 @@ namespace boost { namespace python { - inline Py_ssize_t len(object const& obj) + inline ssize_t len(object const& obj) { - Py_ssize_t result = PyObject_Length(obj.ptr()); + ssize_t result = PyObject_Length(obj.ptr()); if (PyErr_Occurred()) throw_error_already_set(); return result; } diff --git a/include/boost/python/ssize_t.hpp b/include/boost/python/ssize_t.hpp new file mode 100644 index 00000000..e8a2d92f --- /dev/null +++ b/include/boost/python/ssize_t.hpp @@ -0,0 +1,29 @@ +// Copyright Ralf W. Grosse-Kunstleve & David Abrahams 2006. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PYTHON_SSIZE_T_RWGK20060924_HPP +# define BOOST_PYTHON_SSIZE_T_RWGK20060924_HPP + +# include + +namespace boost { namespace python { + +#if PY_VERSION_HEX >= 0x02050000 + +typedef Py_ssize_t ssize_t; +ssize_t const ssize_t_max = PY_SSIZE_T_MAX; +ssize_t const ssize_t_min = PY_SSIZE_T_MIN; + +#else + +typedef int ssize_t; +ssize_t const ssize_t_max = INT_MAX; +ssize_t const ssize_t_min = INT_MIN; + +#endif + +}} // namespace boost::python + +#endif // BOOST_PYTHON_SSIZE_T_RWGK20060924_HPP diff --git a/src/list.cpp b/src/list.cpp index ca62e627..b8f31fb8 100644 --- a/src/list.cpp +++ b/src/list.cpp @@ -3,6 +3,7 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include +#include namespace boost { namespace python { namespace detail { @@ -53,7 +54,7 @@ long list_base::index(object_cref value) const return result; } -void list_base::insert(Py_ssize_t index, object_cref item) +void list_base::insert(ssize_t index, object_cref item) { if (PyList_CheckExact(this->ptr())) { @@ -79,7 +80,7 @@ object list_base::pop() return this->attr("pop")(); } -object list_base::pop(Py_ssize_t index) +object list_base::pop(ssize_t index) { return this->pop(object(index)); } diff --git a/src/object/class.cpp b/src/object/class.cpp index 63f5cf97..9daf42b7 100644 --- a/src/object/class.cpp +++ b/src/object/class.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -506,14 +507,14 @@ namespace objects // were declared, we'll use our class_type() as the single base // class. std::size_t const num_bases = (std::max)(num_types - 1, static_cast(1)); - assert(num_bases <= PY_SSIZE_T_MAX); - handle<> bases(PyTuple_New(static_cast(num_bases))); + assert(num_bases <= ssize_t_max); + handle<> bases(PyTuple_New(static_cast(num_bases))); for (std::size_t i = 1; i <= num_bases; ++i) { type_handle c = (i >= num_types) ? class_type() : get_class(types[i]); // PyTuple_SET_ITEM steals this reference - PyTuple_SET_ITEM(bases.get(), static_cast(i - 1), upcast(c.release())); + PyTuple_SET_ITEM(bases.get(), static_cast(i - 1), upcast(c.release())); } // Call the class metatype to create a new class diff --git a/src/object/function.cpp b/src/object/function.cpp index 44b8853c..1f094f42 100644 --- a/src/object/function.cpp +++ b/src/object/function.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -64,7 +65,7 @@ function::function( = max_arity > num_keywords ? max_arity - num_keywords : 0; - Py_ssize_t tuple_size = num_keywords ? max_arity : 0; + ssize_t tuple_size = num_keywords ? max_arity : 0; m_arg_names = object(handle<>(PyTuple_New(tuple_size))); if (num_keywords != 0) @@ -158,9 +159,9 @@ PyObject* function::call(PyObject* args, PyObject* keywords) const else { // build a new arg tuple, will adjust its size later - assert(max_arity <= PY_SSIZE_T_MAX); + assert(max_arity <= ssize_t_max); inner_args = handle<>( - PyTuple_New(static_cast(max_arity))); + PyTuple_New(static_cast(max_arity))); // Fill in the positional arguments for (std::size_t i = 0; i < n_unnamed_actual; ++i) @@ -295,7 +296,7 @@ void function::argument_error(PyObject* args, PyObject* /*keywords*/) const % make_tuple(this->m_namespace, this->m_name); list actual_args; - for (Py_ssize_t i = 0; i < PyTuple_Size(args); ++i) + for (ssize_t i = 0; i < PyTuple_Size(args); ++i) { char const* name = PyTuple_GetItem(args, i)->ob_type->tp_name; actual_args.append(str(name)); diff --git a/src/object_protocol.cpp b/src/object_protocol.cpp index b62b63a1..8606fa2b 100755 --- a/src/object_protocol.cpp +++ b/src/object_protocol.cpp @@ -6,6 +6,7 @@ #include #include #include +#include namespace boost { namespace python { namespace api { @@ -106,7 +107,7 @@ namespace // slicing code copied directly out of the Python implementation PySequenceMethods *sq = tp->tp_as_sequence; if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { - Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX; + ssize_t ilow = 0, ihigh = ssize_t_max; if (!_PyEval_SliceIndex(v, &ilow)) return NULL; if (!_PyEval_SliceIndex(w, &ihigh)) @@ -133,7 +134,7 @@ namespace // slicing code copied directly out of the Python implementation PySequenceMethods *sq = tp->tp_as_sequence; if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { - Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX; + ssize_t ilow = 0, ihigh = ssize_t_max; if (!_PyEval_SliceIndex(v, &ilow)) return -1; if (!_PyEval_SliceIndex(w, &ihigh)) diff --git a/src/str.cpp b/src/str.cpp index 8a321d27..5216cf54 100644 --- a/src/str.cpp +++ b/src/str.cpp @@ -3,6 +3,7 @@ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include +#include namespace boost { namespace python { namespace detail { @@ -23,13 +24,13 @@ str_base::str_base(const char* s) namespace { - Py_ssize_t str_size_as_py_ssize_t(std::size_t n) + ssize_t str_size_as_py_ssize_t(std::size_t n) { - if (n > PY_SSIZE_T_MAX) + if (n > ssize_t_max) { - throw std::range_error("str size > PY_SSIZE_T_MAX"); + throw std::range_error("str size > ssize_t_max"); } - return static_cast(n); + return static_cast(n); } } // namespace