libstdc++: Implement C++26 std::text_encoding (P1885R12) [PR113318]
[official-gcc.git] / libstdc++-v3 / testsuite / std / text_encoding / requirements.cc
bloba1d5d6baee19c39497484c2335928045b53c046b
1 // { dg-do compile { target c++26 } }
2 // { dg-add-options no_pch }
4 #include <text_encoding>
5 #ifndef __cpp_lib_text_encoding
6 # error "Feature-test macro for text_encoding missing in <text_encoding>"
7 #elif __cpp_lib_text_encoding != 202306L
8 # error "Feature-test macro for text_encoding has wrong value in <text_encoding>"
9 #endif
11 #undef __cpp_lib_expected
12 #include <version>
13 #ifndef __cpp_lib_text_encoding
14 # error "Feature-test macro for text_encoding missing in <version>"
15 #elif __cpp_lib_text_encoding != 202306L
16 # error "Feature-test macro for text_encoding has wrong value in <version>"
17 #endif
19 #include <concepts>
20 #include <ranges>
21 static_assert( std::is_trivially_copyable_v<std::text_encoding> );
23 using aliases_view = std::text_encoding::aliases_view;
24 static_assert( std::copyable<aliases_view> );
25 static_assert( std::ranges::view<aliases_view> );
26 static_assert( std::ranges::random_access_range<aliases_view> );
27 static_assert( std::ranges::borrowed_range<aliases_view> );
28 static_assert( std::same_as<std::ranges::range_value_t<aliases_view>,
29 const char*> );
30 static_assert( std::same_as<std::ranges::range_reference_t<aliases_view>,
31 const char*> );
33 #include <testsuite_hooks.h>
35 constexpr bool
36 test_constexpr_iterator()
38 // This encoding has two aliases, "UTF-8" and "csUTF8".
39 const auto a = std::text_encoding(std::text_encoding::UTF8).aliases();
40 const auto begin = a.begin();
41 const auto end = a.end();
42 auto iter = begin;
43 VERIFY( *iter == *begin );
44 VERIFY( *iter == iter[0] );
45 VERIFY( iter[1] == begin[1] );
46 --++iter;
47 VERIFY( iter == begin );
48 auto iter2 = iter++;
49 VERIFY( iter2 == begin );
50 VERIFY( iter != begin );
51 iter2 = iter--;
52 VERIFY( iter2 != begin );
53 VERIFY( iter == begin );
54 iter++++; // Increments prvalue returned by operator++(int) instead of iter.
55 VERIFY( iter == iter2 );
56 iter----; // Decrements prvalue returned by operator++(int) instead of iter.
57 VERIFY( iter == begin );
58 const auto d = std::ranges::distance(a);
59 iter += d;
60 VERIFY( iter == end );
61 VERIFY( (iter - begin) == d );
62 VERIFY( (begin + 2) == iter );
63 VERIFY( (2 + begin) == iter );
64 VERIFY( iter[-1] == begin[1] );
65 iter -= d;
66 VERIFY( iter == begin );
67 VERIFY( *(iter + 1) == iter[1] );
68 VERIFY( (1 + iter - 1) == begin );
69 VERIFY( (-1 + (iter - -2) + -1) == begin );
71 std::ranges::iterator_t<std::text_encoding::aliases_view> singular{};
72 VERIFY( (singular + 0) == singular );
73 VERIFY( (singular - 0) == singular );
75 return true;
77 static_assert( test_constexpr_iterator() );