@@ -21,6 +21,11 @@ namespace stdsharp
2121 default_operator::subscript,
2222 default_operator::plus_commutative
2323 {
24+ private:
25+ template <typename T>
26+ static constexpr auto has_mem_data = requires (T& t) { t.data (); };
27+
28+ public:
2429 template <typename T>
2530 using difference_type = std::iter_difference_t <decltype (std::declval<const T&>().data())>;
2631
@@ -33,55 +38,61 @@ namespace stdsharp
3338 using increase::operator --;
3439 using arithmetic::operator -;
3540
36- template <details::iterator_has_mem_data T>
41+ template <typename T>
42+ requires has_mem_data<T>
3743 constexpr auto & operator ++(this T& t) noexcept (noexcept (++t.data()))
38- requires requires { ++t.data (); }
3944 {
4045 ++t.data ();
4146 return t;
4247 }
4348
44- template <details::iterator_has_mem_data T>
49+ template <typename T>
50+ requires has_mem_data<T>
4551 constexpr auto & operator --(this T& t) noexcept (noexcept (--t.data()))
4652 requires requires { --t.data (); }
4753 {
4854 --t.data ();
4955 return t;
5056 }
5157
52- template <details::iterator_has_mem_data T>
58+ template <typename T>
59+ requires has_mem_data<T>
5360 constexpr auto & operator +=(this T& t, const difference_type<T>& diff) noexcept
5461 requires requires { t.data () += diff; }
5562 {
5663 t.data () += diff;
5764 return t;
5865 }
5966
60- template <details::iterator_has_mem_data T>
67+ template <typename T>
68+ requires has_mem_data<T>
6169 constexpr auto & operator -=(this T& t, const difference_type<T>& diff) noexcept
6270 requires requires { t.data () -= diff; }
6371 {
6472 t.data () -= diff;
6573 return t;
6674 }
6775
68- template <details::iterator_has_mem_data T>
76+ template <typename T>
77+ requires has_mem_data<const T>
6978 [[nodiscard]] constexpr decltype (auto ) operator-(this const T& left, decltype (left) right)
7079 noexcept (noexcept (left.data() - right.data()))
7180 requires requires { left.data () - right.data (); }
7281 {
7382 return left.data () - right.data ();
7483 }
7584
76- template <details::iterator_has_mem_data T>
85+ template <typename T>
86+ requires has_mem_data<const T>
7787 [[nodiscard]] constexpr decltype (auto ) operator<=>(this const T& left, decltype (left) right)
7888 noexcept (noexcept (left.data() <=> right.data()))
7989 requires requires { left.data () <=> right.data (); }
8090 {
8191 return left.data () <=> right.data ();
8292 }
8393
84- template <details::iterator_has_mem_data T>
94+ template <typename T>
95+ requires has_mem_data<const T>
8596 [[nodiscard]] constexpr decltype (auto ) operator==(this const T& left, decltype (left) right)
8697 noexcept (noexcept (left.data() == right.data()))
8798 requires requires { left.data () == right.data (); }
@@ -98,7 +109,8 @@ namespace stdsharp
98109 static constexpr void not_null (const auto & /* unused*/ ) noexcept {}
99110
100111 public:
101- template <details::iterator_has_mem_data T>
112+ template <typename T>
113+ requires has_mem_data<const T>
102114 [[nodiscard]] constexpr decltype (auto ) operator*(this const T& t)
103115 noexcept (noexcept (*(t.data())))
104116 requires requires { *(t.data ()); }
@@ -108,7 +120,8 @@ namespace stdsharp
108120 return *ptr;
109121 }
110122
111- template <details::iterator_has_mem_data T>
123+ template <typename T>
124+ requires has_mem_data<const T>
112125 [[nodiscard]] constexpr decltype (auto ) operator[]( //
113126 this const T& t,
114127 const difference_type<T>& diff
0 commit comments