mirror of
https://github.com/pybind/pybind11.git
synced 2026-06-11 16:58:08 +00:00
Add helpers to array that return the size and strides as a std::span (#5974)
* Add helper functions to pybind11::array to return the shape and strides as a std::span. These functions are hidden with macros unless PYBIND11_CPP20 is defined and the <span> include has been found. * style: pre-commit fixes * tests: Add unit tests for shape_span() and strides_span() Add comprehensive unit tests for the new std::span helper functions: - Test 0D, 1D, 2D, and 3D arrays - Verify spans match regular shape()/strides() methods - Test that spans can be used to construct new arrays - Tests are conditionally compiled only when PYBIND11_HAS_SPAN is defined * Use __cpp_lib_span feature test macro instead of __has_include Replace __has_include(<span>) check with __cpp_lib_span feature test macro to resolve ambiguity where some pre-C++20 systems might have a global header called <span> that isn't the C++20 std::span. The check is moved after <version> is included, consistent with how __cpp_lib_char8_t is handled. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix: Use py::ssize_t instead of ssize_t in span tests On Windows/MSVC, ssize_t is not available in the standard namespace without proper includes. Use py::ssize_t (the pybind11 typedef) instead to ensure cross-platform compatibility. Fixes compilation errors on: - Windows/MSVC 2022 (C++20) - GCC 10 (C++20) Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ralf W. Grosse-Kunstleve <rgrossekunst@nvidia.com> Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
// Size / dtype checks.
|
||||
struct DtypeCheck {
|
||||
@@ -246,6 +247,22 @@ TEST_SUBMODULE(numpy_array, sm) {
|
||||
sm.def("nbytes", [](const arr &a) { return a.nbytes(); });
|
||||
sm.def("owndata", [](const arr &a) { return a.owndata(); });
|
||||
|
||||
#ifdef PYBIND11_HAS_SPAN
|
||||
// test_shape_strides_span
|
||||
sm.def("shape_span", [](const arr &a) {
|
||||
auto span = a.shape_span();
|
||||
return std::vector<py::ssize_t>(span.begin(), span.end());
|
||||
});
|
||||
sm.def("strides_span", [](const arr &a) {
|
||||
auto span = a.strides_span();
|
||||
return std::vector<py::ssize_t>(span.begin(), span.end());
|
||||
});
|
||||
// Test that spans can be used to construct new arrays
|
||||
sm.def("array_from_spans", [](const arr &a) {
|
||||
return py::array(a.dtype(), a.shape_span(), a.strides_span(), a.data(), a);
|
||||
});
|
||||
#endif
|
||||
|
||||
// test_index_offset
|
||||
def_index_fn(index_at, const arr &);
|
||||
def_index_fn(index_at_t, const arr_t &);
|
||||
|
||||
Reference in New Issue
Block a user