diff --git a/include/kfr/cometa/array.hpp b/include/kfr/cometa/array.hpp index 6a294946..508c627f 100644 --- a/include/kfr/cometa/array.hpp +++ b/include/kfr/cometa/array.hpp @@ -11,6 +11,9 @@ namespace cometa { +template +using container_value_type = std::remove_pointer_t()))>; + /// @brief Reference to array template struct array_ref @@ -29,46 +32,17 @@ struct array_ref using difference_type = std::ptrdiff_t; constexpr array_ref() CMT_NOEXCEPT : m_data(nullptr), m_size(0) {} - constexpr array_ref(const array_ref&) CMT_NOEXCEPT = default; - constexpr array_ref(array_ref&&) CMT_NOEXCEPT = default; -#ifdef CMT_COMPILER_GNU + constexpr array_ref(const array_ref&) CMT_NOEXCEPT = default; + constexpr array_ref(array_ref&&) CMT_NOEXCEPT = default; constexpr array_ref& operator=(const array_ref&) CMT_NOEXCEPT = default; constexpr array_ref& operator=(array_ref&&) CMT_NOEXCEPT = default; -#else - array_ref& operator=(const array_ref&) = default; - array_ref& operator=(array_ref&&) = default; -#endif - template - constexpr array_ref(value_type (&arr)[N]) CMT_NOEXCEPT : m_data(arr), m_size(N) - { - } - template - constexpr array_ref(const std::array& arr) CMT_NOEXCEPT : m_data(arr.data()), m_size(N) - { - } - template - constexpr array_ref(std::array& arr) CMT_NOEXCEPT : m_data(arr.data()), m_size(N) - { - } - template - constexpr array_ref(const std::vector& vec) CMT_NOEXCEPT : m_data(vec.data()), - m_size(vec.size()) + template + array_ref(Container&& cont) : array_ref(std::data(cont), std::size(cont)) { } - template )> - array_ref(Container& cont) : array_ref(cont.data(), cont.size()) - { - } - - constexpr array_ref(const std::initializer_list& vec) CMT_NOEXCEPT : m_data(vec.begin()), - m_size(vec.size()) - { - } - template - constexpr array_ref(InputIter first, InputIter last) CMT_NOEXCEPT : m_data(std::addressof(*first)), - m_size(std::distance(first, last)) + constexpr array_ref(std::initializer_list vec) CMT_NOEXCEPT : m_data(vec.begin()), m_size(vec.size()) { } constexpr array_ref(T* data, size_type size) CMT_NOEXCEPT : m_data(data), m_size(size) {} @@ -89,98 +63,15 @@ struct array_ref size_type m_size; }; -template -inline array_ref make_array_ref(T (&data)[size]) -{ - return array_ref(data); -} - template inline array_ref make_array_ref(T* data, std::size_t size) { - return array_ref(data, data + size); + return array_ref(data, size); } -template ), - typename T = std::remove_pointer_t().data())>> -inline array_ref make_array_ref(Container& cont) -{ - return array_ref(cont.data(), cont.size()); -} - -template ), - typename T = std::remove_pointer_t().data())>> -inline array_ref make_array_ref(const Container& cont) -{ - return array_ref(cont.data(), cont.size()); -} - -template -inline array_ref make_array_ref(std::vector& cont) -{ - return array_ref(cont.data(), cont.size()); -} -template -inline array_ref make_array_ref(const std::vector& cont) -{ - return array_ref(cont.data(), cont.size()); -} - -template -constexpr auto elementtype(C& c) -{ - return c[0]; -} -template -constexpr auto elementtype(const C& c) -{ - return c[0]; -} -template -constexpr E elementtype(const std::initializer_list&) -{ - return {}; -} -template -constexpr T elementtype(T (&)[N]) -{ - return {}; -} - -template -constexpr auto data(C& c) -> decltype(c.data()) -{ - return c.data(); -} -template -constexpr auto data(const C& c) -> decltype(c.data()) -{ - return c.data(); -} -template -constexpr T* data(T (&array)[N]) CMT_NOEXCEPT -{ - return array; -} -template -constexpr T* data(T* array) CMT_NOEXCEPT -{ - return array; -} -template -constexpr const E* data(const std::initializer_list& il) CMT_NOEXCEPT -{ - return il.begin(); -} - -template -constexpr auto size(const C& c) -> decltype(c.size()) -{ - return c.size(); -} -template -constexpr std::size_t size(const T (&)[N]) CMT_NOEXCEPT +template > +inline array_ref make_array_ref(Container&& cont) { - return N; + return array_ref(std::data(cont), std::size(cont)); } } // namespace cometa