kfr

Fast, modern C++ DSP framework, FFT, Sample Rate Conversion, FIR/IIR/Biquad Filters (SSE, AVX, AVX-512, ARM NEON)
Log | Files | Refs | README

commit 22d5a241534bdaeee497c3eacf17527660e5542b
parent 5ed77d17d33c5c32522e5e440b8d6847b6ab970c
Author: d.levin256@gmail.com <d.levin256@gmail.com>
Date:   Mon,  5 Feb 2024 08:38:03 +0000

array_ref refactoring

Diffstat:
Minclude/kfr/cometa/array.hpp | 133++++++++-----------------------------------------------------------------------
1 file changed, 12 insertions(+), 121 deletions(-)

diff --git a/include/kfr/cometa/array.hpp b/include/kfr/cometa/array.hpp @@ -11,6 +11,9 @@ namespace cometa { +template <typename Container> +using container_value_type = std::remove_pointer_t<decltype(std::data(std::declval<Container>()))>; + /// @brief Reference to array template <typename T> struct array_ref @@ -29,46 +32,17 @@ public: 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 <size_t N> - constexpr array_ref(value_type (&arr)[N]) CMT_NOEXCEPT : m_data(arr), m_size(N) - { - } - template <size_t N> - constexpr array_ref(const std::array<T, N>& arr) CMT_NOEXCEPT : m_data(arr.data()), m_size(N) - { - } - template <size_t N> - constexpr array_ref(std::array<T, N>& arr) CMT_NOEXCEPT : m_data(arr.data()), m_size(N) - { - } - template <typename Alloc> - constexpr array_ref(const std::vector<T, Alloc>& vec) CMT_NOEXCEPT : m_data(vec.data()), - m_size(vec.size()) + template <typename Container, CMT_HAS_DATA_SIZE(Container)> + array_ref(Container&& cont) : array_ref(std::data(cont), std::size(cont)) { } - template <typename Container, CMT_ENABLE_IF(has_data_size<Container>)> - array_ref(Container& cont) : array_ref(cont.data(), cont.size()) - { - } - - constexpr array_ref(const std::initializer_list<T>& vec) CMT_NOEXCEPT : m_data(vec.begin()), - m_size(vec.size()) - { - } - template <typename InputIter> - 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<T> 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 @@ private: size_type m_size; }; -template <typename T, std::size_t size> -inline array_ref<T> make_array_ref(T (&data)[size]) -{ - return array_ref<T>(data); -} - template <typename T> inline array_ref<T> make_array_ref(T* data, std::size_t size) { - return array_ref<T>(data, data + size); + return array_ref<T>(data, size); } -template <typename Container, CMT_ENABLE_IF(has_data_size<Container>), - typename T = std::remove_pointer_t<decltype(std::declval<Container>().data())>> -inline array_ref<T> make_array_ref(Container& cont) -{ - return array_ref<T>(cont.data(), cont.size()); -} - -template <typename Container, CMT_ENABLE_IF(has_data_size<Container>), - typename T = std::remove_pointer_t<decltype(std::declval<Container>().data())>> -inline array_ref<const T> make_array_ref(const Container& cont) -{ - return array_ref<const T>(cont.data(), cont.size()); -} - -template <typename T> -inline array_ref<T> make_array_ref(std::vector<T>& cont) -{ - return array_ref<T>(cont.data(), cont.size()); -} -template <typename T> -inline array_ref<const T> make_array_ref(const std::vector<T>& cont) -{ - return array_ref<const T>(cont.data(), cont.size()); -} - -template <typename C> -constexpr auto elementtype(C& c) -{ - return c[0]; -} -template <typename C> -constexpr auto elementtype(const C& c) -{ - return c[0]; -} -template <typename E> -constexpr E elementtype(const std::initializer_list<E>&) -{ - return {}; -} -template <typename T, std::size_t N> -constexpr T elementtype(T (&)[N]) -{ - return {}; -} - -template <typename C> -constexpr auto data(C& c) -> decltype(c.data()) -{ - return c.data(); -} -template <typename C> -constexpr auto data(const C& c) -> decltype(c.data()) -{ - return c.data(); -} -template <typename T, std::size_t N> -constexpr T* data(T (&array)[N]) CMT_NOEXCEPT -{ - return array; -} -template <typename T> -constexpr T* data(T* array) CMT_NOEXCEPT -{ - return array; -} -template <typename E> -constexpr const E* data(const std::initializer_list<E>& il) CMT_NOEXCEPT -{ - return il.begin(); -} - -template <typename C> -constexpr auto size(const C& c) -> decltype(c.size()) -{ - return c.size(); -} -template <typename T, std::size_t N> -constexpr std::size_t size(const T (&)[N]) CMT_NOEXCEPT +template <typename Container, CMT_HAS_DATA_SIZE(Container), typename T = container_value_type<Container>> +inline array_ref<T> make_array_ref(Container&& cont) { - return N; + return array_ref<T>(std::data(cont), std::size(cont)); } } // namespace cometa