| @@ -20,8 +20,6 @@ | |||
| #include <lol/math/matrix.h> | |||
| #include <lol/math/transform.h> | |||
| #include <lol/math/arraynd.h> | |||
| #include <lol/math/array2d.h> | |||
| #include <lol/math/array3d.h> | |||
| #include <lol/math/geometry.h> | |||
| #include <lol/math/interp.h> | |||
| #include <lol/math/rand.h> | |||
| @@ -1,178 +0,0 @@ | |||
| // | |||
| // 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 array2d class | |||
| // ----------------- | |||
| // A very simple 2D array class allowing var[i][j] indexing, with some nice | |||
| // additional features, eg. array2d<int,float> for automatic arrays of tuples. | |||
| // | |||
| // | |||
| // FIXME: This file is in lol/math/ instead of lol/base/ because it | |||
| // uses ivec2. | |||
| // | |||
| #if !defined __LOL_MATH_ARRAY2D_H__ | |||
| #define __LOL_MATH_ARRAY2D_H__ | |||
| #include <lol/base/array.h> | |||
| #include <lol/base/assert.h> | |||
| namespace lol | |||
| { | |||
| template<typename... T> | |||
| class array2d : protected array<T...> | |||
| { | |||
| public: | |||
| typedef array<T...> super; | |||
| typedef typename super::element_t element_t; | |||
| inline array2d() | |||
| : m_size(0, 0) | |||
| { | |||
| } | |||
| inline array2d(std::initializer_list< | |||
| std::initializer_list<element_t>> const &list) | |||
| : m_size(list.size() ? (int)(*list.begin()).size() : 0, | |||
| (int)list.size()) | |||
| { | |||
| super::Reserve(m_size.x * m_size.y); | |||
| for (auto l : list) | |||
| for (auto elem : l) | |||
| super::Push(elem); | |||
| } | |||
| inline array2d(int w, int h) | |||
| { | |||
| SetSize(ivec2(w, h)); | |||
| } | |||
| inline array2d(ivec2 size) | |||
| { | |||
| SetSize(size); | |||
| } | |||
| /* Access elements directly using an ivec2 index */ | |||
| inline element_t const &operator [](ivec2 pos) const | |||
| { | |||
| ASSERT(pos.x >= 0); | |||
| ASSERT(pos.y >= 0); | |||
| ASSERT(pos.x < m_size.x); | |||
| ASSERT(pos.y < m_size.y); | |||
| ptrdiff_t n = pos.y * m_size.x + pos.x; | |||
| ASSERT(n >= 0); | |||
| ASSERT(n < this->m_count); | |||
| return this->m_data[n]; | |||
| } | |||
| inline element_t &operator [](ivec2 pos) | |||
| { | |||
| ASSERT(pos.x >= 0); | |||
| ASSERT(pos.y >= 0); | |||
| ASSERT(pos.x < m_size.x); | |||
| ASSERT(pos.y < m_size.y); | |||
| ptrdiff_t n = pos.y * m_size.x + pos.x; | |||
| ASSERT(n >= 0); | |||
| ASSERT(n < this->m_count); | |||
| return this->m_data[n]; | |||
| } | |||
| class Column | |||
| { | |||
| public: | |||
| inline Column(array2d &array, ptrdiff_t i) | |||
| : m_array(array), | |||
| m_column(i) | |||
| { | |||
| } | |||
| inline element_t &operator [](ptrdiff_t j) | |||
| { | |||
| ASSERT(j >= 0); | |||
| ASSERT(j < m_array.m_size.y); | |||
| return m_array[ivec2(m_column, j)]; | |||
| } | |||
| private: | |||
| array2d<T...> &m_array; | |||
| ptrdiff_t m_column; | |||
| }; | |||
| class ConstColumn | |||
| { | |||
| public: | |||
| inline ConstColumn(array2d const &array, ptrdiff_t i) | |||
| : m_array(array), | |||
| m_column(i) | |||
| { | |||
| } | |||
| inline element_t const &operator [](ptrdiff_t j) const | |||
| { | |||
| ASSERT(j >= 0); | |||
| ASSERT(j < m_array.m_size.y); | |||
| return m_array[ivec2(m_column, j)]; | |||
| } | |||
| private: | |||
| array2d<T...> const &m_array; | |||
| ptrdiff_t m_column; | |||
| }; | |||
| /* Access addressable columns, allowing for array[i][j] syntax. */ | |||
| inline class Column operator [](ptrdiff_t i) | |||
| { | |||
| ASSERT(i >= 0); | |||
| ASSERT(i < m_size.x); | |||
| return Column(*this, i); | |||
| } | |||
| inline class ConstColumn operator [](ptrdiff_t i) const | |||
| { | |||
| ASSERT(i >= 0); | |||
| ASSERT(i < m_size.x); | |||
| return ConstColumn(*this, i); | |||
| } | |||
| /* Resize the array. | |||
| * FIXME: data gets scrambled; should we care? */ | |||
| inline void SetSize(ivec2 size, element_t e = element_t()) | |||
| { | |||
| this->Resize(size.x * size.y, e); | |||
| m_size = size; | |||
| } | |||
| inline ivec2 GetSize() const | |||
| { | |||
| return m_size; | |||
| } | |||
| public: | |||
| inline element_t *Data() { return super::Data(); } | |||
| inline element_t const *Data() const { return super::Data(); } | |||
| inline ptrdiff_t Count() const { return super::Count(); } | |||
| inline ptrdiff_t Bytes() const { return super::Bytes(); } | |||
| private: | |||
| ivec2 m_size; | |||
| }; | |||
| } /* namespace lol */ | |||
| #endif // __LOL_MATH_ARRAY2D_H__ | |||
| @@ -1,228 +0,0 @@ | |||
| // | |||
| // 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 array3d class | |||
| // ----------------- | |||
| // A very simple 3D array class allowing var[i][j][k] indexing, with some nice | |||
| // additional features, eg. array3d<int,float> for automatic arrays of tuples. | |||
| // | |||
| // | |||
| // FIXME: This file is in lol/math/ instead of lol/base/ because it | |||
| // uses ivec3. | |||
| // | |||
| #if !defined __LOL_MATH_ARRAY3D_H__ | |||
| #define __LOL_MATH_ARRAY3D_H__ | |||
| #include <lol/base/array.h> | |||
| #include <lol/base/assert.h> | |||
| namespace lol | |||
| { | |||
| template<typename... T> | |||
| class array3d : protected array<T...> | |||
| { | |||
| public: | |||
| typedef array<T...> super; | |||
| typedef typename super::element_t element_t; | |||
| inline array3d() | |||
| : m_size(0, 0, 0) | |||
| { | |||
| } | |||
| inline array3d(std::initializer_list< | |||
| std::initializer_list< | |||
| std::initializer_list<element_t>>> const &list) | |||
| : m_size(list.size() && (*list.begin()).size() ? | |||
| (int)(*(*list.begin()).begin()).size() : 0, | |||
| list.size() ? (int)(*list.begin()).size() : 0, | |||
| (int)list.size()) | |||
| { | |||
| super::Reserve(m_size.x * m_size.y * m_size.z); | |||
| for (auto ll : list) | |||
| for (auto l : ll) | |||
| for (auto elem : l) | |||
| super::Push(elem); | |||
| } | |||
| inline array3d(int w, int h, int d) | |||
| { | |||
| SetSize(ivec3(w, h, d)); | |||
| } | |||
| inline array3d(ivec3 size) | |||
| { | |||
| SetSize(size); | |||
| } | |||
| /* Access elements directly using an ivec3 index */ | |||
| inline element_t const &operator [](ivec3 pos) const | |||
| { | |||
| ASSERT(pos.x >= 0); | |||
| ASSERT(pos.y >= 0); | |||
| ASSERT(pos.z >= 0); | |||
| ASSERT(pos.x < m_size.x); | |||
| ASSERT(pos.y < m_size.y); | |||
| ASSERT(pos.z < m_size.z); | |||
| ptrdiff_t n = (pos.z * m_size.y + pos.y) * m_size.x + pos.x; | |||
| ASSERT(n >= 0); | |||
| ASSERT(n < this->m_count); | |||
| return this->m_data[n]; | |||
| } | |||
| inline element_t &operator [](ivec3 pos) | |||
| { | |||
| ASSERT(pos.x >= 0); | |||
| ASSERT(pos.y >= 0); | |||
| ASSERT(pos.z >= 0); | |||
| ASSERT(pos.x < m_size.x); | |||
| ASSERT(pos.y < m_size.y); | |||
| ASSERT(pos.z < m_size.z); | |||
| ptrdiff_t n = (pos.z * m_size.y + pos.y) * m_size.x + pos.x; | |||
| ASSERT(n >= 0); | |||
| ASSERT(n < this->m_count); | |||
| return this->m_data[n]; | |||
| } | |||
| class Slice | |||
| { | |||
| public: | |||
| inline Slice(array3d &array, ptrdiff_t i) | |||
| : m_array(array), | |||
| m_slice(i) | |||
| { | |||
| } | |||
| class Line | |||
| { | |||
| public: | |||
| inline Line(array3d &array, ivec2 ij) | |||
| : m_array(array), | |||
| m_line(ij) | |||
| { | |||
| } | |||
| inline element_t &operator [](ptrdiff_t k) | |||
| { | |||
| ASSERT(k >= 0); | |||
| ASSERT(k < m_array.m_size.z); | |||
| return m_array[ivec3(m_line, k)]; | |||
| } | |||
| private: | |||
| array3d<T...> &m_array; | |||
| ivec2 m_line; | |||
| }; | |||
| inline class Line operator [](ptrdiff_t j) | |||
| { | |||
| ASSERT(j >= 0); | |||
| ASSERT(j < m_array.m_size.y); | |||
| return Line(m_array, ivec2(m_slice, j)); | |||
| } | |||
| private: | |||
| array3d<T...> &m_array; | |||
| ptrdiff_t m_slice; | |||
| }; | |||
| class ConstSlice | |||
| { | |||
| public: | |||
| inline ConstSlice(array3d const &array, ptrdiff_t i) | |||
| : m_array(array), | |||
| m_slice(i) | |||
| { | |||
| } | |||
| class Line | |||
| { | |||
| public: | |||
| inline Line(array3d const &array, ivec2 ij) | |||
| : m_array(array), | |||
| m_line(ij) | |||
| { | |||
| } | |||
| inline element_t const &operator [](ptrdiff_t k) const | |||
| { | |||
| ASSERT(k >= 0); | |||
| ASSERT(k < m_array.m_size.z); | |||
| return m_array[ivec3(m_line, k)]; | |||
| } | |||
| private: | |||
| array3d<T...> const &m_array; | |||
| ivec2 m_line; | |||
| }; | |||
| inline class Line operator [](ptrdiff_t j) const | |||
| { | |||
| ASSERT(j >= 0); | |||
| ASSERT(j < m_array.m_size.y); | |||
| return Line(m_array, ivec2(m_slice, j)); | |||
| } | |||
| private: | |||
| array3d<T...> const &m_array; | |||
| ptrdiff_t m_slice; | |||
| }; | |||
| /* Access addressable slices, allowing for array[i][j][k] syntax. */ | |||
| inline class Slice operator [](ptrdiff_t i) | |||
| { | |||
| ASSERT(i >= 0); | |||
| ASSERT(i < m_size.x); | |||
| return Slice(*this, i); | |||
| } | |||
| inline class ConstSlice operator [](ptrdiff_t i) const | |||
| { | |||
| ASSERT(i >= 0); | |||
| ASSERT(i < m_size.x); | |||
| return ConstSlice(*this, i); | |||
| } | |||
| /* Resize the array. | |||
| * FIXME: data gets scrambled; should we care? */ | |||
| inline void SetSize(ivec3 size, element_t e = element_t()) | |||
| { | |||
| this->Resize(size.x * size.y * size.z, e); | |||
| m_size = size; | |||
| } | |||
| inline ivec3 GetSize() const | |||
| { | |||
| return m_size; | |||
| } | |||
| public: | |||
| inline element_t *Data() { return super::Data(); } | |||
| inline element_t const *Data() const { return super::Data(); } | |||
| inline ptrdiff_t Count() const { return super::Count(); } | |||
| inline ptrdiff_t Bytes() const { return super::Bytes(); } | |||
| private: | |||
| ivec3 m_size; | |||
| }; | |||
| } /* namespace lol */ | |||
| #endif // __LOL_MATH_ARRAY3D_H__ | |||
| @@ -43,15 +43,15 @@ public: | |||
| { | |||
| } | |||
| void FillSizes(ptrdiff_t * sizes) | |||
| void FillSizes(int * sizes) | |||
| { | |||
| *sizes = std::max(*sizes, (ptrdiff_t)(m_initializers.size())); | |||
| *sizes = std::max((ptrdiff_t)*sizes, (ptrdiff_t)(m_initializers.size())); | |||
| for (auto subinitializer : m_initializers) | |||
| subinitializer.FillSizes(sizes - 1); | |||
| } | |||
| void FillValues(T * origin, ptrdiff_t prev, ptrdiff_t * sizes) | |||
| void FillValues(T * origin, ptrdiff_t prev, int * sizes) | |||
| { | |||
| ptrdiff_t pos = 0; | |||
| @@ -75,12 +75,12 @@ public: | |||
| { | |||
| } | |||
| void FillSizes(ptrdiff_t * sizes) | |||
| void FillSizes(int * sizes) | |||
| { | |||
| *sizes = std::max(*sizes, (ptrdiff_t)(m_initializers.size())); | |||
| *sizes = std::max((ptrdiff_t)*sizes, (ptrdiff_t)(m_initializers.size())); | |||
| } | |||
| void FillValues(T * origin, ptrdiff_t prev, ptrdiff_t * sizes) | |||
| void FillValues(T * origin, ptrdiff_t prev, int * sizes) | |||
| { | |||
| UNUSED(sizes); | |||
| @@ -107,7 +107,7 @@ public: | |||
| { | |||
| } | |||
| inline arraynd(vec_t<ptrdiff_t, N> sizes, element_t e = element_t()) | |||
| inline arraynd(vec_t<int, N> sizes, element_t e = element_t()) | |||
| : m_sizes(sizes) | |||
| { | |||
| FixSizes(e); | |||
| @@ -137,7 +137,7 @@ public: | |||
| return super::operator[](n); | |||
| } | |||
| inline element_t & operator[](vec_t<ptrdiff_t, N> const &pos) | |||
| inline element_t & operator[](vec_t<int, N> const &pos) | |||
| { | |||
| return const_cast<element_t &>( | |||
| const_cast<arraynd<N, T...> const&>(*this)[pos]); | |||
| @@ -207,13 +207,13 @@ public: | |||
| /* Resize the array. | |||
| * FIXME: data gets scrambled; should we care? */ | |||
| inline void SetSize(vec_t<ptrdiff_t, N> sizes, element_t e = element_t()) | |||
| inline void SetSize(vec_t<int, N> sizes, element_t e = element_t()) | |||
| { | |||
| m_sizes = sizes; | |||
| FixSizes(e); | |||
| } | |||
| inline vec_t<ptrdiff_t, N> GetSize() const | |||
| inline vec_t<int, N> GetSize() const | |||
| { | |||
| return this->m_sizes; | |||
| } | |||
| @@ -235,9 +235,12 @@ private: | |||
| this->Resize(total_size, e); | |||
| } | |||
| vec_t<ptrdiff_t, N> m_sizes; | |||
| vec_t<int, N> m_sizes; | |||
| }; | |||
| template<typename... T> using array2d = arraynd<2, T...>; | |||
| template<typename... T> using array3d = arraynd<3, T...>; | |||
| } /* namespace lol */ | |||
| #endif // __LOL_MATH_ARRAYND_H__ | |||
| @@ -29,7 +29,7 @@ LOLUNIT_FIXTURE(ArrayNDTest) | |||
| LOLUNIT_TEST(Array2D) | |||
| { | |||
| arraynd<2, int> a; | |||
| a.SetSize(vec_t<ptrdiff_t, 2>(2, 2)); | |||
| a.SetSize(vec_t<int, 2>(2, 2)); | |||
| /* Non-const accessors */ | |||
| a[0][0] = 1; | |||
| @@ -98,7 +98,7 @@ LOLUNIT_FIXTURE(ArrayNDTest) | |||
| LOLUNIT_TEST(ArrayNDInit) | |||
| { | |||
| int const NDIM = 8; | |||
| vec_t<ptrdiff_t, NDIM> size; | |||
| vec_t<int, NDIM> size; | |||
| for (int i = 0; i < NDIM; ++i) | |||
| size[i] = 5; | |||