4.6.0
Freundlich's C++ toolkit
|
A simple n-dimensional array.
fcppt::container::grid::object is a simple multi-dimensional array similar to boost::multi_array. Let's first take a look at how to use a simple three dimensional grid of ints.
Grid uses fcppt::math::dim::object to specify its size and fcppt::math::vector::object to obtain an element.
There are three ways to initialize a grid:
Here is a small example:
To conveniently iterate over a grid, two ranges are provided:
Here is an example for pos ranges:
Pos ref ranges can be used to iterate over a grid's positions and elements simultaneously. Here is an example:
Additionally, you can iterate over sub ranges which are denoted by a pair of fcppt::container::grid::min and fcppt::container::grid::sup. Here, min
denotes the first element in the range while sup
is ''one past the end''. A range is empty if at least one element of min
is greater or equal to the corresponding element in sup
. It is often necessary to clamp positions to a valid range that doesn't exceed the size of a grid. There are three functions for this: fcppt::container::grid::clamped_min, fcppt::container::grid::clamped_sup and fcppt::container::grid::clamped_sup_signed. An unsigned min
doesn't need to be clamped. Here is an example:
Internally, the grid uses a std::vector
to linearly represent the grid. The iterators returned by the grid are iterators over that internal storage array, so they're not special in any way (other than begin random-access). This also means that iteration is...
...row-major for two-dimensional grids; this means that iteration begins at the top left with row 0, proceeds to the top right, then goes to the right of row 2 and so on.
Here is an example:
To resize a grid, we can use fcppt::container::grid::resize. Here's an example:
Classes | |
class | fcppt::container::grid::object< T, N, A > |
An n-dimensional array. More... | |
class | fcppt::container::grid::pos_iterator< SizeType, Dim > |
An iterator over grid position. More... | |
class | fcppt::container::grid::pos_range< SizeType, size_type > |
A range over grid position. More... | |
class | fcppt::container::grid::pos_ref_iterator< Grid > |
An iterator over grid references. More... | |
class | fcppt::container::grid::pos_ref_range< Grid > |
A range over grid references. More... | |
class | fcppt::container::grid::pos_reference< Grid > |
A reference to a grid cell and its position. More... | |
Typedefs | |
template<typename SizeType , fcppt::container::grid::size_type N> | |
using | fcppt::container::grid::dim = fcppt::math::dim::static_<SizeType, N> |
The type of a grid's size. | |
template<typename Grid > | |
using | fcppt::container::grid::dim_type = typename fcppt::container::grid::detail::dim_type<Grid>::type |
The dim type of a grid. | |
template<typename Type > | |
using | fcppt::container::grid::is_static_row = fcppt::array::is_object<Type> |
Checks if a type is an fcppt::container::grid::static_row. | |
template<typename Pos > | |
using | fcppt::container::grid::min_from_pos |
Creates the min from a pos type. | |
template<typename SizeType , fcppt::container::grid::size_type Size> | |
using | fcppt::container::grid::min |
The start type of a pos range. | |
template<typename Pos > | |
using | fcppt::container::grid::moore_neighbor_array |
The type return by fcppt::container::grid::moore_neighbors. | |
template<typename Pos > | |
using | fcppt::container::grid::neumann_neighbor_array = fcppt::array::object<Pos, 4> |
The type return by fcppt::container::grid::neumann_neighbors. | |
template<typename SizeType , fcppt::container::grid::size_type N> | |
using | fcppt::container::grid::pos = fcppt::math::vector::static_<SizeType, N> |
The type used to index a grid. | |
template<typename Grid > | |
using | fcppt::container::grid::pos_type = typename fcppt::container::grid::detail::pos_type<Grid>::type |
The pos type of a grid. | |
using | fcppt::container::grid::size_type = fcppt::math::size_type |
An unsigned type used to count grid dimensions. | |
template<typename T , fcppt::container::grid::size_type N> | |
using | fcppt::container::grid::static_row_type = fcppt::array::object<T, N> |
The type of a static row (an array). | |
template<typename Pos > | |
using | fcppt::container::grid::sup_from_pos |
Creates the sup from a pos type. | |
template<typename SizeType , fcppt::container::grid::size_type Size> | |
using | fcppt::container::grid::sup |
The one-past-the-end type of a pos range. | |
Functions | |
template<typename Function , fcppt::container::grid::object_concept Grid1, fcppt::container::grid::object_concept... Grids> | |
auto | fcppt::container::grid::apply (Function const &_function, Grid1 &&_grid1, Grids &&..._grids) -> fcppt::container::grid::object< decltype(_function(fcppt::move_if_rvalue< Grid1 >(_grid1.get_unsafe(std::declval< fcppt::container::grid::pos_type< std::remove_cvref_t< Grid1 > > >())), fcppt::move_if_rvalue< Grids >(_grids.get_unsafe(std::declval< fcppt::container::grid::pos_type< std::remove_cvref_t< Grid1 > > >()))...)), std::remove_cvref_t< Grid1 >::static_size::value > |
Applies a function to multiple grids of the same size. | |
template<typename Grid > | |
fcppt::optional::reference< fcppt::container::to_value_type< Grid > > | fcppt::container::grid::at_optional (Grid &_grid, fcppt::container::grid::pos_type< std::remove_cv_t< Grid > > const _pos) |
Returns a grid element as an optional. | |
template<typename Source , fcppt::container::grid::size_type Size> | |
fcppt::container::grid::min< std::make_unsigned_t< Source >, Size > | fcppt::container::grid::clamped_min (fcppt::container::grid::pos< Source, Size > const _pos) |
Clamps a signed position to min. | |
template<typename Source , fcppt::container::grid::size_type Size> | |
fcppt::container::grid::sup< Source, Size > | fcppt::container::grid::clamped_sup (fcppt::container::grid::pos< Source, Size > const _pos, fcppt::container::grid::dim< Source, Size > const _size) |
Clamps a position to a grid's size. | |
template<typename Dest , typename Source , fcppt::container::grid::size_type Size> | |
fcppt::container::grid::sup< Dest, Size > | fcppt::container::grid::clamped_sup_signed (fcppt::container::grid::pos< Source, Size > const _pos, fcppt::container::grid::dim< Dest, Size > const _size) |
Clamps a signed position to a grid's size. | |
template<typename T , fcppt::container::grid::size_type N, typename A > | |
bool | fcppt::container::grid::operator== (fcppt::container::grid::object< T, N, A > const &_a, fcppt::container::grid::object< T, N, A > const &_b) |
Compares two grids for equality. | |
template<typename T , fcppt::container::grid::size_type N, typename A > | |
bool | fcppt::container::grid::operator!= (fcppt::container::grid::object< T, N, A > const &_a, fcppt::container::grid::object< T, N, A > const &_b) |
!(a == b) | |
template<typename SizeType , fcppt::container::grid::size_type Size> | |
fcppt::container::grid::pos< SizeType, Size > | fcppt::container::grid::end_position (fcppt::container::grid::min< SizeType, Size > const _min, fcppt::container::grid::sup< SizeType, Size > const _sup) |
The end position of a range. | |
template<typename T , fcppt::container::grid::size_type N, typename A , typename Function > | |
void | fcppt::container::grid::fill (fcppt::container::grid::object< T, N, A > &_grid, Function const &_function) |
Fills a grid using a function. | |
template<typename T , fcppt::container::grid::size_type N, typename A > | |
bool | fcppt::container::grid::in_range (fcppt::container::grid::object< T, N, A > const &_grid, fcppt::container::grid::pos_type< fcppt::container::grid::object< T, N, A > > const &_pos) |
Checks if the given position _pos is out of bounds. | |
template<typename T , fcppt::container::grid::size_type N> | |
bool | fcppt::container::grid::in_range_dim (fcppt::container::grid::dim< T, N > const _dim, fcppt::container::grid::pos< T, N > const _pos) |
Checks if the given position _pos is out of bounds. | |
template<typename T , fcppt::container::grid::size_type N, typename A , typename F , typename Interpolator > | |
T | fcppt::container::grid::interpolate (fcppt::container::grid::object< T, N, A > const &_grid, fcppt::math::vector::static_< F, N > const &_floating_point_position, Interpolator const &_interpolator) |
Interpolates a value inside the grid cells. | |
template<typename SizeType , fcppt::container::grid::size_type N> | |
fcppt::container::grid::min_from_pos< fcppt::container::grid::pos< SizeType, N > > | fcppt::container::grid::make_min (fcppt::container::grid::pos< SizeType, N > const _pos) |
Creates min from a pos value. | |
template<typename SizeType , fcppt::container::grid::size_type Size> | |
fcppt::container::grid::pos_range< SizeType, Size > | fcppt::container::grid::make_pos_range (fcppt::container::grid::dim< SizeType, Size > const _size) |
A range over all positions. | |
template<typename SizeType , fcppt::container::grid::size_type Size> | |
fcppt::container::grid::pos_range< SizeType, Size > | fcppt::container::grid::make_pos_range_start_end (fcppt::container::grid::min< SizeType, Size > const _min, fcppt::container::grid::sup< SizeType, Size > const _sup) |
A sub range over positions. | |
template<typename Grid > | |
fcppt::container::grid::pos_ref_range< Grid const > | fcppt::container::grid::make_pos_ref_crange (Grid const &_grid) |
A const pos ref range over a grid. | |
template<typename Grid > | |
fcppt::container::grid::pos_ref_range< Grid const > | fcppt::container::grid::make_pos_ref_crange_start_end (Grid const &_grid, typename fcppt::container::grid::pos_ref_range< Grid const >::min_type const _min, typename fcppt::container::grid::pos_ref_range< Grid const >::sup_type const _sup) |
A const pos ref range over a sub-grid. | |
template<typename Grid > | |
fcppt::container::grid::pos_ref_range< Grid > | fcppt::container::grid::make_pos_ref_range (Grid &_grid) |
A pos ref range over a grid. | |
template<typename Grid > | |
fcppt::container::grid::pos_ref_range< Grid > | fcppt::container::grid::make_pos_ref_range_start_end (Grid &_grid, typename fcppt::container::grid::pos_ref_range< Grid >::min_type const _min, typename fcppt::container::grid::pos_ref_range< Grid >::sup_type const _sup) |
A pos ref range over a sub-grid. | |
template<typename SizeType , fcppt::container::grid::size_type N> | |
fcppt::container::grid::sup_from_pos< fcppt::container::grid::pos< SizeType, N > > | fcppt::container::grid::make_sup (fcppt::container::grid::pos< SizeType, N > const _pos) |
Creates sup from a pos value. | |
template<typename Source , typename Function > | |
auto | fcppt::container::grid::map (Source &&_source, Function const &_function) -> fcppt::container::grid::object< decltype(_function(fcppt::move_if_rvalue< Source >(_source.get_unsafe(std::declval< fcppt::container::grid::pos_type< std::remove_cvref_t< Source > > >())))), std::remove_cvref_t< Source >::static_size::value > |
Maps over grids. | |
template<typename SizeType , fcppt::container::grid::size_type Size> | |
bool | fcppt::container::grid::min_less_sup (fcppt::container::grid::min< SizeType, Size > const _min, fcppt::container::grid::sup< SizeType, Size > const _sup) |
Checks if min is strictly less than sup. | |
template<typename T , fcppt::container::grid::size_type N> | |
fcppt::container::grid::moore_neighbor_array< fcppt::container::grid::pos< T, N > > | fcppt::container::grid::moore_neighbors (fcppt::container::grid::pos< T, N > const _pos) |
Computes the Moore neighbors. | |
template<typename T , fcppt::container::grid::size_type N> | |
fcppt::container::grid::neumann_neighbor_array< fcppt::container::grid::pos< T, N > > | fcppt::container::grid::neumann_neighbors (fcppt::container::grid::pos< T, N > const _pos) |
Computes the von Neumann neighbors. | |
template<typename SizeType , fcppt::container::grid::size_type Size> | |
fcppt::container::grid::pos< SizeType, Size > | fcppt::container::grid::next_position (fcppt::container::grid::pos< SizeType, Size > const _current, fcppt::container::grid::min< SizeType, Size > const _min, fcppt::container::grid::sup< SizeType, Size > const _sup) |
Returns the next position in a grid range. | |
template<typename SizeType , fcppt::container::grid::size_type Size> | |
SizeType | fcppt::container::grid::offset (fcppt::container::grid::pos< SizeType, Size > const &_pos, fcppt::container::grid::dim< SizeType, Size > const &_size) |
Returns the absolute offset of a position. | |
template<typename Ch , typename Traits , typename T , fcppt::container::grid::size_type N, typename A > | |
std::basic_ostream< Ch, Traits > & | fcppt::container::grid::operator<< (std::basic_ostream< Ch, Traits > &_stream, fcppt::container::grid::object< T, N, A > const &_object) |
Outputs a grid. | |
template<typename SizeType , fcppt::container::grid::size_type Size> | |
fcppt::container::grid::dim< SizeType, Size > | fcppt::container::grid::range_dim (fcppt::container::grid::min< SizeType, Size > const _min, fcppt::container::grid::sup< SizeType, Size > const _sup) |
The dimension of a grid range. | |
template<typename SizeType , fcppt::container::grid::size_type Size> | |
SizeType | fcppt::container::grid::range_size (fcppt::container::grid::min< SizeType, Size > const _min, fcppt::container::grid::sup< SizeType, Size > const _sup) |
The number of elements in a grid range. | |
template<typename Grid , typename Function > | |
std::remove_cvref_t< Grid > | fcppt::container::grid::resize (Grid &&_grid, fcppt::container::grid::dim_type< std::remove_cvref_t< Grid > > const &_new_size, Function const &_init) |
Returns a resized grid with potentially new elements. | |
template<typename Arg1 , typename... Args> requires ( std::conjunction_v<std::is_same<std::remove_cvref_t<Args>, std::remove_cvref_t<Arg1>>...>) | |
fcppt::container::grid::static_row_type< std::remove_cvref_t< Arg1 >, fcppt::cast::size< fcppt::container::grid::size_type >(sizeof...(Args)+1U)> | fcppt::container::grid::static_row (Arg1 &&_arg1, Args &&..._args) |
Creates an fcppt::container::grid::static_row_type. | |
using fcppt::container::grid::dim = fcppt::math::dim::static_<SizeType, N> |
The type of a grid's size.
using fcppt::container::grid::dim_type = typename fcppt::container::grid::detail::dim_type<Grid>::type |
The dim type of a grid.
Grid | Must be an fcppt::container::grid::object. |
using fcppt::container::grid::is_static_row = fcppt::array::is_object<Type> |
Checks if a type is an fcppt::container::grid::static_row.
using fcppt::container::grid::min |
The start type of a pos range.
using fcppt::container::grid::min_from_pos |
Creates the min from a pos type.
using fcppt::container::grid::moore_neighbor_array |
The type return by fcppt::container::grid::moore_neighbors.
Pos | Must be an fcppt::container::grid::pos |
using fcppt::container::grid::neumann_neighbor_array = fcppt::array::object<Pos, 4> |
The type return by fcppt::container::grid::neumann_neighbors.
Pos | Must be an fcppt::container::grid::pos |
using fcppt::container::grid::pos = fcppt::math::vector::static_<SizeType, N> |
The type used to index a grid.
using fcppt::container::grid::pos_type = typename fcppt::container::grid::detail::pos_type<Grid>::type |
The pos type of a grid.
Grid | Must be an fcppt::container::grid::object. |
An unsigned type used to count grid dimensions.
using fcppt::container::grid::static_row_type = fcppt::array::object<T, N> |
The type of a static row (an array).
using fcppt::container::grid::sup |
The one-past-the-end type of a pos range.
using fcppt::container::grid::sup_from_pos |
Creates the sup from a pos type.
auto fcppt::container::grid::apply | ( | Function const & | _function, |
Grid1 && | _grid1, | ||
Grids &&... | _grids ) -> fcppt::container::grid::object< decltype(_function( fcppt::move_if_rvalue<Grid1>(_grid1.get_unsafe( std::declval<fcppt::container::grid::pos_type<std::remove_cvref_t<Grid1>>>())), fcppt::move_if_rvalue<Grids>(_grids.get_unsafe( std::declval<fcppt::container::grid::pos_type<std::remove_cvref_t<Grid1>>>()))...)), std::remove_cvref_t<Grid1>::static_size::value> |
Applies a function to multiple grids of the same size.
For grids g_1 = _grid1
and g_2, ..., g_n = _grids
, if g_1,...,g_n are all of the same size s
, the result r
is a grid of size s
such that for every position p < s
, r[p] = _function(g_1[p],...,g_n[p])
. If g_1,...g_n are not of the same size, the result is an empty grid.
fcppt::optional::reference< fcppt::container::to_value_type< Grid > > fcppt::container::grid::at_optional | ( | Grid & | _grid, |
fcppt::container::grid::pos_type< std::remove_cv_t< Grid > > const | _pos ) |
Returns a grid element as an optional.
If _pos is in the range of _grid, the element at _pos is returned. Otherwise, the result is an empty optional.
fcppt::container::grid::min< std::make_unsigned_t< Source >, Size > fcppt::container::grid::clamped_min | ( | fcppt::container::grid::pos< Source, Size > const | _pos | ) |
Clamps a signed position to min.
fcppt::container::grid::sup< Source, Size > fcppt::container::grid::clamped_sup | ( | fcppt::container::grid::pos< Source, Size > const | _pos, |
fcppt::container::grid::dim< Source, Size > const | _size ) |
Clamps a position to a grid's size.
fcppt::container::grid::sup< Dest, Size > fcppt::container::grid::clamped_sup_signed | ( | fcppt::container::grid::pos< Source, Size > const | _pos, |
fcppt::container::grid::dim< Dest, Size > const | _size ) |
Clamps a signed position to a grid's size.
fcppt::container::grid::pos< SizeType, Size > fcppt::container::grid::end_position | ( | fcppt::container::grid::min< SizeType, Size > const | _min, |
fcppt::container::grid::sup< SizeType, Size > const | _sup ) |
The end position of a range.
Returns the end position of a grid range that is formed by _min and _sup. This position is usually further than one past the last element.
void fcppt::container::grid::fill | ( | fcppt::container::grid::object< T, N, A > & | _grid, |
Function const & | _function ) |
Fills a grid using a function.
Function | A function callable as T (dim<size_type, N>) . |
|
inline |
Checks if the given position _pos
is out of bounds.
true
if is not out of bounds, false
otherwise.
|
inline |
Checks if the given position _pos
is out of bounds.
true
if is not out of bounds, false
otherwise. T fcppt::container::grid::interpolate | ( | fcppt::container::grid::object< T, N, A > const & | _grid, |
fcppt::math::vector::static_< F, N > const & | _floating_point_position, | ||
Interpolator const & | _interpolator ) |
Interpolates a value inside the grid cells.
With fcppt::container::grid::object grid::object alone, you can only access values at discrete points (since the fcppt::container::grid::object::dim object::dim type used to specify positions has an integral value_type
).
Sometimes, however, you want to take a value in between the grid nodes. Think about a magnifying filter for textures, or drawing a line from one plot point to the next (in a one-dimensional grid). This is called interpolation, and it works in all dimensions.
To interpolate, you specify the _grid
, the _floating_point_position
and an _interpolator
. The latter will determine what kind of interpolation is used (linear, trigonometric, ...). You can choose one of the functions in fcppt::math::interpolation or you can write your own interpolator function.
Here's an example:
F | The floating point type used for calculations. |
Interpolator | A function callable as T (F, T, T) . |
|
inline |
Creates min from a pos value.
|
inline |
A range over all positions.
Creates a range of positions from "all zeroes" to, but not including, _size.
|
inline |
A sub range over positions.
Creates a range of positions from _min to, but not including, _sup.
|
inline |
A const pos ref range over a grid.
|
inline |
A const pos ref range over a sub-grid.
Creates a const pos ref range from _min to, but not including, _sup.
|
inline |
A pos ref range over a grid.
|
inline |
A pos ref range over a sub-grid.
Creates a pos ref range from _min to, but not including, _sup.
|
inline |
Creates sup from a pos value.
auto fcppt::container::grid::map | ( | Source && | _source, |
Function const & | _function ) -> fcppt::container::grid::object< decltype(_function(fcppt::move_if_rvalue<Source>(_source.get_unsafe( std::declval< fcppt::container::grid::pos_type<std::remove_cvref_t<Source>>>())))), std::remove_cvref_t<Source>::static_size::value> |
Maps over grids.
For every element x
at position p
in _source, the result of _function(x)
is inserted at p
into the result.
Function | A function callable as R (Source::value_type) where R is the result type |
bool fcppt::container::grid::min_less_sup | ( | fcppt::container::grid::min< SizeType, Size > const | _min, |
fcppt::container::grid::sup< SizeType, Size > const | _sup ) |
Checks if min is strictly less than sup.
Checks if _min is strictly less than _sup. If this is false, the range denoted by _min and _sup is empty.
fcppt::container::grid::moore_neighbor_array< fcppt::container::grid::pos< T, N > > fcppt::container::grid::moore_neighbors | ( | fcppt::container::grid::pos< T, N > const | _pos | ) |
Computes the Moore neighbors.
Computes the Moore neighbors of _pos. No range checking is performed.
_pos | The position to compute the neighbors of |
fcppt::container::grid::neumann_neighbor_array< fcppt::container::grid::pos< T, N > > fcppt::container::grid::neumann_neighbors | ( | fcppt::container::grid::pos< T, N > const | _pos | ) |
Computes the von Neumann neighbors.
Computes the von Neumann neighbors of _pos. No range checking is performed.
_pos | The position to compute the neighbors of |
fcppt::container::grid::pos< SizeType, Size > fcppt::container::grid::next_position | ( | fcppt::container::grid::pos< SizeType, Size > const | _current, |
fcppt::container::grid::min< SizeType, Size > const | _min, | ||
fcppt::container::grid::sup< SizeType, Size > const | _sup ) |
Returns the next position in a grid range.
Given a range by _min and _sup, returns the next position after _current.
SizeType fcppt::container::grid::offset | ( | fcppt::container::grid::pos< SizeType, Size > const & | _pos, |
fcppt::container::grid::dim< SizeType, Size > const & | _size ) |
Returns the absolute offset of a position.
|
inline |
!(a == b)
std::basic_ostream< Ch, Traits > & fcppt::container::grid::operator<< | ( | std::basic_ostream< Ch, Traits > & | _stream, |
fcppt::container::grid::object< T, N, A > const & | _object ) |
Outputs a grid.
Outputs the grid _object to _stream. Every level of the grid will be wrapped in parenthesis. So, for example, a two dimensional grid of size (n,m)
will be written as ((x_0, y_0), (x_1, y_0), ..., (x_0, y_1), ..., (x_n, y_m))
.
T | Must be a type that has an appropriate operator<< |
_stream | The stream to write to |
_object | The grid to write |
bool fcppt::container::grid::operator== | ( | fcppt::container::grid::object< T, N, A > const & | _a, |
fcppt::container::grid::object< T, N, A > const & | _b ) |
Compares two grids for equality.
fcppt::container::grid::dim< SizeType, Size > fcppt::container::grid::range_dim | ( | fcppt::container::grid::min< SizeType, Size > const | _min, |
fcppt::container::grid::sup< SizeType, Size > const | _sup ) |
The dimension of a grid range.
The dimension of the range given by _min and _sup.
|
inline |
The number of elements in a grid range.
The number of elements in the range given by _min and _sup.
std::remove_cvref_t< Grid > fcppt::container::grid::resize | ( | Grid && | _grid, |
fcppt::container::grid::dim_type< std::remove_cvref_t< Grid > > const & | _new_size, | ||
Function const & | _init ) |
Returns a resized grid with potentially new elements.
Returns a grid g
of size _new_size, such that for every position p
in g
we have that:
g[p] = _grid[p]
if p
is also a position in _grid, or g[p] = _init(p)
otherwise. Grid | Must be a grid. |
Function | A function callable as Grid::value_type (Grid::pos) . |
fcppt::container::grid::static_row_type< std::remove_cvref_t< Arg1 >, fcppt::cast::size< fcppt::container::grid::size_type >(sizeof...(Args)+1U)> fcppt::container::grid::static_row | ( | Arg1 && | _arg1, |
Args &&... | _args ) |
Creates an fcppt::container::grid::static_row_type.