@@ -21,6 +21,11 @@ namespace stdsharp
21
21
default_operator::subscript,
22
22
default_operator::plus_commutative
23
23
{
24
+ private:
25
+ template <typename T>
26
+ static constexpr auto has_mem_data = requires (T& t) { t.data (); };
27
+
28
+ public:
24
29
template <typename T>
25
30
using difference_type = std::iter_difference_t <decltype (std::declval<const T&>().data())>;
26
31
@@ -33,55 +38,61 @@ namespace stdsharp
33
38
using increase::operator --;
34
39
using arithmetic::operator -;
35
40
36
- template <details::iterator_has_mem_data T>
41
+ template <typename T>
42
+ requires has_mem_data<T>
37
43
constexpr auto & operator ++(this T& t) noexcept (noexcept (++t.data()))
38
- requires requires { ++t.data (); }
39
44
{
40
45
++t.data ();
41
46
return t;
42
47
}
43
48
44
- template <details::iterator_has_mem_data T>
49
+ template <typename T>
50
+ requires has_mem_data<T>
45
51
constexpr auto & operator --(this T& t) noexcept (noexcept (--t.data()))
46
52
requires requires { --t.data (); }
47
53
{
48
54
--t.data ();
49
55
return t;
50
56
}
51
57
52
- template <details::iterator_has_mem_data T>
58
+ template <typename T>
59
+ requires has_mem_data<T>
53
60
constexpr auto & operator +=(this T& t, const difference_type<T>& diff) noexcept
54
61
requires requires { t.data () += diff; }
55
62
{
56
63
t.data () += diff;
57
64
return t;
58
65
}
59
66
60
- template <details::iterator_has_mem_data T>
67
+ template <typename T>
68
+ requires has_mem_data<T>
61
69
constexpr auto & operator -=(this T& t, const difference_type<T>& diff) noexcept
62
70
requires requires { t.data () -= diff; }
63
71
{
64
72
t.data () -= diff;
65
73
return t;
66
74
}
67
75
68
- template <details::iterator_has_mem_data T>
76
+ template <typename T>
77
+ requires has_mem_data<const T>
69
78
[[nodiscard]] constexpr decltype (auto ) operator-(this const T& left, decltype (left) right)
70
79
noexcept (noexcept (left.data() - right.data()))
71
80
requires requires { left.data () - right.data (); }
72
81
{
73
82
return left.data () - right.data ();
74
83
}
75
84
76
- template <details::iterator_has_mem_data T>
85
+ template <typename T>
86
+ requires has_mem_data<const T>
77
87
[[nodiscard]] constexpr decltype (auto ) operator<=>(this const T& left, decltype (left) right)
78
88
noexcept (noexcept (left.data() <=> right.data()))
79
89
requires requires { left.data () <=> right.data (); }
80
90
{
81
91
return left.data () <=> right.data ();
82
92
}
83
93
84
- template <details::iterator_has_mem_data T>
94
+ template <typename T>
95
+ requires has_mem_data<const T>
85
96
[[nodiscard]] constexpr decltype (auto ) operator==(this const T& left, decltype (left) right)
86
97
noexcept (noexcept (left.data() == right.data()))
87
98
requires requires { left.data () == right.data (); }
@@ -98,7 +109,8 @@ namespace stdsharp
98
109
static constexpr void not_null (const auto & /* unused*/ ) noexcept {}
99
110
100
111
public:
101
- template <details::iterator_has_mem_data T>
112
+ template <typename T>
113
+ requires has_mem_data<const T>
102
114
[[nodiscard]] constexpr decltype (auto ) operator*(this const T& t)
103
115
noexcept (noexcept (*(t.data())))
104
116
requires requires { *(t.data ()); }
@@ -108,7 +120,8 @@ namespace stdsharp
108
120
return *ptr;
109
121
}
110
122
111
- template <details::iterator_has_mem_data T>
123
+ template <typename T>
124
+ requires has_mem_data<const T>
112
125
[[nodiscard]] constexpr decltype (auto ) operator[]( //
113
126
this const T& t,
114
127
const difference_type<T>& diff
0 commit comments