Ginkgo Generated from branch based on main. Ginkgo version 1.10.0
A numerical linear algebra library targeting many-core architectures
Loading...
Searching...
No Matches
dim.hpp
1// SPDX-FileCopyrightText: 2017 - 2024 The Ginkgo authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#ifndef GKO_PUBLIC_CORE_BASE_DIM_HPP_
6#define GKO_PUBLIC_CORE_BASE_DIM_HPP_
7
8
9#include <iostream>
10
11#include <ginkgo/core/base/types.hpp>
12
13
14namespace gko {
15
16
25template <size_type Dimensionality, typename DimensionType = size_type>
26struct dim {
27 static constexpr size_type dimensionality = Dimensionality;
28 friend struct dim<dimensionality + 1>;
29
30 using dimension_type = DimensionType;
31
35 constexpr GKO_ATTRIBUTES dim() : dim{dimension_type{}} {}
36
42 explicit constexpr GKO_ATTRIBUTES dim(const dimension_type& size)
43 : first_{size}, rest_{size}
44 {}
45
59 template <typename... Rest, std::enable_if_t<sizeof...(Rest) ==
60 Dimensionality - 1>* = nullptr>
61 constexpr GKO_ATTRIBUTES dim(const dimension_type& first,
62 const Rest&... rest)
63 : first_{first}, rest_{static_cast<dimension_type>(rest)...}
64 {}
65
77 constexpr GKO_ATTRIBUTES const dimension_type& operator[](
78 const size_type& dimension) const noexcept
79 {
80 return GKO_ASSERT(dimension < dimensionality),
81 dimension == 0 ? first_ : rest_[dimension - 1];
82 }
83
87 GKO_ATTRIBUTES dimension_type& operator[](
88 const size_type& dimension) noexcept
89 {
90 return GKO_ASSERT(dimension < dimensionality),
91 dimension == 0 ? first_ : rest_[dimension - 1];
92 }
93
105 explicit constexpr GKO_ATTRIBUTES operator bool() const
106 {
107 return static_cast<bool>(first_) && static_cast<bool>(rest_);
108 }
109
118 friend constexpr GKO_ATTRIBUTES bool operator==(const dim& x, const dim& y)
119 {
120 return x.first_ == y.first_ && x.rest_ == y.rest_;
121 }
122
131 friend constexpr GKO_ATTRIBUTES bool operator!=(const dim& x, const dim& y)
132 {
133 return !(x == y);
134 }
135
144 friend constexpr GKO_ATTRIBUTES dim operator*(const dim& x, const dim& y)
145 {
146 return dim(x.first_ * y.first_, x.rest_ * y.rest_);
147 }
148
157 friend std::ostream& operator<<(std::ostream& os, const dim& x)
158 {
159 os << "(";
160 x.print_to(os);
161 os << ")";
162 return os;
163 }
164
165private:
166 void inline print_to(std::ostream& os) const
167 {
168 os << first_ << ", ";
169 rest_.print_to(os);
170 }
171
172
173 constexpr GKO_ATTRIBUTES dim(const dimension_type first,
175 : first_{first}, rest_{rest}
176 {}
177
178 dimension_type first_;
179 dim<dimensionality - 1, dimension_type> rest_;
180};
181
182
183// base case for dim recursive template
184template <typename DimensionType>
185struct dim<1u, DimensionType> {
186 static constexpr size_type dimensionality = 1u;
187 friend struct dim<2>;
188
189 using dimension_type = DimensionType;
190
191 constexpr GKO_ATTRIBUTES dim(const dimension_type& size = dimension_type{})
192 : first_{size}
193 {}
194
195 constexpr GKO_ATTRIBUTES const dimension_type& operator[](
196 const size_type& dimension) const noexcept
197 {
198 return GKO_ASSERT(dimension == 0), first_;
199 }
200
201 GKO_ATTRIBUTES dimension_type& operator[](const size_type& dimension)
202 {
203 return GKO_ASSERT(dimension == 0), first_;
204 }
205
206 explicit constexpr GKO_ATTRIBUTES operator bool() const
207 {
208 return static_cast<bool>(first_);
209 }
210
211 friend constexpr GKO_ATTRIBUTES bool operator==(const dim& x, const dim& y)
212 {
213 return x.first_ == y.first_;
214 }
215
216 friend constexpr GKO_ATTRIBUTES bool operator!=(const dim& x, const dim& y)
217 {
218 return !(x == y);
219 }
220
221 friend constexpr GKO_ATTRIBUTES dim operator*(const dim& x, const dim& y)
222 {
223 return dim(x.first_ * y.first_);
224 }
225
226 friend std::ostream& operator<<(std::ostream& os, const dim& x)
227 {
228 os << "(";
229 x.print_to(os);
230 os << ")";
231 return os;
232 }
233
234private:
235 void inline print_to(std::ostream& os) const { os << first_; }
236
237 dimension_type first_;
238};
239
240
250template <typename DimensionType>
251constexpr GKO_ATTRIBUTES GKO_INLINE dim<2, DimensionType> transpose(
252 const dim<2, DimensionType>& dimensions) noexcept
253{
254 return {dimensions[1], dimensions[0]};
255}
256
257
258} // namespace gko
259
260
261#endif // GKO_PUBLIC_CORE_BASE_DIM_HPP_
The Ginkgo namespace.
Definition abstract_factory.hpp:20
std::size_t size_type
Integral type used for allocation quantities.
Definition types.hpp:90
batch_dim< 2, DimensionType > transpose(const batch_dim< 2, DimensionType > &input)
Returns a batch_dim object with its dimensions swapped for batched operators.
Definition batch_dim.hpp:119
A type representing the dimensions of a multidimensional object.
Definition dim.hpp:26
constexpr dim()
Creates a dimension object with all dimensions set to zero.
Definition dim.hpp:35
friend constexpr dim operator*(const dim &x, const dim &y)
Multiplies two dim objects.
Definition dim.hpp:144
friend constexpr bool operator!=(const dim &x, const dim &y)
Checks if two dim objects are not equal.
Definition dim.hpp:131
friend constexpr bool operator==(const dim &x, const dim &y)
Checks if two dim objects are equal.
Definition dim.hpp:118
friend std::ostream & operator<<(std::ostream &os, const dim &x)
A stream operator overload for dim.
Definition dim.hpp:157
constexpr const dimension_type & operator[](const size_type &dimension) const noexcept
Returns the requested dimension.
Definition dim.hpp:77
dimension_type & operator[](const size_type &dimension) noexcept
Definition dim.hpp:87
constexpr dim(const dimension_type &size)
Creates a dimension object with all dimensions set to the same value.
Definition dim.hpp:42
constexpr dim(const dimension_type &first, const Rest &... rest)
Creates a dimension object with the specified dimensions.
Definition dim.hpp:61