@@ -20,8 +20,6 @@ | |||||
#include <lol/math/matrix.h> | #include <lol/math/matrix.h> | ||||
#include <lol/math/transform.h> | #include <lol/math/transform.h> | ||||
#include <lol/math/arraynd.h> | #include <lol/math/arraynd.h> | ||||
#include <lol/math/array2d.h> | |||||
#include <lol/math/array3d.h> | |||||
#include <lol/math/geometry.h> | #include <lol/math/geometry.h> | ||||
#include <lol/math/interp.h> | #include <lol/math/interp.h> | ||||
#include <lol/math/rand.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) | for (auto subinitializer : m_initializers) | ||||
subinitializer.FillSizes(sizes - 1); | 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; | 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); | 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) | : m_sizes(sizes) | ||||
{ | { | ||||
FixSizes(e); | FixSizes(e); | ||||
@@ -137,7 +137,7 @@ public: | |||||
return super::operator[](n); | 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 &>( | return const_cast<element_t &>( | ||||
const_cast<arraynd<N, T...> const&>(*this)[pos]); | const_cast<arraynd<N, T...> const&>(*this)[pos]); | ||||
@@ -207,13 +207,13 @@ public: | |||||
/* Resize the array. | /* Resize the array. | ||||
* FIXME: data gets scrambled; should we care? */ | * 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; | m_sizes = sizes; | ||||
FixSizes(e); | FixSizes(e); | ||||
} | } | ||||
inline vec_t<ptrdiff_t, N> GetSize() const | |||||
inline vec_t<int, N> GetSize() const | |||||
{ | { | ||||
return this->m_sizes; | return this->m_sizes; | ||||
} | } | ||||
@@ -235,9 +235,12 @@ private: | |||||
this->Resize(total_size, e); | 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 */ | } /* namespace lol */ | ||||
#endif // __LOL_MATH_ARRAYND_H__ | #endif // __LOL_MATH_ARRAYND_H__ | ||||
@@ -29,7 +29,7 @@ LOLUNIT_FIXTURE(ArrayNDTest) | |||||
LOLUNIT_TEST(Array2D) | LOLUNIT_TEST(Array2D) | ||||
{ | { | ||||
arraynd<2, int> a; | arraynd<2, int> a; | ||||
a.SetSize(vec_t<ptrdiff_t, 2>(2, 2)); | |||||
a.SetSize(vec_t<int, 2>(2, 2)); | |||||
/* Non-const accessors */ | /* Non-const accessors */ | ||||
a[0][0] = 1; | a[0][0] = 1; | ||||
@@ -98,7 +98,7 @@ LOLUNIT_FIXTURE(ArrayNDTest) | |||||
LOLUNIT_TEST(ArrayNDInit) | LOLUNIT_TEST(ArrayNDInit) | ||||
{ | { | ||||
int const NDIM = 8; | int const NDIM = 8; | ||||
vec_t<ptrdiff_t, NDIM> size; | |||||
vec_t<int, NDIM> size; | |||||
for (int i = 0; i < NDIM; ++i) | for (int i = 0; i < NDIM; ++i) | ||||
size[i] = 5; | size[i] = 5; | ||||