diff --git a/src/lol/math/arraynd.h b/src/lol/math/arraynd.h new file mode 100644 index 00000000..eb153fce --- /dev/null +++ b/src/lol/math/arraynd.h @@ -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__ +