33 #ifndef GKO_CORE_BASE_DIM_HPP_ 34 #define GKO_CORE_BASE_DIM_HPP_ 37 #include <ginkgo/core/base/types.hpp> 38 #include <ginkgo/core/base/utils.hpp> 52 template <
size_type Dimensionality,
typename DimensionType =
size_type>
54 static constexpr
size_type dimensionality = Dimensionality;
56 using dimension_type = DimensionType;
63 constexpr GKO_ATTRIBUTES
dim(
const dimension_type &size = dimension_type{})
64 : first_{size}, rest_{size}
80 template <
typename... Rest>
81 constexpr GKO_ATTRIBUTES
dim(
const dimension_type &first,
83 : first_{first}, rest_{
static_cast<dimension_type
>(rest)...}
97 constexpr GKO_ATTRIBUTES
const dimension_type &
operator[](
98 const size_type &dimension)
const noexcept
100 return GKO_ASSERT(dimension < dimensionality), *(&first_ + dimension);
109 return GKO_ASSERT(dimension < dimensionality), *(&first_ + dimension);
120 constexpr GKO_ATTRIBUTES
operator bool()
const 122 return static_cast<bool>(first_) && static_cast<bool>(rest_);
135 return x.first_ == y.first_ && x.rest_ == y.rest_;
148 return dim(x.first_ * y.first_, x.rest_ * y.rest_);
152 constexpr GKO_ATTRIBUTES
dim(
const dimension_type first,
154 : first_{first}, rest_{rest}
157 dimension_type first_;
158 dim<dimensionality - 1, dimension_type> rest_;
163 template <
typename DimensionType>
164 struct dim<1u, DimensionType> {
165 static constexpr
size_type dimensionality = 1u;
167 using dimension_type = DimensionType;
169 constexpr GKO_ATTRIBUTES
dim(
const dimension_type &size = dimension_type{})
173 constexpr GKO_ATTRIBUTES
const dimension_type &
operator[](
174 const size_type &dimension)
const noexcept
176 return *(&first_ + dimension);
181 return *(&first_ + dimension);
184 constexpr GKO_ATTRIBUTES
operator bool()
const 186 return static_cast<bool>(first_);
191 return x.first_ == y.first_;
196 return dim(x.first_ * y.first_);
200 dimension_type first_;
215 template <
size_type Dimensionality,
typename DimensionType>
233 template <
typename DimensionType>
237 return {dimensions[1], dimensions[0]};
244 #endif // GKO_CORE_BASE_DIM_HPP_ A type representing the dimensions of a multidimensional object.
Definition: dim.hpp:53
friend constexpr bool operator==(const dim &x, const dim &y)
Checks if two dim objects are equal.
Definition: dim.hpp:133
constexpr const dimension_type & operator[](const size_type &dimension) const noexcept
Returns the requested dimension.
Definition: dim.hpp:97
constexpr bool operator!=(const dim< Dimensionality, DimensionType > &x, const dim< Dimensionality, DimensionType > &y)
Checks if two dim objects are different.
Definition: dim.hpp:216
std::size_t size_type
Integral type used for allocation quantities.
Definition: types.hpp:94
constexpr dim(const dimension_type &first, const Rest &... rest)
Creates a dimension object with the specified dimensions.
Definition: dim.hpp:81
The Ginkgo namespace.
Definition: abstract_factory.hpp:45
dimension_type & operator[](const size_type &dimension) noexcept
Definition: dim.hpp:106
friend constexpr dim operator*(const dim &x, const dim &y)
Multiplies two dim objects.
Definition: dim.hpp:146
constexpr dim(const dimension_type &size=dimension_type{})
Creates a dimension object with all dimensions set to the same value.
Definition: dim.hpp:63
constexpr dim< 2, DimensionType > transpose(const dim< 2, DimensionType > &dimensions) noexcept
Returns a dim<2> object with its dimensions swapped.
Definition: dim.hpp:234