From 1c8dfb55d8147ea646d7049aa15b181f24ac6c76 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 30 May 2019 11:46:48 -0700 Subject: [PATCH] Improve span constructor requirements Particularly, properly account for the const-ness of the data returned by it. --- common/alspan.h | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/common/alspan.h b/common/alspan.h index d02b13f2..62f7b2ab 100644 --- a/common/alspan.h +++ b/common/alspan.h @@ -75,10 +75,12 @@ namespace detail_ { } // namespace detail_ #define REQUIRES(...) typename std::enable_if<(__VA_ARGS__),int>::type = 0 +#define USABLE_CONTAINER_DATA(...) \ + std::is_convertible()))>::type(*)[],element_type(*)[]>::value #define IS_VALID_CONTAINER(C) \ !detail_::is_span::value && !detail_::is_std_array::value && \ !std::is_array::value && detail_::has_size_and_data::value && \ - std::is_convertible()))>::type(*)[],element_type(*)[]>::value + USABLE_CONTAINER_DATA(C&) template class span { @@ -108,13 +110,13 @@ public: constexpr span(pointer first, pointer /*last*/) : mData{first} { } template constexpr span(element_type (&arr)[N]) noexcept : span{al::data(arr), al::size(arr)} { } - template::value)> + template&))> constexpr span(std::array &arr) noexcept : span{al::data(arr), al::size(arr)} { } - template::value)> + template&))> constexpr span(const std::array &arr) noexcept : span{al::data(arr), al::size(arr)} { } template constexpr span(U &cont) : span{al::data(cont), al::size(cont)} { } - template + template constexpr span(const U &cont) : span{al::data(cont), al::size(cont)} { } template::value && extent == N && std::is_convertible::value)> constexpr span(const span &span_) noexcept : span{al::data(span_), al::size(span_)} { } @@ -202,13 +204,13 @@ public: constexpr span(pointer first, pointer last) : mData{first}, mDataEnd{last} { } template constexpr span(element_type (&arr)[N]) noexcept : span{al::data(arr), al::size(arr)} { } - template::value)> + template&))> constexpr span(std::array &arr) noexcept : span{al::data(arr), al::size(arr)} { } - template::value)> + template&))> constexpr span(const std::array &arr) noexcept : span{al::data(arr), al::size(arr)} { } template constexpr span(U &cont) : span{al::data(cont), al::size(cont)} { } - template + template constexpr span(const U &cont) : span{al::data(cont), al::size(cont)} { } template::value || extent != N) && std::is_convertible::value)> constexpr span(const span &span_) noexcept : span{al::data(span_), al::size(span_)} { } @@ -288,6 +290,7 @@ constexpr inline auto span::subspan(size_t offset, size_t count) const -> s } #undef IS_VALID_CONTAINER +#undef USABLE_CONTAINER_DATA #undef REQUIRES } // namespace al