|
@@ -0,0 +1,93 @@ |
|
|
|
|
|
// |
|
|
|
|
|
// Lol Engine |
|
|
|
|
|
// |
|
|
|
|
|
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> |
|
|
|
|
|
// (c) 2013-2014 Benjamin "Touky" Huet <huet.benjamin@gmail.com> |
|
|
|
|
|
// This program is free software; you can redistribute it and/or |
|
|
|
|
|
// modify it under the terms of the Do What The Fuck You Want To |
|
|
|
|
|
// Public License, Version 2, as published by Sam Hocevar. See |
|
|
|
|
|
// http://www.wtfpl.net/ for more details. |
|
|
|
|
|
// |
|
|
|
|
|
|
|
|
|
|
|
// |
|
|
|
|
|
// The arrayNd class |
|
|
|
|
|
// ----------------- |
|
|
|
|
|
// A N-Dimensional array class allowing var[i][j][k]... indexing, |
|
|
|
|
|
// |
|
|
|
|
|
|
|
|
|
|
|
// |
|
|
|
|
|
// FIXME: This file is in lol/math/ instead of lol/base/ because it |
|
|
|
|
|
// uses ivec3. |
|
|
|
|
|
// |
|
|
|
|
|
|
|
|
|
|
|
#if !defined __LOL_MATH_ARRAYND_H__ |
|
|
|
|
|
#define __LOL_MATH_ARRAYND_H__ |
|
|
|
|
|
|
|
|
|
|
|
#include <lol/base/array.h> |
|
|
|
|
|
#include <lol/base/assert.h> |
|
|
|
|
|
|
|
|
|
|
|
namespace lol |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
template<size_t N, typename T1, typename T2 = void, typename T3 = void, |
|
|
|
|
|
typename T4 = void, typename T5 = void, typename T6 = void, |
|
|
|
|
|
typename T7 = void, typename T8 = void> |
|
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
|
|
inline arraynd() : |
|
|
|
|
|
m_sizes() |
|
|
|
|
|
{ |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
inline arraynd(vec_t<size_t, N> sizes, element_t e = element_t()) : |
|
|
|
|
|
m_sizes(sizes) |
|
|
|
|
|
{ |
|
|
|
|
|
SetSize(m_sizes, e); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Access elements directly using an ivec3 index */ |
|
|
|
|
|
inline element_t const &operator [](ivec3 pos) const |
|
|
|
|
|
{ |
|
|
|
|
|
return element_t(); // TODO |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
inline size_t ComputeTotalSize(vec_t<size_t, N> sizes) |
|
|
|
|
|
{ |
|
|
|
|
|
size_t total_size = 1; |
|
|
|
|
|
|
|
|
|
|
|
for (auto size : sizes) |
|
|
|
|
|
total_size *= size; |
|
|
|
|
|
|
|
|
|
|
|
return total_size; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Resize the array. |
|
|
|
|
|
* FIXME: data gets scrambled; should we care? */ |
|
|
|
|
|
inline void SetSize(vec_t<size_t, N> sizes, element_t e = element_t()) |
|
|
|
|
|
{ |
|
|
|
|
|
this->Resize(ComputeTotalSize(sizes), e); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
inline vec_t<size_t, N> GetSize() const |
|
|
|
|
|
{ |
|
|
|
|
|
return ComputeTotalSize(this->m_sizes); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public: |
|
|
|
|
|
inline element_t *Data() { return super::Data(); } |
|
|
|
|
|
inline element_t const *Data() const { return super::Data(); } |
|
|
|
|
|
inline int Count() const { return super::Count(); } |
|
|
|
|
|
inline int Bytes() const { return super::Bytes(); } |
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
vec_t<size_t, N> m_sizes; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
} /* namespace lol */ |
|
|
|
|
|
|
|
|
|
|
|
#endif // __LOL_MATH_ARRAYND_H__ |
|
|
|
|
|
|