25 #include <type_traits>    32 #include "Portability.h"    37 #ifndef DOXYGEN_SHOULD_SKIP_THIS    62   template<
typename T, 
typename I = 
unsigned>
    83     , m_data(size.width * size.height)
    96     , m_data(size.width * size.height, value)
   127       std::swap(m_data, other.m_data);
   128       std::swap(m_size, other.m_size);
   145       return m_data.data();
   154       return m_data.size();
   193       return m_data.empty();
   204       return pos.col < m_size.col && pos.row < m_size.row && (std::is_unsigned<I>::value || (0 <= pos.col && 0 <= pos.row));
   230       return m_data[index];
   249       return m_data[index];
   259       return { pos % m_size.col, pos / m_size.col };
   290     template<
typename Func>
   292       visitNeighborsDiamond(pos, func, 1);
   316     template<
typename Func>
   318       visitNeighborsDiamond(pos, func, 1);
   342     template<
typename Func>
   344       visitNeighborsDiamond(pos, func, 2);
   368     template<
typename Func>
   370       visitNeighborsDiamond(pos, func, 2);
   394     template<
typename Func>
   396       visitNeighborsSquare(pos, func, 1);
   422     template<
typename Func>
   424       visitNeighborsSquare(pos, func, 1);
   448     template<
typename Func>
   450       visitNeighborsSquare(pos, func, 2);
   474     template<
typename Func>
   476       visitNeighborsSquare(pos, func, 2);
   493       return m_data.data();
   502     const T *
