15
15
#include < pybind11/functional.h>
16
16
17
17
#include < range/v3/range_for.hpp>
18
+ #include < range/v3/size.hpp>
18
19
#include < range/v3/view/any_view.hpp>
19
20
#include < range/v3/view/filter.hpp>
20
21
#include < range/v3/view/slice.hpp>
@@ -58,9 +59,14 @@ auto addRangeMethods(Class &cl) {
58
59
if constexpr (ranges::ForwardRange<Range>()) {
59
60
cl
60
61
.def (" __bool__" , [](Range &range) { return !ranges::empty (range); })
61
- .def (" __len__" , [](Range &range) { return ranges::distance (range); })
62
+ ;
63
+ }
64
+
65
+ if constexpr (ranges::BidirectionalRange<Range>()) {
66
+ cl
67
+ .def (" __len__" , [](Range &range) { return range.size (); })
62
68
.def (" __getitem__" , [](Range &range, int64_t posIndex) {
63
- auto chainSize = static_cast <int64_t >(ranges::distance ( range));
69
+ auto chainSize = static_cast <int64_t >(range. size ( ));
64
70
if (posIndex < 0 ) {
65
71
posIndex += chainSize;
66
72
}
@@ -69,21 +75,27 @@ auto addRangeMethods(Class &cl) {
69
75
}
70
76
return range[posIndex];
71
77
}, pybind11::arg (" index" ))
72
- ;
73
- }
74
78
75
- if constexpr (ranges::BidirectionalRange<Range>()) {
76
- cl.def (" __getitem__" , [](Range &range, pybind11::slice slice) {
79
+ .def (" __getitem__" , [](Range &range, pybind11::slice slice) {
77
80
size_t start, stop, step, slicelength;
78
- auto chainSize = ranges::distance (range);
81
+ const auto &constRange = range;
82
+ auto chainSize = ranges::size (constRange);
83
+ // static_assert(std::is_integral<decltype(chainSize)>::value, "Size is not integral");
84
+ // static_assert(!ranges::disable_sized_range<Range>::value, "Size is disabled");
85
+ // static_assert(ranges::SizedRange<Range>(), "range is not sized");
86
+ // static_assert(ranges::SizedRange<const Range>(), "const range is not sized");
79
87
if (!slice.compute (chainSize, &start, &stop, &step, &slicelength))
80
88
throw pybind11::error_already_set ();
81
89
82
90
auto subset = ranges::view::slice (range,
83
91
static_cast <ranges::range_difference_type_t <Range>>(start),
84
92
static_cast <ranges::range_difference_type_t <Range>>(stop));
85
- return convertRangeToPython (subset | ranges::view::stride (step));
86
- }, pybind11::arg (" slice" ));
93
+ // static_assert(ranges::SizedRange<const decltype(subset)>(), "slice is not sized");
94
+ auto strided = subset | ranges::view::stride (step);
95
+ // static_assert(ranges::SizedRange<const decltype(strided)>(), "strided is not sized");
96
+ return convertRangeToPython (strided);
97
+ }, pybind11::arg (" slice" ))
98
+ ;
87
99
}
88
100
89
101
@@ -95,7 +107,7 @@ auto addRangeMethods(Class &cl) {
95
107
ss << " \n\n :type: :class:`" << PythonTypeName<ranges::any_view<WrappedType, getBlockSciCategory (ranges::get_categories<Range>())>>::name () << " `" ;
96
108
97
109
std::stringstream ss2;
98
- ss2 << " \n\n :type: :class:` numpy.ndarray[bool]`" ;
110
+ ss2 << " \n\n :type: :class:`numpy.ndarray[bool]`" ;
99
111
cl
100
112
.def_property_readonly (" has_value" , [](Range &range) {
101
113
return convertRangeToPython (range | ranges::view::transform ([](auto && val) { return val.has_value (); }));
0 commit comments