@@ -526,23 +526,36 @@ TEST_CASE("Iterator concepts", "[iterator-concepts]") {
526526 // a collection to play with
527527 auto collection = ExampleHitCollection ();
528528
529- // bidirectional iterator traits
529+ // input iterator traits
530530 STATIC_REQUIRE (std::is_same_v<std::iterator_traits<decltype (collection)::iterator>::iterator_category,
531- std::bidirectional_iterator_tag >);
531+ std::input_iterator_tag >);
532532 STATIC_REQUIRE (std::is_same_v<std::iterator_traits<decltype (collection)::const_iterator>::iterator_category,
533- std::bidirectional_iterator_tag >);
533+ std::input_iterator_tag >);
534534 STATIC_REQUIRE (std::is_same_v<std::iterator_traits<decltype (collection)::reverse_iterator>::iterator_category,
535- std::bidirectional_iterator_tag >);
535+ std::input_iterator_tag >);
536536 STATIC_REQUIRE (std::is_same_v<std::iterator_traits<decltype (collection)::const_reverse_iterator>::iterator_category,
537- std::bidirectional_iterator_tag>);
538-
539- #ifdef __cpp_lib_ranges
540- // bidirectional iterator concepts (C++20)
541- STATIC_REQUIRE (std::bidirectional_iterator<decltype (collection)::iterator>);
542- STATIC_REQUIRE (std::bidirectional_iterator<decltype (collection)::const_iterator>);
543- STATIC_REQUIRE (std::bidirectional_iterator<decltype (collection)::reverse_iterator>);
544- STATIC_REQUIRE (std::bidirectional_iterator<decltype (collection)::const_reverse_iterator>);
545- STATIC_REQUIRE (std::ranges::bidirectional_range<decltype (collection)>);
537+ std::input_iterator_tag>);
538+
539+ STATIC_REQUIRE_FALSE (std::is_same_v<std::iterator_traits<decltype (collection)::iterator>::iterator_category,
540+ std::forward_iterator_tag>);
541+ STATIC_REQUIRE_FALSE (std::is_same_v<std::iterator_traits<decltype (collection)::const_iterator>::iterator_category,
542+ std::forward_iterator_tag>);
543+ STATIC_REQUIRE_FALSE (std::is_same_v<std::iterator_traits<decltype (collection)::reverse_iterator>::iterator_category,
544+ std::forward_iterator_tag>);
545+ STATIC_REQUIRE_FALSE (std::is_same_v<std::iterator_traits<decltype (collection)::const_reverse_iterator>::iterator_category,
546+ std::forward_iterator_tag>);
547+
548+ #if __cpp_concepts
549+ // input iterator concepts (C++20)
550+ STATIC_REQUIRE (std::input_iterator<decltype (collection)::iterator>);
551+ STATIC_REQUIRE (std::input_iterator<decltype (collection)::const_iterator>);
552+ STATIC_REQUIRE (std::input_iterator<decltype (collection)::reverse_iterator>);
553+ STATIC_REQUIRE (std::input_iterator<decltype (collection)::const_reverse_iterator>);
554+ // but not foward iterator concept
555+ STATIC_REQUIRE_FALSE (std::forward_iterator<decltype (collection)::iterator>);
556+ STATIC_REQUIRE_FALSE (std::forward_iterator<decltype (collection)::const_iterator>);
557+ STATIC_REQUIRE_FALSE (std::forward_iterator<decltype (collection)::reverse_iterator>);
558+ STATIC_REQUIRE_FALSE (std::forward_iterator<decltype (collection)::const_reverse_iterator>);
546559#endif
547560
548561 // iterator loops
@@ -598,8 +611,15 @@ TEST_CASE("Iterator concepts", "[iterator-concepts]") {
598611 auto not_found_reverse =
599612 std::find_if (collection.rbegin (), collection.rend (), [](const auto & h) { return h.cellID () == 0x1ULL ; });
600613 REQUIRE (not_found_reverse == collection.rend ());
614+ }
601615
616+ TEST_CASE (" Ranges (C++20)" , " [ranges]" ) {
602617#ifdef __cpp_lib_ranges
618+ // a collection to play with
619+ auto collection = ExampleHitCollection ();
620+
621+ STATIC_REQUIRE (std::ranges::input_range<decltype (collection)>);
622+
603623 // ranged views (C++20)
604624 auto is_non_zero = [](const auto & p) { return p.cellID () > 0 ; };
605625 auto half_energy = [](const auto & p) {
@@ -612,21 +632,21 @@ TEST_CASE("Iterator concepts", "[iterator-concepts]") {
612632 collection.create (0x42ULL , 1 ., 1 ., 1 ., 1 .);
613633 // pipe syntax
614634 int count_pipe_syntax = 0 ;
615- for (auto c : collection | std::views::filter (is_non_zero) | std::views::reverse ) {
635+ for (auto c : collection | std::views::filter (is_non_zero)) {
616636 STATIC_REQUIRE (std::is_same_v<decltype (c), MutableExampleHit>);
617637 ++count_pipe_syntax;
618638 }
619639 REQUIRE (count_pipe_syntax == 1 );
620640 // composing syntax
621641 auto count_composing = 0 ;
622- for (auto c : std::views::reverse ( std::views:: filter (collection, is_non_zero) )) {
642+ for (auto c : std::views::filter (collection, is_non_zero)) {
623643 STATIC_REQUIRE (std::is_same_v<decltype (c), MutableExampleHit>);
624644 ++count_composing;
625645 }
626646 REQUIRE (count_composing == 1 );
627647 // take_while
628648 auto count_take_while = 0 ;
629- for (auto c : collection | std::views::take_while (is_non_zero) | std::views::reverse ) {
649+ for (auto c : collection | std::views::take_while (is_non_zero)) {
630650 STATIC_REQUIRE (std::is_same_v<decltype (c), MutableExampleHit>);
631651 ++count_take_while;
632652 }
0 commit comments