Skip to content

Commit 713f189

Browse files
committed
fix(basic-iterator): fix msvc errors
1 parent a6bcc85 commit 713f189

File tree

2 files changed

+31
-12
lines changed

2 files changed

+31
-12
lines changed

include/stdsharp/iterator/basic_iterator.h

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

include/stdsharp/memory/launder_iterator.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@
55

66
#include <new>
77

8+
#include "../compilation_config_in.h"
9+
810
namespace stdsharp
911
{
1012
template<typename T>
11-
class launder_iterator : public basic_iterator
13+
class STDSHARP_EBO launder_iterator :
14+
public basic_iterator,
15+
public std::random_access_iterator_tag
1216
{
1317
T* ptr_;
1418

@@ -39,4 +43,6 @@ namespace stdsharp
3943

4044
template<typename T>
4145
launder_iterator(T*) -> launder_iterator<T>;
42-
}
46+
}
47+
48+
#include "../compilation_config_out.h"

0 commit comments

Comments
 (0)