Skip to content

Commit 62733fe

Browse files
committed
span: (almost) match std::span's constructor behavior
c++20's draft of std::span no longer includes move constructors.
1 parent f32f7e9 commit 62733fe

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

src/span.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ class Span
2828
C* m_data;
2929
std::size_t m_size;
3030

31+
template <class T>
32+
struct is_Span_int : public std::false_type {};
33+
template <class T>
34+
struct is_Span_int<Span<T>> : public std::true_type {};
35+
template <class T>
36+
struct is_Span : public is_Span_int<typename std::remove_cv<T>::type>{};
37+
38+
3139
public:
3240
constexpr Span() noexcept : m_data(nullptr), m_size(0) {}
3341

@@ -78,8 +86,19 @@ class Span
7886
* To prevent surprises, only Spans for constant value types are supported when passing in temporaries.
7987
* Note that this restriction does not exist when converting arrays or other Spans (see above).
8088
*/
81-
template <typename V, typename std::enable_if<(std::is_const<C>::value || std::is_lvalue_reference<V>::value) && std::is_convertible<typename std::remove_pointer<decltype(std::declval<V&>().data())>::type (*)[], C (*)[]>::value && std::is_convertible<decltype(std::declval<V&>().size()), std::size_t>::value, int>::type = 0>
82-
constexpr Span(V&& v) noexcept : m_data(v.data()), m_size(v.size()) {}
89+
template <typename V>
90+
constexpr Span(V& other,
91+
typename std::enable_if<!is_Span<V>::value &&
92+
std::is_convertible<typename std::remove_pointer<decltype(std::declval<V&>().data())>::type (*)[], C (*)[]>::value &&
93+
std::is_convertible<decltype(std::declval<V&>().size()), std::size_t>::value, std::nullptr_t>::type = nullptr)
94+
: m_data(other.data()), m_size(other.size()){}
95+
96+
template <typename V>
97+
constexpr Span(const V& other,
98+
typename std::enable_if<!is_Span<V>::value &&
99+
std::is_convertible<typename std::remove_pointer<decltype(std::declval<const V&>().data())>::type (*)[], C (*)[]>::value &&
100+
std::is_convertible<decltype(std::declval<const V&>().size()), std::size_t>::value, std::nullptr_t>::type = nullptr)
101+
: m_data(other.data()), m_size(other.size()){}
83102

84103
constexpr C* data() const noexcept { return m_data; }
85104
constexpr C* begin() const noexcept { return m_data; }

0 commit comments

Comments
 (0)