Skip to content

Commit 784b902

Browse files
committed
Require input_iterator and nothing more; split off ranges tests
1 parent c795898 commit 784b902

1 file changed

Lines changed: 36 additions & 16 deletions

File tree

tests/unittest.cpp

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)