OpenMS
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
DPosition.h
Go to the documentation of this file.
1 // Copyright (c) 2002-present, OpenMS Inc. -- EKU Tuebingen, ETH Zurich, and FU Berlin
2 // SPDX-License-Identifier: BSD-3-Clause
3 //
4 // --------------------------------------------------------------------------
5 // $Maintainer: Timo Sachsenberg$
6 // $Authors: Marc Sturm, Stephan Aiche $
7 // --------------------------------------------------------------------------
8 
9 #pragma once
10 
11 #include <OpenMS/CONCEPT/Macros.h>
12 #include <OpenMS/CONCEPT/Types.h>
14 
15 #include <algorithm>
16 #include <array>
17 #include <cmath> // for std::abs on integrals and floats
18 #include <limits>
19 #include <ostream>
20 
21 namespace OpenMS
22 {
28  template <UInt D, typename TCoordinateType = double>
29 class DPosition
30 {
31 public:
33  using CoordinateType = TCoordinateType;
34 
35  using DataType = std::array<CoordinateType, D>;
36 
38  enum
39  {
40  DIMENSION = D
41  };
52 
62  DPosition() = default;
63 
66  {
67  std::fill(coordinate_.begin(), coordinate_.end(), x);
68  }
69 
72  {
73  static_assert(D == 2, "DPosition<D, TCoordinateType>:DPosition(x,y): index overflow!");
74  coordinate_[0] = x;
75  coordinate_[1] = y;
76  }
77 
80  {
81  static_assert(D == 3, "DPosition<D, TCoordinateType>:DPosition(x,y,z): index overflow!");
82  coordinate_[0] = x;
83  coordinate_[1] = y;
84  coordinate_[2] = z;
85  }
86 
88  DPosition(const DPosition& pos) = default;
89 
91  DPosition(DPosition&& rhs) noexcept = default;
92 
94  DPosition& operator=(const DPosition& source) = default;
95 
97  DPosition& operator=(DPosition&& source) noexcept = default;
98 
100  ~DPosition() noexcept = default;
101 
103 
105  void swap(DPosition& rhs) noexcept
106  {
107  std::swap(coordinate_, rhs.coordinate_);
108  }
109 
111  DPosition& abs() noexcept
112  {
113  for (Size i = 0; i < D; ++i)
114  {
115  coordinate_[i] = std::abs(coordinate_[i]);
116  }
117  return *this;
118  }
119 
122 
125  {
126  OPENMS_PRECONDITION(index < D, "DPosition<D,TCoordinateType>:operator [] (Position): index overflow!");
127  return coordinate_[index];
128  }
129 
132  {
133  OPENMS_PRECONDITION(index < D, "DPosition<D,TCoordinateType>:operator [] (Position): index overflow!");
134  return coordinate_[index];
135  }
136 
139  {
140  OPENMS_PRECONDITION(D == 2, "DPosition<D,TCoordinateType>:getX(): index overflow!");
141  return coordinate_[0];
142  }
143 
146  {
147  OPENMS_PRECONDITION(D == 2, "DPosition<D,TCoordinateType>:getY(): index overflow!");
148  return coordinate_[1];
149  }
150 
153  {
154  OPENMS_PRECONDITION(D == 2, "DPosition<D,TCoordinateType>:setX(): index overflow!");
155  coordinate_[0] = c;
156  }
157 
160  {
161  OPENMS_PRECONDITION(D == 2, "DPosition<D,TCoordinateType>:setY(): index overflow!");
162  coordinate_[1] = c;
163  }
164 
166  bool operator==(const DPosition& point) const = default;
167 
169  bool operator!=(const DPosition& point) const = default;
174  bool operator<(const DPosition& point) const
175  {
176  return coordinate_ < point.coordinate_;
177  }
178 
180  bool operator<=(const DPosition& point) const
181  {
182  return coordinate_ <= point.coordinate_;
183  }
184 
186  bool spatiallyLessEqual(const DPosition& point) const
187  {
188  for (Size i = 0; i < D; i++)
189  {
190  if (coordinate_[i] > point.coordinate_[i]) return false;
191  }
192  return true;
193  }
194 
196  bool spatiallyGreaterEqual(const DPosition& point) const
197  {
198  for (Size i = 0; i < D; i++)
199  {
200  if (coordinate_[i] < point.coordinate_[i]) return false;
201  }
202  return true;
203  }
204 
206  bool operator>(const DPosition& point) const
207  {
208  return coordinate_ > point.coordinate_;
209  }
210 
212  bool operator>=(const DPosition& point) const
213  {
214  return coordinate_ >= point.coordinate_;
215  }
216 
218  DPosition operator+(const DPosition& point) const
219  {
220  DPosition result(*this);
221  for (Size i = 0; i < D; ++i)
222  {
223  result.coordinate_[i] += point.coordinate_[i];
224  }
225  return result;
226  }
227 
230  {
231  for (Size i = 0; i < D; ++i)
232  {
233  coordinate_[i] += point.coordinate_[i];
234  }
235  return *this;
236  }
237 
239  DPosition operator-(const DPosition& point) const
240  {
241  DPosition result(*this);
242  for (Size i = 0; i < D; ++i)
243  {
244  result.coordinate_[i] -= point.coordinate_[i];
245  }
246  return result;
247  }
248 
251  {
252  for (Size i = 0; i < D; ++i)
253  {
254  coordinate_[i] -= point.coordinate_[i];
255  }
256  return *this;
257  }
258 
261  {
262  DPosition<D, CoordinateType> result(*this);
263  for (Size i = 0; i < D; ++i)
264  {
265  result.coordinate_[i] = -result.coordinate_[i];
266  }
267  return result;
268  }
269 
271  CoordinateType operator*(const DPosition& point) const
272  {
273  CoordinateType prod(0);
274  for (Size i = 0; i < D; ++i)
275  {
276  prod += (point.coordinate_[i] * coordinate_[i]);
277  }
278  return prod;
279  }
280 
283  {
284  for (Size i = 0; i < D; ++i)
285  {
286  coordinate_[i] *= scalar;
287  }
288  return *this;
289  }
290 
293  {
294  for (Size i = 0; i < D; ++i)
295  {
296  coordinate_[i] /= scalar;
297  }
298  return *this;
299  }
300 
302  constexpr static Size size()
303  {
304  return D;
305  }
306 
308  void clear()
309  {
310  coordinate_.fill(0);
311  }
312 
314 
318  inline static constexpr DPosition zero()
319  {
320  return DPosition(0);
321  }
322 
324  inline static constexpr DPosition minPositive()
325  {
326  return DPosition((std::numeric_limits<typename DPosition::CoordinateType>::min)());
327  }
328 
330  inline static constexpr DPosition minNegative()
331  {
332  return DPosition(std::numeric_limits<typename DPosition::CoordinateType>::lowest());
333  }
334 
336  inline static constexpr DPosition maxPositive()
337  {
338  return DPosition((std::numeric_limits<typename DPosition::CoordinateType>::max)());
339  }
340 
342 
347  {
348  return &coordinate_[0];
349  }
350 
353  {
354  return &coordinate_[0] + D;
355  }
356 
359  {
360  return &coordinate_[0];
361  }
362 
365  {
366  return &coordinate_[0] + D;
367  }
368 
370 
371 protected:
373  }; // DPosition
374 
376  template <UInt D, typename TCoordinateType>
378  {
379  for (Size i = 0; i < D; ++i)
380  {
381  position[i] *= scalar;
382  }
383  return position;
384  }
385 
387  template <UInt D, typename TCoordinateType>
389  {
390  for (Size i = 0; i < D; ++i)
391  {
392  position[i] *= scalar;
393  }
394  return position;
395  }
396 
398  template <UInt D, typename TCoordinateType>
400  {
401  for (Size i = 0; i < D; ++i)
402  {
403  position[i] /= scalar;
404  }
405  return position;
406  }
407 
409  template <UInt D, typename TCoordinateType>
410  std::ostream& operator<<(std::ostream& os, const DPosition<D, TCoordinateType>& pos)
411  {
412  os << precisionWrapper(pos[0]);
413  for (UInt i = 1; i < D; ++i)
414  {
415  os << ' ' << precisionWrapper(pos[i]);
416  }
417  return os;
418  }
419 
420 } // namespace OpenMS
421 
Representation of a coordinate in D-dimensional space.
Definition: DPosition.h:30
constexpr static Size size()
Returns the number of dimensions.
Definition: DPosition.h:302
@ DIMENSION
Definition: DPosition.h:40
CoordinateType & operator[](Size index)
Accessor for the dimensions.
Definition: DPosition.h:131
static constexpr DPosition minPositive()
smallest positive
Definition: DPosition.h:324
CoordinateType value_type
Definition: DPosition.h:46
DPosition operator+(const DPosition &point) const
Addition (a bit inefficient)
Definition: DPosition.h:218
const_iterator begin() const
Non-mutable begin iterator.
Definition: DPosition.h:346
bool operator<=(const DPosition &point) const
Lexicographical greater less or equal operator.
Definition: DPosition.h:180
DPosition(DPosition &&rhs) noexcept=default
Move constructor.
DPosition & operator=(DPosition &&source) noexcept=default
Move Assignment operator.
DPosition(CoordinateType x)
Constructor that fills all dimensions with the value x.
Definition: DPosition.h:65
DPosition & operator*=(CoordinateType scalar)
Scalar multiplication.
Definition: DPosition.h:282
DPosition(CoordinateType x, CoordinateType y)
Constructor only for DPosition<2> that takes two Coordinates.
Definition: DPosition.h:71
CoordinateType & reference
Definition: DPosition.h:47
CoordinateType operator[](Size index) const
Const accessor for the dimensions.
Definition: DPosition.h:124
bool spatiallyLessEqual(const DPosition &point) const
Spatially (geometrically) less or equal operator. All coordinates must be "<=".
Definition: DPosition.h:186
DPosition(CoordinateType x, CoordinateType y, CoordinateType z)
Constructor only for DPosition<3> that takes three Coordinates.
Definition: DPosition.h:79
DPosition()=default
Default constructor.
DPosition(const DPosition &pos)=default
Copy constructor.
CoordinateType * iterator
Definition: DPosition.h:49
void setX(CoordinateType c)
Name mutator for the first dimension. Only for DPosition<2>, for visualization.
Definition: DPosition.h:152
std::array< CoordinateType, D > DataType
Definition: DPosition.h:35
bool operator<(const DPosition &point) const
Lexicographical less than operator. Lexicographical comparison from dimension 0 to dimension D-1 is d...
Definition: DPosition.h:174
CoordinateType getY() const
Name accessor for the second dimension. Only for DPosition<2>, for visualization.
Definition: DPosition.h:145
bool operator>=(const DPosition &point) const
Lexicographical greater or equal operator.
Definition: DPosition.h:212
static constexpr DPosition maxPositive()
largest positive
Definition: DPosition.h:336
bool operator>(const DPosition &point) const
Lexicographical greater than operator.
Definition: DPosition.h:206
DPosition operator-(const DPosition &point) const
Subtraction (a bit inefficient)
Definition: DPosition.h:239
bool operator!=(const DPosition &point) const =default
Equality operator.
bool operator==(const DPosition &point) const =default
Equality operator.
CoordinateType getX() const
Name accessor for the first dimension. Only for DPosition<2>, for visualization.
Definition: DPosition.h:138
static constexpr DPosition zero()
all zero
Definition: DPosition.h:318
DPosition & abs() noexcept
Make all dimension values positive.
Definition: DPosition.h:111
const CoordinateType * const_iterator
Definition: DPosition.h:50
CoordinateType operator*(const DPosition &point) const
Inner product.
Definition: DPosition.h:271
DPosition & operator-=(const DPosition &point)
Subtraction.
Definition: DPosition.h:250
static constexpr DPosition minNegative()
smallest negative
Definition: DPosition.h:330
void clear()
Set all dimensions to zero.
Definition: DPosition.h:308
iterator end()
Mutable end iterator.
Definition: DPosition.h:364
const_iterator end() const
Non-mutable end iterator.
Definition: DPosition.h:352
void swap(DPosition &rhs) noexcept
Swap the two objects.
Definition: DPosition.h:105
~DPosition() noexcept=default
Destructor (not-virtual as this will save a lot of space!)
iterator begin()
Mutable begin iterator.
Definition: DPosition.h:358
bool spatiallyGreaterEqual(const DPosition &point) const
Spatially (geometrically) greater or equal operator. All coordinates must be ">=".
Definition: DPosition.h:196
CoordinateType * pointer
Definition: DPosition.h:48
TCoordinateType CoordinateType
Coordinate type.
Definition: DPosition.h:33
DPosition & operator+=(const DPosition &point)
Addition.
Definition: DPosition.h:229
DPosition & operator=(const DPosition &source)=default
Assignment operator.
DataType coordinate_
Definition: DPosition.h:372
DPosition & operator/=(CoordinateType scalar)
Scalar division.
Definition: DPosition.h:292
void setY(CoordinateType c)
Name mutator for the second dimension. Only for DPosition<2>, for visualization.
Definition: DPosition.h:159
DPosition operator-() const
Negation (a bit inefficient)
Definition: DPosition.h:260
unsigned int UInt
Unsigned integer type.
Definition: Types.h:64
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition: Types.h:97
#define OPENMS_PRECONDITION(condition, message)
Precondition macro.
Definition: openms/include/OpenMS/CONCEPT/Macros.h:94
const double c
Definition: Constants.h:188
Main OpenMS namespace.
Definition: openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19
std::ostream & operator<<(std::ostream &os, const AccurateMassSearchResult &amsr)
DPosition< D, TCoordinateType > operator*(DPosition< D, TCoordinateType > position, typename DPosition< D, TCoordinateType >::CoordinateType scalar)
Scalar multiplication (a bit inefficient)
Definition: DPosition.h:377
DPosition< D, TCoordinateType > operator/(DPosition< D, TCoordinateType > position, typename DPosition< D, TCoordinateType >::CoordinateType scalar)
Scalar multiplication (a bit inefficient)
Definition: DPosition.h:399
const PrecisionWrapper< FloatingPointType > precisionWrapper(const FloatingPointType rhs)
Wrapper function that sets the appropriate precision for output temporarily. The original precision i...
Definition: PrecisionWrapper.h:69