diff --git a/docs/advanced.rst b/docs/advanced.rst index aca132594..1620db717 100644 --- a/docs/advanced.rst +++ b/docs/advanced.rst @@ -1224,12 +1224,12 @@ completely avoid copy operations with Python expressions like py::class_(m, "Matrix") .def_buffer([](Matrix &m) -> py::buffer_info { return py::buffer_info( - m.data(), /* Pointer to buffer */ - sizeof(float), /* Size of one scalar */ - py::format_descriptor::value(), /* Python struct-style format descriptor */ - 2, /* Number of dimensions */ - { m.rows(), m.cols() }, /* Buffer dimensions */ - { sizeof(float) * m.rows(), /* Strides (in bytes) for each index */ + m.data(), /* Pointer to buffer */ + sizeof(float), /* Size of one scalar */ + py::format_descriptor::format(), /* Python struct-style format descriptor */ + 2, /* Number of dimensions */ + { m.rows(), m.cols() }, /* Buffer dimensions */ + { sizeof(float) * m.rows(), /* Strides (in bytes) for each index */ sizeof(float) } ); }); @@ -1273,7 +1273,7 @@ buffer objects (e.g. a NumPy matrix). py::buffer_info info = b.request(); /* Some sanity checks ... */ - if (info.format != py::format_descriptor::value()) + if (info.format != py::format_descriptor::format()) throw std::runtime_error("Incompatible format: expected a double array!"); if (info.ndim != 2) @@ -1299,7 +1299,7 @@ as follows: m.data(), /* Pointer to buffer */ sizeof(Scalar), /* Size of one scalar */ /* Python struct-style format descriptor */ - py::format_descriptor::value(), + py::format_descriptor::format(), /* Number of dimensions */ 2, /* Buffer dimensions */ @@ -1439,7 +1439,7 @@ simply using ``vectorize``). auto result = py::array(py::buffer_info( nullptr, /* Pointer to data (nullptr -> ask NumPy to allocate!) */ sizeof(double), /* Size of one item */ - py::format_descriptor::value, /* Buffer format */ + py::format_descriptor::format(), /* Buffer format */ buf1.ndim, /* How many dimensions? */ { buf1.shape[0] }, /* Number of elements for each dimension */ { sizeof(double) } /* Strides for each dimension */ @@ -1830,4 +1830,3 @@ is always ``none``). // Evaluate the statements in an separate Python file on disk py::eval_file("script.py", scope); - diff --git a/example/example-buffers.cpp b/example/example-buffers.cpp index 2deee6f83..fa3178b51 100644 --- a/example/example-buffers.cpp +++ b/example/example-buffers.cpp @@ -81,7 +81,7 @@ void init_ex_buffers(py::module &m) { /// Construct from a buffer .def("__init__", [](Matrix &v, py::buffer b) { py::buffer_info info = b.request(); - if (info.format != py::format_descriptor::value() || info.ndim != 2) + if (info.format != py::format_descriptor::format() || info.ndim != 2) throw std::runtime_error("Incompatible buffer format!"); new (&v) Matrix(info.shape[0], info.shape[1]); memcpy(v.data(), info.ptr, sizeof(float) * v.rows() * v.cols()); @@ -104,12 +104,12 @@ void init_ex_buffers(py::module &m) { /// Provide buffer access .def_buffer([](Matrix &m) -> py::buffer_info { return py::buffer_info( - m.data(), /* Pointer to buffer */ - sizeof(float), /* Size of one scalar */ - py::format_descriptor::value(), /* Python struct-style format descriptor */ - 2, /* Number of dimensions */ - { m.rows(), m.cols() }, /* Buffer dimensions */ - { sizeof(float) * m.rows(), /* Strides (in bytes) for each index */ + m.data(), /* Pointer to buffer */ + sizeof(float), /* Size of one scalar */ + py::format_descriptor::format(), /* Python struct-style format descriptor */ + 2, /* Number of dimensions */ + { m.rows(), m.cols() }, /* Buffer dimensions */ + { sizeof(float) * m.rows(), /* Strides (in bytes) for each index */ sizeof(float) } ); }) diff --git a/example/example20.cpp b/example/example20.cpp index 201c470e0..77cda6b5c 100644 --- a/example/example20.cpp +++ b/example/example20.cpp @@ -47,7 +47,7 @@ std::ostream& operator<<(std::ostream& os, const NestedStruct& v) { template py::array mkarray_via_buffer(size_t n) { return py::array(py::buffer_info(nullptr, sizeof(T), - py::format_descriptor::value(), + py::format_descriptor::format(), 1, { n }, { sizeof(T) })); } @@ -80,9 +80,9 @@ void print_recarray(py::array_t arr) { } void print_format_descriptors() { - std::cout << py::format_descriptor::value() << std::endl; - std::cout << py::format_descriptor::value() << std::endl; - std::cout << py::format_descriptor::value() << std::endl; + std::cout << py::format_descriptor::format() << std::endl; + std::cout << py::format_descriptor::format() << std::endl; + std::cout << py::format_descriptor::format() << std::endl; } void print_dtypes() { diff --git a/include/pybind11/common.h b/include/pybind11/common.h index ca5765ab1..32e8abf53 100644 --- a/include/pybind11/common.h +++ b/include/pybind11/common.h @@ -204,7 +204,7 @@ struct buffer_info { void *ptr; // Pointer to the underlying storage size_t itemsize; // Size of individual items in bytes size_t size; // Total number of entries - std::string format; // For homogeneous buffers, this should be set to format_descriptor::value() + std::string format; // For homogeneous buffers, this should be set to format_descriptor::format() size_t ndim; // Number of dimensions std::vector shape; // Shape of the tensor (1 entry per dimension) std::vector strides; // Number of entries between adjacent entries (for each per dimension) @@ -349,18 +349,19 @@ PYBIND11_RUNTIME_EXCEPTION(reference_cast_error) /// Used internally /// Format strings for basic number types #define PYBIND11_DECL_FMT(t, v) template<> struct format_descriptor \ - { static constexpr const char* value() { return v; } }; + { static constexpr const char* value = v; /* for backwards compatibility */ \ + static constexpr const char* format() { return value; } } template struct format_descriptor { }; template struct format_descriptor::value>::type> { - static constexpr const char* value() { return format; } - static constexpr const char format[2] = + static constexpr const char value[2] = { "bBhHiIqQ"[detail::log2(sizeof(T))*2 + (std::is_unsigned::value ? 1 : 0)], '\0' }; + static constexpr const char* format() { return value; } }; template constexpr const char format_descriptor< - T, typename std::enable_if::value>::type>::format[2]; + T, typename std::enable_if::value>::type>::value[2]; PYBIND11_DECL_FMT(float, "f"); PYBIND11_DECL_FMT(double, "d"); diff --git a/include/pybind11/eigen.h b/include/pybind11/eigen.h index db8f9eb17..2ea7d486b 100644 --- a/include/pybind11/eigen.h +++ b/include/pybind11/eigen.h @@ -133,7 +133,7 @@ struct type_caster::value && /* Size of one scalar */ sizeof(Scalar), /* Python struct-style format descriptor */ - format_descriptor::value(), + format_descriptor::format(), /* Number of dimensions */ 1, /* Buffer dimensions */ @@ -148,7 +148,7 @@ struct type_caster::value && /* Size of one scalar */ sizeof(Scalar), /* Python struct-style format descriptor */ - format_descriptor::value(), + format_descriptor::format(), /* Number of dimensions */ isVector ? 1 : 2, /* Buffer dimensions */ @@ -276,7 +276,7 @@ struct type_caster::value>:: // Size of one scalar sizeof(Scalar), // Python struct-style format descriptor - format_descriptor::value(), + format_descriptor::format(), // Number of dimensions 1, // Buffer dimensions @@ -291,7 +291,7 @@ struct type_caster::value>:: // Size of one scalar sizeof(StorageIndex), // Python struct-style format descriptor - format_descriptor::value(), + format_descriptor::format(), // Number of dimensions 1, // Buffer dimensions @@ -306,7 +306,7 @@ struct type_caster::value>:: // Size of one scalar sizeof(StorageIndex), // Python struct-style format descriptor - format_descriptor::value(), + format_descriptor::format(), // Number of dimensions 1, // Buffer dimensions diff --git a/include/pybind11/numpy.h b/include/pybind11/numpy.h index 19ba4de72..cac19ee72 100644 --- a/include/pybind11/numpy.h +++ b/include/pybind11/numpy.h @@ -164,8 +164,8 @@ template struct format_descriptor !std::is_same>::value && !std::is_same>::value>::type> { - static const char *value() { - return detail::npy_format_descriptor::format_str(); + static const char *format() { + return detail::npy_format_descriptor::format(); } }; @@ -231,8 +231,8 @@ template struct npy_format_descriptor return object(descr_(), true); } - static const char* format_str() { - return format_str_(); + static const char* format() { + return format_(); } static void register_dtype(std::initializer_list fields) { @@ -256,7 +256,7 @@ template struct npy_format_descriptor if (auto arr = (object) empty(int_(0), object(descr(), true))) if (auto view = PyMemoryView_FromObject(arr.ptr())) if (auto info = PyMemoryView_GET_BUFFER(view)) { - std::strncpy(format_str_(), info->format, 4096); + std::strncpy(format_(), info->format, 4096); return; } pybind11_fail("NumPy: failed to extract buffer format"); @@ -264,7 +264,7 @@ template struct npy_format_descriptor private: static inline PyObject*& descr_() { static PyObject *ptr = nullptr; return ptr; } - static inline char* format_str_() { static char s[4096]; return s; } + static inline char* format_() { static char s[4096]; return s; } }; #define FIELD_DESCRIPTOR(Type, Field) \ @@ -480,7 +480,7 @@ struct vectorize_helper { return cast(f(*((Args *) buffers[Index].ptr)...)); array result(buffer_info(nullptr, sizeof(Return), - format_descriptor::value(), + format_descriptor::format(), ndim, shape, strides)); buffer_info buf = result.request();