Browse Source

arraynd: templating proxy’s inner array type instead of specializing

undefined
Guillaume Bittoun Sam Hocevar <sam@hocevar.net> 10 years ago
parent
commit
1b784d3a24
1 changed files with 10 additions and 225 deletions
  1. +10
    -225
      src/lol/math/arraynd.h

+ 10
- 225
src/lol/math/arraynd.h View File

@@ -29,17 +29,14 @@
namespace lol 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 class arraynd_proxy
{ {
public: 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_array(array),
m_sizes(sizes), m_sizes(sizes),
m_index(index), m_index(index),
@@ -54,231 +51,19 @@ public:


private: 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; vec_t<size_t, N> const & m_sizes;
size_t m_index; size_t m_index;
size_t m_accumulator; 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: 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_array(array),
m_sizes(sizes), m_sizes(sizes),
m_index(index), 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]; return m_array[m_index + pos * m_accumulator];
} }


private: private:


array_type * m_array;
ARRAY_TYPE * m_array;
vec_t<size_t, N> const & m_sizes; vec_t<size_t, N> const & m_sizes;
size_t m_index; size_t m_index;
size_t m_accumulator; size_t m_accumulator;
@@ -308,7 +93,7 @@ class arraynd : protected array<T1, T2, T3, T4, T5, T6, T7, T8>
public: public:
typedef array<T1, T2, T3, T4, T5, T6, T7, T8> super; typedef array<T1, T2, T3, T4, T5, T6, T7, T8> super;
typedef typename super::element_t element_t; 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() : inline arraynd() :
super(), super(),


Loading…
Cancel
Save