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 };
71