20template <
typename fsTCell>
29 pPos.
x >= mOrigin.x - hs.x
31 && pPos.
y >= mOrigin.y - hs.y
53 return (mCellDimensions + mCellBorder) / 2;
68 typename std::vector<fsTCell>::iterator
begin() {
return mCells.begin(); }
69 typename std::vector<fsTCell>::iterator
end() {
return mCells.end(); }
70 typename std::vector<fsTCell>::reverse_iterator
rbegin() {
return mCells.rbegin(); }
71 typename std::vector<fsTCell>::reverse_iterator
rend() {
return mCells.rend(); }
73 void drop(std::function<
void(fsTCell, fsTCell)> pAction);
75 void swap(fsTCell pLHS, fsTCell pRHS);
77 typename std::vector<fsTCell>::iterator
78 findIf(
typename std::vector<fsTCell>::iterator pBegin,
typename std::vector<fsTCell>::iterator pEnd,
79 std::function<
fsBool(fsTCell)> pPredicate);
81 template <
typename FwdIt>
83 std::function<
void(fsTCell)> pCellAction, std::function<
void()> pRowAction);
84 template <
typename FwdIt>
86 std::function<
void(fsTCell)> pCellAction, std::function<
void()> pColumnAction);
87 template <
typename FwdIt>
89 std::function<
void(fsTCell)> pCellAction, std::function<
void()> pDiagonalAction);
90 template <
typename FwdIt>
92 std::function<
void(fsTCell)> pCellAction, std::function<
void()> pDiagonalAction);
96 std::function<
void(fsTCell&)> pCellOperation);
98 void forEach(
typename std::vector<fsTCell>::iterator pBegin,
typename std::vector<fsTCell>::iterator pEnd,
99 std::function<
void(fsTCell&)> pCellOperation);
113 std::vector<fsTCell> mCells;
123template <
typename fsTCell>
126 return mCells[pColumn + pRow * mDimensions.x];
129template <
typename fsTCell>
133 mDimensions = pDimensions;
135 mCellDimensions = pCellDimensions;
136 mCellBorder = pCellBorder;
137 mCells.resize(mDimensions.x * mDimensions.y);
141template <
typename fsTCell>
142typename std::vector<fsTCell>::iterator
144 std::function<
fsBool(fsTCell)> pPredicate)
146 return std::find_if(pBegin, pEnd, pPredicate);
149template <
typename fsTCell>
151 std::function<
void(fsTCell&)> pCellOperation)
153 if(pEnd.
y >= pBegin.
y)
155 if(pEnd.
x >= pBegin.
x)
157 for (
fsS32 j = pBegin.
y; j <= pEnd.
y; ++j)
159 for (
fsS32 i = pBegin.
x; i <= pEnd.
x; ++i)
167 for (
fsS32 j = pBegin.
y; j <= pEnd.
y; ++j)
169 for (
fsS32 i = pBegin.
x; i >= pEnd.
x; --i)
179 if(pEnd.
x >= pBegin.
x)
181 for (
fsS32 j = pBegin.
y; j >= pEnd.
y; --j)
183 for (
fsS32 i = pBegin.
x; i <= pEnd.
x; ++i)
191 for (
fsS32 j = pBegin.
y; j >= pEnd.
y; --j)
193 for (
fsS32 i = pBegin.
x; i >= pEnd.
x; --i)
203template <
typename fsTCell>
205 typename std::vector<fsTCell>::iterator pEnd,
206 std::function<
void(fsTCell&)> pCellOperation)
208 std::for_each(pBegin, pEnd, pCellOperation);
211template <
typename fsTCell>
215 std::generate(mCells.begin(), mCells.end(),
218 const fsS32 col = i % mDimensions.x;
219 const fsS32 row = i++ / mDimensions.x;
220 return pCellCreate(col, row);
224template <
typename fsTCell>
227 std::iter_swap(std::find(mCells.begin(), mCells.end(), pLHS),
228 std::find(mCells.begin(), mCells.end(), pRHS));
231template <
typename fsTCell>
232template <
typename FwdIt>
234 std::function<
void(fsTCell)> pCellAction, std::function<
void()> pRowAction)
236 FwdIt rowStart = pBegin;
237 FwdIt rowEnd = pBegin;
238 std::advance(rowEnd, mDimensions.x);
240 while (rowEnd != pEnd)
242 std::for_each(rowStart, rowEnd, pCellAction);
243 std::advance(rowStart, mDimensions.x);
244 std::advance(rowEnd, mDimensions.x);
247 std::for_each(rowStart, rowEnd, pCellAction);
252template <
typename fsTCell>
253template <
typename FwdIt>
255 std::function<
void(fsTCell)> pCellAction, std::function<
void()> pColumnAction)
257 FwdIt columnStart = pBegin;
258 FwdIt columnEnd = pEnd;
259 std::advance(columnEnd, -mDimensions.x);
261 while (columnEnd != pEnd)
263 FwdIt it = columnStart;
264 while (it != columnEnd)
277template <
typename fsTCell>
278template <
typename FwdIt>
280 std::function<
void(fsTCell)> pCellAction,
281 std::function<
void()> pDiagonalAction)
283 FwdIt columnStart = pBegin;
284 FwdIt columnEnd = pEnd;
287 while (columnStart != columnEnd)
289 FwdIt it = columnStart;
290 while (it != columnEnd)
293 it += mDimensions.x + 1;
299 columnEnd -= mDimensions.x;
302 columnStart = pBegin;
306 columnStart += mDimensions.x;
309 while (columnStart != columnEnd)
311 FwdIt it = columnStart;
312 while (it != columnEnd)
315 it += mDimensions.x + 1;
320 columnStart += mDimensions.x;
325template <
typename fsTCell>
326template <
typename FwdIt>
328 std::function<
void(fsTCell)> pCellAction,
329 std::function<
void()> pDiagonalAction)
331 FwdIt columnStart = pEnd;
332 FwdIt columnEnd = pBegin;
334 std::advance(columnStart, -mDimensions.x);
335 std::advance(columnEnd, mDimensions.x - 1);
337 while (columnStart != columnEnd)
339 FwdIt it = columnStart;
340 while (it != columnEnd)
343 it -= mDimensions.x - 1;
349 columnStart -= mDimensions.x;
355 std::advance(columnStart, -mDimensions.x);
356 std::advance(columnEnd, mDimensions.x - 1);
358 while (columnStart != columnEnd)
360 FwdIt it = columnStart;
361 while (it != columnEnd)
364 it -= mDimensions.x - 1;
370 columnEnd += mDimensions.x;
374template <
typename fsTCell>
376 std::function<
void(fsTCell, fsTCell)> pAction)
378 typename std::vector<fsTCell>::iterator it = mCells.begin();
379 typename std::vector<fsTCell>::iterator itBelow = mCells.begin();
380 std::advance(itBelow, mDimensions.x);
382 typename std::vector<fsTCell>::iterator limit = mCells.begin();
383 std::advance(limit, std::distance(mCells.begin(), mCells.end()) - mDimensions.x);
387 pAction(*it, *itBelow);
fsS32 columnsGet() const
Definition fsGrid.h:60
void forEachDescendingDiagonal(FwdIt pBegin, FwdIt pEnd, std::function< void(fsTCell)> pCellAction, std::function< void()> pDiagonalAction)
Definition fsGrid.h:279
void generate(std::function< fsTCell const(fsS32, fsS32)> pCellCreate)
Definition fsGrid.h:212
void forEachColumn(FwdIt pBegin, FwdIt pEnd, std::function< void(fsTCell)> pCellAction, std::function< void()> pColumnAction)
Definition fsGrid.h:254
void drop(std::function< void(fsTCell, fsTCell)> pAction)
Definition fsGrid.h:375
std::vector< fsTCell >::reverse_iterator rbegin()
Definition fsGrid.h:70
fsS32 rowStrideGet() const
Definition fsGrid.h:63
std::vector< fsTCell >::reverse_iterator rend()
Definition fsGrid.h:71
void forEachRow(FwdIt pBegin, FwdIt pEnd, std::function< void(fsTCell)> pCellAction, std::function< void()> pRowAction)
Definition fsGrid.h:233
fsPoint gridLocation(fsPoint const &pPos) const
Definition fsGrid.h:43
fsS32 columnStrideGet() const
Definition fsGrid.h:64
std::vector< fsTCell >::iterator findIf(typename std::vector< fsTCell >::iterator pBegin, typename std::vector< fsTCell >::iterator pEnd, std::function< fsBool(fsTCell)> pPredicate)
Definition fsGrid.h:143
fsPoint halfCell() const
Definition fsGrid.h:51
void forEachAscendingDiagonal(FwdIt pBegin, FwdIt pEnd, std::function< void(fsTCell)> pCellAction, std::function< void()> pDiagonalAction)
Definition fsGrid.h:327
std::vector< fsTCell >::iterator begin()
Definition fsGrid.h:68
fsPoint worlddLocation(fsPoint const &pGridPos) const
Definition fsGrid.h:35
fsS32 rowsGet() const
Definition fsGrid.h:61
void init(fsPoint const &pOrigin, fsPoint const &pDimensions, fsPoint const &pCellDimensions, fsPoint const &pCellBorder)
Definition fsGrid.h:130
fsPoint const & originGet() const
Definition fsGrid.h:66
fsTCell & getCell(fsS32 pColumn, fsS32 pRow)
Definition fsGrid.h:124
std::vector< fsTCell >::iterator end()
Definition fsGrid.h:69
void forEach(fsPoint const &pBegin, fsPoint const &pEnd, std::function< void(fsTCell &)> pCellOperation)
Definition fsGrid.h:150
void swap(fsTCell pLHS, fsTCell pRHS)
Definition fsGrid.h:225
fsBool onGrid(fsPoint const &pPos) const
Definition fsGrid.h:25
fsPoint const & cellDimensionsGet() const
Definition fsGrid.h:57
fsPoint cellBorderedDimensionsGet() const
Definition fsGrid.h:58
bool fsBool
Definition fsBaseTypes.h:26
int fsS32
Definition fsBaseTypes.h:20
fsS32 x
Definition fsPoint.h:39
fsS32 y
Definition fsPoint.h:40