Open mreininghaus opened 1 year ago
It seems that the iterators returned by indexed
do not satisfy the std::input_or_output_iterator
concept.
https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator
It is not immediately obvious why, so this is needs more digging. Technically, they should satisfy that, these iterator requirements are very basic.
It is not the iterator concept.
#include <ranges>
#include <boost/histogram.hpp>
template<std::input_or_output_iterator I>
void test_iter(I) {}
int main() {
using namespace boost::histogram;
auto hist = make_histogram(axis::integer(1, 2));
auto ind = indexed(hist);
// this works
test_iter(ind.begin());
// this fails
auto r2 = std::ranges::subrange(ind.begin(), ind.end());
return 0;
}
Using indexed in ranges is currently not supported, it is untested. I will try to support this, since the syntax is nice and it makes sense to use an indexed in a range expression to strip the flow content.
While a
boost::histogram
can be used as a range in C++20, anindexed(histogram)
cannot. At least for me (tested with clang++ 13 and g++ 11.3), the following code does not compile: