diff --git a/src/lol/math/arraynd.h b/src/lol/math/arraynd.h index 90968370..0348a83d 100644 --- a/src/lol/math/arraynd.h +++ b/src/lol/math/arraynd.h @@ -29,17 +29,14 @@ namespace lol { -template<size_t N, size_t L, typename T1, typename T2 = void, typename T3 = void, - typename T4 = void, typename T5 = void, typename T6 = void, - typename T7 = void, typename T8 = void> +template<size_t N, size_t L, typename ARRAY_TYPE> class arraynd_proxy { public: - typedef array<T1, T2, T3, T4, T5, T6, T7, T8> array_type; - typedef arraynd_proxy<N, L - 1, T1, T2, T3, T4, T5, T6, T7, T8> subproxy; + typedef arraynd_proxy<N, L - 1, ARRAY_TYPE> subproxy; - inline arraynd_proxy(array_type * array, vec_t<size_t, N> const & sizes, size_t index, size_t accumulator) : + inline arraynd_proxy(ARRAY_TYPE * array, vec_t<size_t, N> const & sizes, size_t index, size_t accumulator) : m_array(array), m_sizes(sizes), m_index(index), @@ -54,231 +51,19 @@ public: private: - array_type * m_array; - vec_t<size_t, N> const & m_sizes; - size_t m_index; - size_t m_accumulator; -}; - - -template<size_t N, typename T1, typename T2, typename T3, - typename T4, typename T5, typename T6, - typename T7, typename T8> -class arraynd_proxy<N, 1, T1, T2, T3, T4, T5, T6, T7, T8> -{ -public: - - typedef array<T1, T2, T3, T4, T5, T6, T7, T8> array_type; - - inline arraynd_proxy(array_type * array, vec_t<size_t, N> const & sizes, size_t index, size_t accumulator) : - m_array(array), - m_sizes(sizes), - m_index(index), - m_accumulator(accumulator) - { - } - - inline typename array_type::element_t & operator[](size_t pos) - { - return m_array[m_index + pos * m_accumulator]; - } - -private: - - array_type * m_array; - vec_t<size_t, N> const & m_sizes; - size_t m_index; - size_t m_accumulator; -}; - - -template<size_t N, typename T1, typename T2, typename T3, - typename T4, typename T5, typename T6, - typename T7> -class arraynd_proxy<N, 1, T1, T2, T3, T4, T5, T6, T7, void> -{ -public: - - typedef array<T1, T2, T3, T4, T5, T6, T7, void> array_type; - - inline arraynd_proxy(array_type * array, vec_t<size_t, N> const & sizes, size_t index, size_t accumulator) : - m_array(array), - m_sizes(sizes), - m_index(index), - m_accumulator(accumulator) - { - } - - inline typename array_type::element_t & operator[](size_t pos) - { - return m_array[m_index + pos * m_accumulator]; - } - -private: - - array_type * m_array; - vec_t<size_t, N> const & m_sizes; - size_t m_index; - size_t m_accumulator; -}; - - -template<size_t N, typename T1, typename T2, typename T3, - typename T4, typename T5, typename T6> -class arraynd_proxy<N, 1, T1, T2, T3, T4, T5, T6, void, void> -{ -public: - - typedef array<T1, T2, T3, T4, T5, T6, void, void> array_type; - - inline arraynd_proxy(array_type * array, vec_t<size_t, N> const & sizes, size_t index, size_t accumulator) : - m_array(array), - m_sizes(sizes), - m_index(index), - m_accumulator(accumulator) - { - } - - inline typename array_type::element_t & operator[](size_t pos) - { - return m_array[m_index + pos * m_accumulator]; - } - -private: - - array_type * m_array; - vec_t<size_t, N> const & m_sizes; - size_t m_index; - size_t m_accumulator; -}; - - -template<size_t N, typename T1, typename T2, typename T3, - typename T4, typename T5> -class arraynd_proxy<N, 1, T1, T2, T3, T4, T5, void, void, void> -{ -public: - - typedef array<T1, T2, T3, T4, T5, void, void, void> array_type; - - inline arraynd_proxy(array_type * array, vec_t<size_t, N> const & sizes, size_t index, size_t accumulator) : - m_array(array), - m_sizes(sizes), - m_index(index), - m_accumulator(accumulator) - { - } - - inline typename array_type::element_t & operator[](size_t pos) - { - return m_array[m_index + pos * m_accumulator]; - } - -private: - - array_type * m_array; - vec_t<size_t, N> const & m_sizes; - size_t m_index; - size_t m_accumulator; -}; - - -template<size_t N, typename T1, typename T2, typename T3, - typename T4> -class arraynd_proxy<N, 1, T1, T2, T3, T4, void, void, void, void> -{ -public: - - typedef array<T1, T2, T3, T4, void, void, void, void> array_type; - - inline arraynd_proxy(array_type * array, vec_t<size_t, N> const & sizes, size_t index, size_t accumulator) : - m_array(array), - m_sizes(sizes), - m_index(index), - m_accumulator(accumulator) - { - } - - inline typename array_type::element_t & operator[](size_t pos) - { - return m_array[m_index + pos * m_accumulator]; - } - -private: - - array_type * m_array; - vec_t<size_t, N> const & m_sizes; - size_t m_index; - size_t m_accumulator; -}; - - -template<size_t N, typename T1, typename T2, typename T3> -class arraynd_proxy<N, 1, T1, T2, T3, void, void, void, void, void> -{ -public: - - typedef array<T1, T2, T3, void, void, void, void, void> array_type; - - inline arraynd_proxy(array_type * array, vec_t<size_t, N> const & sizes, size_t index, size_t accumulator) : - m_array(array), - m_sizes(sizes), - m_index(index), - m_accumulator(accumulator) - { - } - - inline typename array_type::element_t & operator[](size_t pos) - { - return m_array[m_index + pos * m_accumulator]; - } - -private: - - array_type * m_array; + ARRAY_TYPE * m_array; vec_t<size_t, N> const & m_sizes; size_t m_index; size_t m_accumulator; }; -template<size_t N, typename T1, typename T2> -class arraynd_proxy<N, 1, T1, T2, void, void, void, void, void, void> +template<size_t N, typename ARRAY_TYPE> +class arraynd_proxy<N, 1, ARRAY_TYPE> { public: - typedef array<T1, T2, void, void, void, void, void, void> array_type; - - inline arraynd_proxy(array_type * array, vec_t<size_t, N> const & sizes, size_t index, size_t accumulator) : - m_array(array), - m_sizes(sizes), - m_index(index), - m_accumulator(accumulator) - { - } - - inline typename array_type::element_t & operator[](size_t pos) - { - return m_array[m_index + pos * m_accumulator]; - } - -private: - - array_type * m_array; - vec_t<size_t, N> const & m_sizes; - size_t m_index; - size_t m_accumulator; -}; - - -template<size_t N, typename T1> -class arraynd_proxy<N, 1, T1, void, void, void, void, void, void, void> -{ -public: - - typedef array<T1, void, void, void, void, void, void, void> array_type; - - inline arraynd_proxy(array_type * array, vec_t<size_t, N> const & sizes, size_t index, size_t accumulator) : + inline arraynd_proxy(ARRAY_TYPE * array, vec_t<size_t, N> const & sizes, size_t index, size_t accumulator) : m_array(array), m_sizes(sizes), m_index(index), @@ -286,14 +71,14 @@ public: { } - inline typename array_type::element_t & operator[](size_t pos) + inline typename ARRAY_TYPE::element_t & operator[](size_t pos) { return m_array[m_index + pos * m_accumulator]; } private: - array_type * m_array; + ARRAY_TYPE * m_array; vec_t<size_t, N> const & m_sizes; size_t m_index; size_t m_accumulator; @@ -308,7 +93,7 @@ class arraynd : protected array<T1, T2, T3, T4, T5, T6, T7, T8> public: typedef array<T1, T2, T3, T4, T5, T6, T7, T8> super; typedef typename super::element_t element_t; - typedef arraynd_proxy<N, N, T1, T2, T3, T4, T5, T6, T7, T8> proxy; + typedef arraynd_proxy<N, N, super> proxy; inline arraynd() : super(),