25#include "ElementsKernel/Exception.h"
30template <
typename... AxesTypes>
34 , m_axes_index_factors{GridConstructionHelper<AxesTypes...>::createAxisIndexFactorVector(
35 axes_tuple, TemplateLoopCounter<
sizeof...(AxesTypes)>{})}
37 GridConstructionHelper<AxesTypes...>::createAxesNamesVector(axes_tuple, TemplateLoopCounter<
sizeof...(AxesTypes)>{})} {}
39template <
typename... AxesTypes>
46template <
typename Coord>
48 return coord * factors[factors.
size() - 2];
51template <
typename Coord,
typename... RestCoords>
53 return coord * factors[factors.
size() -
sizeof...(RestCoords) - 2] +
calculateTotalIndex(factors, rest_coords...);
56template <
typename... AxesTypes>
61template <
typename Coord>
63 if (coord >= axes_sizes[axes_sizes.
size() - 1]) {
65 << axes_sizes[axes_sizes.
size() - 1] <<
") is out of bound";
69template <
typename Coord,
typename... RestCoords>
71 RestCoords... rest_coords) {
72 if (coord >= axes_sizes[axes_sizes.
size() -
sizeof...(RestCoords) - 1]) {
74 << axes_names[axes_sizes.
size() -
sizeof...(RestCoords) - 1] <<
" (size "
75 << axes_sizes[axes_sizes.
size() -
sizeof...(RestCoords) - 1] <<
") is out of bound";
77 checkBounds(axes_names, axes_sizes, rest_coords...);
80template <
typename... AxesTypes>
86template <
typename... AxesTypes>
87template <
typename Coord>
92 <<
" (size 1) is out of bound";
97template <
typename... AxesTypes>
98template <
typename Coord,
typename... RestCoords>
100 RestCoords... rest_coords)
const {
103 if (fixed_indices.
find(axis_index) != fixed_indices.
end()) {
105 <<
" (size 1) is out of bound";
108 checkAllFixedAreZero(fixed_indices, rest_coords...);
Provides information related with an axis of a GridContainer.
GridContainer construction helper class.
size_t axisIndex(size_t axis, size_t array_index) const
GridIndexHelper(const std::tuple< GridAxis< AxesTypes >... > &axes_tuple)
std::vector< std::string > m_axes_names
size_t totalIndex(decltype(std::declval< GridAxis< AxesTypes > >().size())... coords) const
std::vector< size_t > m_axes_sizes
void checkAllFixedAreZero(const std::map< size_t, size_t > &fixed_indices, Coord coord) const
Checks if any of the given coordinates is fixed and not zero.
std::vector< size_t > m_axes_index_factors
size_t totalIndexChecked(decltype(std::declval< GridAxis< AxesTypes > >().size())... coords) const
size_t calculateTotalIndex(const std::vector< size_t > &factors, Coord coord)
void checkBounds(const std::vector< std::string > &axes_names, const std::vector< size_t > &axes_sizes, Coord coord)