end() const noexcept {
   503       return m_data.data() + m_data.size();
   513       return m_data.data();
   523       return m_data.data() + m_data.size();
   532       return { 0, m_size.col * m_size.row };
   541       return { 0, m_size.row };
   550       return { 0, m_size.col };
   559       return { getColRange(), getRowRange() };
   566       return m_data[pos.row * m_size.col + pos.col];
   570       return m_data[pos.row * m_size.col + pos.col];
   573     template<
typename Func>
   574     void visitNeighborsSquare(
Vector<I, 2> pos, Func func, 
I n)
 const {
   575       assert(isValid(pos));
   577       auto colMin = pos.col - std::min(pos.col, n);
   578       auto colMax = pos.col + std::min(m_size.col - pos.col - 1, n);
   579       auto rowMin = pos.row - std::min(pos.row, n);
   580       auto rowMax = pos.row + std::min(m_size.row - pos.row - 1, n);
   582       for (
auto row = rowMin; row <= rowMax; ++row) {
   583         for (
auto col = colMin; col <= colMax; ++col) {
   584           if (col == pos.col && row == pos.row) { 
   588           func({ col, row }, 
get({ col, row }));
   593     template<
typename Func>
   594     void visitNeighborsSquare(
Vector<I, 2> pos, Func func, 
I n) {
   595       assert(isValid(pos));
   597       auto colMin = pos.col - std::min(pos.col, n);
   598       auto colMax = pos.col + std::min(m_size.col - pos.col - 1, n);
   599       auto rowMin = pos.row - std::min(pos.row, n);
   600       auto rowMax = pos.row + std::min(m_size.row - pos.row - 1, n);
   602       for (
auto row = rowMin; row <= rowMax; ++row) {
   603         for (
auto col = colMin; col <= colMax; ++col) {
   604           if (col == pos.col && row == pos.row) { 
   608           func({ col, row }, 
get({ col, row }));
   614     template<
typename Func>
   615     void visitNeighborsDiamond(
Vector<I, 2> pos, Func func, 
I n)
 const {
   616       assert(isValid(pos));
   618       auto colMin = pos.col - std::min(pos.col, n);
   619       auto colMax = pos.col + std::min(m_size.col - pos.col - 1, n);
   620       auto rowMin = pos.row - std::min(pos.row, n);
   621       auto rowMax = pos.row + std::min(m_size.row - pos.row - 1, n);
   623       for (
auto row = rowMin; row <= rowMax; ++row) {
   624         for (
auto col = colMin; col <= colMax; ++col) {
   625           if (col == pos.col && row == pos.row) { 
   633           func({ col, row }, 
get({ col, row }));
   638     template<
typename Func>
   639     void visitNeighborsDiamond(
Vector<I, 2> pos, Func func, 
I n) {
   640       assert(isValid(pos));
   642       auto colMin = pos.col - std::min(pos.col, n);
   643       auto colMax = pos.col + std::min(m_size.col - pos.col - 1, n);
   644       auto rowMin = pos.row - std::min(pos.row, n);
   645       auto rowMax = pos.row + std::min(m_size.row - pos.row - 1, n);
   647       for (
auto row = rowMin; row <= rowMax; ++row) {
   648         for (
auto col = colMin; col <= colMax; ++col) {
   649           if (col == pos.col && row == pos.row) { 
   657           func({ col, row }, 
get({ col, row }));
   664     std::vector<T> m_data;
   667 #ifndef DOXYGEN_SHOULD_SKIP_THIS A two-dimensional array. 
Definition: Array2D.h:63
 
A half-open range of values. 
Definition: Range.h:42
 
T * end() noexcept
Get an iterator to the element following the last element of the array. 
Definition: Array2D.h:522
 
const T * begin() const noexcept
Get an iterator to the first element of the array. 
Definition: Array2D.h:492
 
const T * getDataPtr() const noexcept
Get the pointer to raw data. 
Definition: Array2D.h:144
 
std::size_t getDataSize() const noexcept
Get the raw data size. 
Definition: Array2D.h:153
 
void swap(Array2D &other)
Swap with another array. 
Definition: Array2D.h:126
 
constexpr T absdiff(T lhs, T rhs)
Absolute difference of two values. 
Definition: Math.h:313
 
void visit4Neighbors(Vector< I, 2 > pos, Func func) const
Visit the 4 neighbors of a given position. 
Definition: Array2D.h:317
 
constexpr Range< I > getRowRange() const noexcept
Get the row range. 
Definition: Array2D.h:540
 
constexpr PositionRange< I > getPositionRange() const noexcept
Get the position range. 
Definition: Array2D.h:558
 
void visit12Neighbors(Vector< I, 2 > pos, Func func) const
Visit the 12 neighbors of a given position. 
Definition: Array2D.h:369
 
constexpr I getCols() const noexcept
Get the number of columns. 
Definition: Array2D.h:171
 
constexpr Vector< I, 2 > toPosition(std::size_t pos) const noexcept
Transform a 1D position into a 2D position. 
Definition: Array2D.h:258
 
void visit24Neighbors(Vector< I, 2 > pos, Func func) const
Visit the 24 neighbors of a given position. 
Definition: Array2D.h:475
 
void visit8Neighbors(Vector< I, 2 > pos, Func func) const
Visit the 8 neighbors of a given position. 
Definition: Array2D.h:423
 
The namespace for gf classes. 
Definition: Action.h:34
 
Array2D()
Default constructor. 
Definition: Array2D.h:70
 
Array2D(Vector< I, 2 > size)
Constructor with a size. 
Definition: Array2D.h:81
 
constexpr bool isValid(Vector< I, 2 > pos) const noexcept
Check if a position is valid. 
Definition: Array2D.h:203
 
void visit24Neighbors(Vector< I, 2 > pos, Func func)
Visit the 24 neighbors of a given position. 
Definition: Array2D.h:449
 
T & operator()(Vector< I, 2 > pos)
Get the element at a given 2D position. 
Definition: Array2D.h:219
 
const T & operator()(std::size_t index) const
Get the element at a given 1D index. 
Definition: Array2D.h:248
 
constexpr bool isEmpty() const noexcept
Check if the array is empty. 
Definition: Array2D.h:192
 
constexpr I getRows() const noexcept
Get the number of rows. 
Definition: Array2D.h:180
 
constexpr Vector< I, 2 > getSize() const noexcept
Get the size of the array. 
Definition: Array2D.h:162
 
A 2D range. 
Definition: Range.h:225
 
constexpr Range< I > getColRange() const noexcept
Get the column range. 
Definition: Array2D.h:549
 
T * begin() noexcept
Get an iterator to the first element of the array. 
Definition: Array2D.h:512
 
Array2D(Vector< I, 2 > size, const T &value)
Constructor with a size and a value. 
Definition: Array2D.h:94
 
constexpr RangeZ getIndexRange() const noexcept
Get the 1D index range of the array. 
Definition: Array2D.h:531
 
T & operator()(std::size_t index)
Get the element at a given 1D index. 
Definition: Array2D.h:229
 
const T & operator()(Vector< I, 2 > pos) const
Get the element at a given 2D position. 
Definition: Array2D.h:238
 
void visit12Neighbors(Vector< I, 2 > pos, Func func)
Visit the 12 neighbors of a given position. 
Definition: Array2D.h:343
 
void visit8Neighbors(Vector< I, 2 > pos, Func func)
Visit the 8 neighbors of a given position. 
Definition: Array2D.h:395
 
void visit4Neighbors(Vector< I, 2 > pos, Func func)
Visit the 4 neighbors of a given position. 
Definition: Array2D.h:291
 
const T * end() const noexcept
Get an iterator to the element following the last element of the array. 
Definition: Array2D.h:502