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