25#include "ElementsKernel/Exception.h"
31template <
typename GridCellManager,
typename... AxesTypes>
38template <
typename GridCellManager,
typename... AxesTypes>
46template <
typename GridCellManager,
typename... AxesTypes>
47template <
typename... Args>
56template <
typename... AxesTypes>
64template <
typename GridCellManager,
typename... AxesTypes>
70template <
typename GridCellManager,
typename... AxesTypes>
72 size_t axis,
size_t index)
79 throw Elements::Exception() <<
"Axis " << axis <<
" is already fixed";
84template <
typename GridCellManager,
typename... AxesTypes>
91template <
typename GridCellManager,
typename... AxesTypes>
94 return std::get<I>(
m_axes);
97template <
typename GridCellManager,
typename... AxesTypes>
102template <
typename GridCellManager,
typename... AxesTypes>
108template <
typename GridCellManager,
typename... AxesTypes>
113template <
typename GridCellManager,
typename... AxesTypes>
120template <
typename GridCellManager,
typename... AxesTypes>
127template <
typename GridCellManager,
typename... AxesTypes>
134template <
typename GridCellManager,
typename... AxesTypes>
139template <
typename GridCellManager,
typename... AxesTypes>
144template <
typename GridCellManager,
typename... AxesTypes>
149template <
typename GridCellManager,
typename... AxesTypes>
154template <
typename GridCellManager,
typename... AxesTypes>
160 total_index += pair.second *
m_index_helper.m_axes_index_factors[pair.first];
165template <
typename GridCellManager,
typename... AxesTypes>
171 total_index += pair.second *
m_index_helper.m_axes_index_factors[pair.first];
176template <
typename GridCellManager,
typename... AxesTypes>
182template <
typename GridCellManager,
typename... AxesTypes>
187 size_t total_index =
m_index_helper.totalIndexChecked(indices...);
190 total_index += pair.second *
m_index_helper.m_axes_index_factors[pair.first];
195template <std::
size_t I>
200 template <
typename... AxesType>
208 template <
typename IndexTuple,
typename... AxesType>
211 auto& axn = std::get<I>(axes);
212 std::get<I>(index) = axn.infimum(std::get<I>(coords)) - axn.begin();
222 template <
typename... AxesType>
225 auto i0 = std::get<0>(axes).infimum(std::get<0>(coords));
229 template <
typename IndexTuple,
typename... AxesType>
232 auto& ax0 = std::get<0>(axes);
233 std::get<0>(index) = ax0.infimum(std::get<0>(coords)) - ax0.begin();
237template <
typename GridCellManager,
typename... AxesTypes>
243template <
typename GridCellManager,
typename... AxesTypes>
249template <
typename GridCellManager,
typename... AxesTypes>
257 return GridContainer<GridCellManager, AxesTypes...>(*
this, I, index);
260template <
typename GridCellManager,
typename... AxesTypes>
267template <
typename GridCellManager,
typename... AxesTypes>
272 auto found_axis =
std::find(axis.begin(), axis.end(), value);
273 if (found_axis == axis.end()) {
276 return GridContainer<GridCellManager, AxesTypes...>(*
this, I, found_axis - axis.begin());
279template <
typename GridCellManager,
typename... AxesTypes>
Provides information related with an axis of a GridContainer.
GridContainer construction helper class.
static size_t getAxisIndexFactor(const std::tuple< GridAxis< Axes >... > &axes, const TemplateLoopCounter< I > &)
Returns the index factor of an axis.
static void fixIteratorAxes(IterType &iter, std::map< size_t, size_t > fix_indices, const TemplateLoopCounter< I > &)
Representation of a multi-dimensional grid which contains axis information.
const_iterator cend()
Returns a constant iterator to the cell after the last of the grid.
std::shared_ptr< GridCellManager > m_cell_manager
A pointer to the data of the grid.
GridContainer copy() const
But if needed be, allow explicit copies.
const GridAxis< axis_type< I > > & getOriginalAxis() const
GridContainer< GridCellManager, AxesTypes... > fixAxisByValue(const axis_type< I > &value)
Returns a slice of the grid based on an axis value.
iter< cell_type const, pointer_type const, reference_type const > const_iterator
std::tuple< GridAxis< AxesTypes >... > m_axes
A tuple containing the axes of the grid.
const reference_type operator()(decltype(std::declval< GridAxis< AxesTypes > >().size())... indices) const
const std::tuple< GridAxis< AxesTypes >... > & getAxesTuple() const
Returns a tuple containing the information of all the grid axes.
const GridAxis< axis_type< I > > & getAxis() const
decltype(ref_test< GridCellManagerTraits< GridCellManager > >(nullptr)) reference_type
Reference type.
static constexpr size_t axisNumber()
Returns the number of axes of the grid (dimensionality)
std::tuple< GridAxis< AxesTypes >... > m_axes_fixed
a tuple containing the original axes of the full grid, if this grid is a slice
std::tuple< decltype(std::declval< GridAxis< AxesTypes > >().size())... > infimum(const AxesTypes... coordinates) const
Returns the grid indexes to the greatest knot less or equal to the given coordinates.
iterator end()
Returns an iterator to the cell after the last of the grid.
size_t size() const
Returns the total number of cells of the grid.
typename std::tuple_element< I, std::tuple< AxesTypes... > >::type axis_type
auto getOriginalAxis() const -> const GridAxis< axis_type< I > > &
const_iterator cbegin()
Returns a constant iterator to the first cell of the grid.
iterator begin()
Returns an iterator to the first cell of the grid.
iter< cell_type, pointer_type, reference_type > iterator
const reference_type at(decltype(std::declval< GridAxis< AxesTypes > >().size())... indices) const
GridContainer(GridAxis< AxesTypes >... axes)
Constructs a GridContainer with the given axes.
std::map< size_t, size_t > m_fixed_indices
A map containing the axes which have been fixed, if this grid is a slice.
GridContainer< GridCellManager, AxesTypes... > fixAxisByIndex(size_t index)
Returns a slice of the grid based on an axis index.
GridIndexHelper< AxesTypes... > m_index_helper_fixed
a helper class for calculations of the original axes indices
GridIndexHelper< AxesTypes... > m_index_helper
A helper class used for calculations of the axes indices.
std::tuple< GridAxis< AxesTypes >... > fixAxis(const std::tuple< GridAxis< AxesTypes >... > &original, size_t axis, size_t index)
Class used by the GridContainer to access the different CellManagers.
static std::unique_ptr< GridCellManager > factory(size_t size)
static iterator end(GridCellManager &cell_manager)
static iterator begin(GridCellManager &cell_manager)
static void getIndex(const std::tuple< AxesType... > &coords, const std::tuple< GridAxis< AxesType >... > &axes, IndexTuple &index)
static std::tuple< std::size_t > getIndex(const std::tuple< AxesType... > &coords, const std::tuple< GridAxis< AxesType >... > &axes)
static void getIndex(const std::tuple< AxesType... > &coords, const std::tuple< GridAxis< AxesType >... > &axes, IndexTuple &index)
static std::tuple< Index< AxesType >... > getIndex(const std::tuple< AxesType... > &coords, const std::tuple< GridAxis< AxesType >... > &axes)