| // { dg-do compile { target c++26 } } | |
| // { dg-require-cpp-feature-test __cpp_lib_text_encoding } | |
| // { dg-add-options no_pch } | |
| #include <text_encoding> | |
| #ifndef __cpp_lib_text_encoding | |
| # error "Feature-test macro for text_encoding missing in <text_encoding>" | |
| #elif __cpp_lib_text_encoding != 202306L | |
| # error "Feature-test macro for text_encoding has wrong value in <text_encoding>" | |
| #endif | |
| #undef __cpp_lib_text_encoding | |
| #include <version> | |
| #ifndef __cpp_lib_text_encoding | |
| # error "Feature-test macro for text_encoding missing in <version>" | |
| #elif __cpp_lib_text_encoding != 202306L | |
| # error "Feature-test macro for text_encoding has wrong value in <version>" | |
| #endif | |
| #include <concepts> | |
| #include <ranges> | |
| static_assert( std::is_trivially_copyable_v<std::text_encoding> ); | |
| using aliases_view = std::text_encoding::aliases_view; | |
| static_assert( std::copyable<aliases_view> ); | |
| static_assert( std::ranges::view<aliases_view> ); | |
| static_assert( std::ranges::random_access_range<aliases_view> ); | |
| static_assert( std::ranges::borrowed_range<aliases_view> ); | |
| static_assert( std::same_as<std::ranges::range_value_t<aliases_view>, | |
| const char*> ); | |
| static_assert( std::same_as<std::ranges::range_reference_t<aliases_view>, | |
| const char*> ); | |
| #include <testsuite_hooks.h> | |
| constexpr bool | |
| test_constexpr_iterator() | |
| { | |
| // This encoding has two aliases, "UTF-8" and "csUTF8". | |
| const auto a = std::text_encoding(std::text_encoding::UTF8).aliases(); | |
| const auto begin = a.begin(); | |
| const auto end = a.end(); | |
| auto iter = begin; | |
| VERIFY( *iter == *begin ); | |
| VERIFY( *iter == iter[0] ); | |
| VERIFY( iter[1] == begin[1] ); | |
| --++iter; | |
| VERIFY( iter == begin ); | |
| auto iter2 = iter++; | |
| VERIFY( iter2 == begin ); | |
| VERIFY( iter != begin ); | |
| iter2 = iter--; | |
| VERIFY( iter2 != begin ); | |
| VERIFY( iter == begin ); | |
| iter++++; // Increments prvalue returned by operator++(int) instead of iter. | |
| VERIFY( iter == iter2 ); | |
| iter----; // Decrements prvalue returned by operator++(int) instead of iter. | |
| VERIFY( iter == begin ); | |
| const auto d = std::ranges::distance(a); | |
| iter += d; | |
| VERIFY( iter == end ); | |
| VERIFY( (iter - begin) == d ); | |
| VERIFY( (begin + 2) == iter ); | |
| VERIFY( (2 + begin) == iter ); | |
| VERIFY( iter[-1] == begin[1] ); | |
| iter -= d; | |
| VERIFY( iter == begin ); | |
| VERIFY( *(iter + 1) == iter[1] ); | |
| VERIFY( (1 + iter - 1) == begin ); | |
| VERIFY( (-1 + (iter - -2) + -1) == begin ); | |
| std::ranges::iterator_t<std::text_encoding::aliases_view> singular{}; | |
| VERIFY( (singular + 0) == singular ); | |
| VERIFY( (singular - 0) == singular ); | |
| return true; | |
| } | |
| static_assert( test_constexpr_iterator() ); |