Xmipp  v3.23.11-Nereus
dimensions.h
Go to the documentation of this file.
1 /***************************************************************************
2  *
3  * Authors: David Strelak (davidstrelak@gmail.com)
4  *
5  * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20  * 02111-1307 USA
21  *
22  * All comments concerning this program package may be sent to the
23  * e-mail address 'xmipp@cnb.csic.es'
24  ***************************************************************************/
25 
26 #ifndef LIBRARIES_DATA_DIMENSIONS_H_
27 #define LIBRARIES_DATA_DIMENSIONS_H_
28 
29 #include <ostream>
31 
35 class Dimensions {
36 public:
37  explicit constexpr Dimensions(size_t x, size_t y = 1, size_t z = 1, size_t n = 1,
38  size_t pad_x = 0, size_t pad_y = 0, size_t pad_z = 0) :
39  m_x(x), m_y(y), m_z(z), m_n(n),
40  m_pad_x(pad_x), m_pad_y(pad_y), m_pad_z(pad_z) {}
41 
42  constexpr Dimensions createSingle() const {
43  return Dimensions(m_x, m_y, m_z, 1, m_pad_x, m_pad_y, m_pad_z);
44  }
45 
46  constexpr Dimensions copyForN(size_t n) const {
47  return Dimensions(m_x, m_y, m_z, n, m_pad_x, m_pad_y, m_pad_z);
48  }
49 
50  CUDA_HD
51  constexpr size_t x() const {
52  return m_x;
53  }
54 
55  inline constexpr size_t xPadded() const {
56  return m_x + m_pad_x;
57  }
58 
59  CUDA_HD
60  constexpr size_t y() const {
61  return m_y;
62  }
63 
64  inline constexpr size_t yPadded() const {
65  return m_y + m_pad_y;
66  }
67 
68  CUDA_HD
69  constexpr size_t z() const {
70  return m_z;
71  }
72 
73  inline constexpr size_t zPadded() const {
74  return m_z + m_pad_z;
75  }
76 
77  CUDA_HD
78  constexpr size_t n() const {
79  return m_n;
80  }
81 
82  inline constexpr size_t xy() const {
83  return m_x * m_y;
84  }
85 
86  inline constexpr size_t xyPadded() const {
87  return (m_x + m_pad_x) * (m_y + m_pad_y);
88  }
89 
90  CUDA_HD
91  constexpr size_t xyz() const {
92  return m_x * m_y * m_z;
93  }
94 
95  inline constexpr size_t xyzPadded() const {
96  return (m_x + m_pad_x) * (m_y + m_pad_y) * (m_z + m_pad_z);
97  }
98 
99  CUDA_HD
100  constexpr size_t sizeSingle() const {
101  return xyz();
102  }
103 
104  inline constexpr size_t size() const {
105  return xyz() * m_n;
106  }
107 
108  inline constexpr size_t sizePadded() const {
109  return xyzPadded() * m_n;
110  }
111 
112  friend std::ostream& operator<<(std::ostream &os, const Dimensions &d) {
113  os << d.x() << " * " << d.y() << " * " << d.z() << " * " << d.n();
114  return os;
115  }
116 
117  inline constexpr bool equalSizesIgnorePadding(const Dimensions &b) const {
118  return (m_x == b.m_x)
119  && (m_y == b.m_y)
120  && (m_z == b.m_z)
121  && (m_n == b.m_n);
122  }
123 
124  inline constexpr bool equalExceptNPadded(const Dimensions &b) const {
125  return (m_x == b.m_x)
126  && (m_y == b.m_y)
127  && (m_z == b.m_z)
128  // && (m_n == b.m_n) ignore on purpose
129  && equalPadding(b);
130  }
131 
132  inline constexpr bool equalPadding(const Dimensions &b) const {
133  return (m_pad_x == b.m_pad_x)
134  && (m_pad_y == b.m_pad_y)
135  && (m_pad_z == b.m_pad_z);
136  }
137 
138  inline constexpr bool isValid() const {
139  return (0 != m_x)
140  && (0 != m_y)
141  && (0 != m_z)
142  && (0 != m_n);
143  }
144 
145  constexpr bool operator==(const Dimensions &b) const {
146  return equalSizesIgnorePadding(b) && equalPadding(b);
147  }
148 
149  constexpr bool operator!=(const Dimensions &b) const {
150  return !(*this == b);
151  }
152 
153  inline constexpr bool isPadded() const {
154  return (0 != m_pad_x) || (0 != m_pad_y) || (0 != m_pad_z);
155  }
156 
157  constexpr bool is1D() const {
158  return (m_z == 1) && (m_y == 1);
159  }
160 
161  CUDA_HD
162  constexpr bool is2D() const {
163  return (m_z == 1) && (m_y != 1);
164  }
165 
166  CUDA_HD
167  constexpr bool is3D() const {
168  return (m_z != 1) && (m_y != 1);
169  }
170 
171  CUDA_HD
172  inline int getDimAsNumber() const {
173  if (is3D()) return 3;
174  if (is2D()) return 2;
175  return 1;
176  }
177 
178 private:
179  size_t m_x;
180  size_t m_y;
181  size_t m_z;
182  size_t m_n;
183 
184  size_t m_pad_x;
185  size_t m_pad_y;
186  size_t m_pad_z;
187 };
189 #endif /* LIBRARIES_DATA_DIMENSIONS_H_ */
CUDA_HD constexpr bool is2D() const
Definition: dimensions.h:162
constexpr size_t xyzPadded() const
Definition: dimensions.h:95
constexpr Dimensions copyForN(size_t n) const
Definition: dimensions.h:46
constexpr size_t xyPadded() const
Definition: dimensions.h:86
CUDA_HD int getDimAsNumber() const
Definition: dimensions.h:172
constexpr bool isPadded() const
Definition: dimensions.h:153
constexpr bool operator==(const Dimensions &b) const
Definition: dimensions.h:145
constexpr bool operator!=(const Dimensions &b) const
Definition: dimensions.h:149
CUDA_HD constexpr size_t z() const
Definition: dimensions.h:69
constexpr Dimensions createSingle() const
Definition: dimensions.h:42
CUDA_HD constexpr bool is3D() const
Definition: dimensions.h:167
doublereal * d
friend std::ostream & operator<<(std::ostream &os, const Dimensions &d)
Definition: dimensions.h:112
CUDA_HD constexpr size_t x() const
Definition: dimensions.h:51
doublereal * b
constexpr Dimensions(size_t x, size_t y=1, size_t z=1, size_t n=1, size_t pad_x=0, size_t pad_y=0, size_t pad_z=0)
Definition: dimensions.h:37
constexpr bool is1D() const
Definition: dimensions.h:157
constexpr size_t zPadded() const
Definition: dimensions.h:73
constexpr bool equalExceptNPadded(const Dimensions &b) const
Definition: dimensions.h:124
CUDA_HD constexpr size_t sizeSingle() const
Definition: dimensions.h:100
constexpr bool equalPadding(const Dimensions &b) const
Definition: dimensions.h:132
constexpr bool equalSizesIgnorePadding(const Dimensions &b) const
Definition: dimensions.h:117
CUDA_HD constexpr size_t y() const
Definition: dimensions.h:60
constexpr size_t xPadded() const
Definition: dimensions.h:55
constexpr size_t sizePadded() const
Definition: dimensions.h:108
CUDA_HD constexpr size_t n() const
Definition: dimensions.h:78
#define CUDA_HD
constexpr size_t size() const
Definition: dimensions.h:104
constexpr bool isValid() const
Definition: dimensions.h:138
constexpr size_t xy() const
Definition: dimensions.h:82
constexpr size_t yPadded() const
Definition: dimensions.h:64
CUDA_HD constexpr size_t xyz() const
Definition: dimensions.h:91