1
2 template<class _CharT> struct char_traits;
3
4 template<typename _CharT, typename _Traits = char_traits<_CharT>>
5 class basic_string;
6
7 typedef basic_string<char> string;
8
9 template<typename> struct iterator_traits;
10
11 template<bool _Cond> struct conditional;
12
13 template<typename _Iter>
14 inline constexpr bool disable_sized_sentinel_for = false;
15
16 template<typename _Iter>
17 concept sized_sentinel_for = !disable_sized_sentinel_for<_Iter>;
18
19 template<typename _Iterator>
20 class __normal_iterator
21 {
22 typedef iterator_traits<_Iterator> __traits_type;
23 };
24
25 template<typename _Iterator>
26 class reverse_iterator
27 {
28 public:
29 using iterator_concept
30 = typename conditional<sized_sentinel_for<_Iterator>>::type;
31 };
32
33
34 template<typename _Iterator>
35 requires (!sized_sentinel_for<_Iterator>)
36 bool disable_sized_sentinel_for<reverse_iterator<_Iterator>> = true;
37
38
39 template<typename _Iterator>
40 bool operator==(const reverse_iterator<_Iterator>& __x,
41 const reverse_iterator<_Iterator>& __y);
42 template<typename _Iterator>
43 bool operator==(const __normal_iterator<_Iterator>& __lhs,
44 const __normal_iterator<_Iterator>& __rhs);
45
46 template<typename _It >
47 class common_iterator
48 {
49 public:
50 friend bool operator==(const common_iterator& __x,
51 const common_iterator& __y)
52 {
53 return __x._M_it == __y._M_it;
54 }
55
56 private:
57 _It _M_it;
58 };
59
60 template<typename _It>
61 struct iterator_traits<common_iterator<_It>>
62 {
63 };
64
65 template<typename _CharT>
66 struct char_traits
67 {
68 static bool eq(const _CharT& __c1, const _CharT& __c2)
69 { return __c1 == __c2; }
70 };