OpenMS
Loading...
Searching...
No Matches
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
15
16#include <algorithm>
17#include <array>
18#include <cmath> // for std::abs on integrals and floats
19#include <functional>
20#include <limits>
21#include <ostream>
22
23namespace OpenMS
24{
30 template <UInt D, typename TCoordinateType = double>
32{
33public:
35 using CoordinateType = TCoordinateType;
36
37 using DataType = std::array<CoordinateType, D>;
38
40 enum
41 {
42 DIMENSION = D
43 };
54
64 DPosition() = default;
65
68 {
69 std::fill(coordinate_.begin(), coordinate_.end(), x);
70 }
71
74 {
75 static_assert(D == 2, "DPosition<D, TCoordinateType>:DPosition(x,y): index overflow!");
76 coordinate_[0] = x;
77 coordinate_[1] = y;
78 }
79
82 {
83 static_assert(D == 3, "DPosition<D, TCoordinateType>:DPosition(x,y,z): index overflow!");
84 coordinate_[0] = x;
85 coordinate_[1] = y;
86 coordinate_[2] = z;
87 }
88
90 DPosition(const DPosition& pos) = default;
91
93 DPosition(DPosition&& rhs) noexcept = default;
94
96 DPosition& operator=(const DPosition& source) = default;
97
99 DPosition& operator=(DPosition&& source) noexcept = default;
100
102 ~DPosition() noexcept = default;
103
105
107 void swap(DPosition& rhs) noexcept
108 {
109 std::swap(coordinate_, rhs.coordinate_);
110 }
111
113 DPosition& abs() noexcept
114 {
115 for (Size i = 0; i < D; ++i)
116 {
117 coordinate_[i] = std::abs(coordinate_[i]);
118 }
119 return *this;
120 }
121
124
127 {
128 OPENMS_PRECONDITION(index < D, "DPosition<D,TCoordinateType>:operator [] (Position): index overflow!");
129 return coordinate_[index];
130 }
131
134 {
135 OPENMS_PRECONDITION(index < D, "DPosition<D,TCoordinateType>:operator [] (Position): index overflow!");
136 return coordinate_[index];
137 }
138
141 {
142 OPENMS_PRECONDITION(D == 2, "DPosition<D,TCoordinateType>:getX(): index overflow!");
143 return coordinate_[0];
144 }
145
148 {
149 OPENMS_PRECONDITION(D == 2, "DPosition<D,TCoordinateType>:getY(): index overflow!");
150 return coordinate_[1];
151 }
152
155 {
156 OPENMS_PRECONDITION(D == 2, "DPosition<D,TCoordinateType>:setX(): index overflow!");
157 coordinate_[0] = c;
158 }
159
162 {
163 OPENMS_PRECONDITION(D == 2, "DPosition<D,TCoordinateType>:setY(): index overflow!");
164 coordinate_[1] = c;
165 }
166
168 bool operator==(const DPosition& point) const = default;
169
171 bool operator!=(const DPosition& point) const = default;
176 bool operator<(const DPosition& point) const
177 {
178 return coordinate_ < point.coordinate_;
179 }
180
182 bool operator<=(const DPosition& point) const
183 {
184 return coordinate_ <= point.coordinate_;
185 }
186
188 bool spatiallyLessEqual(const DPosition& point) const
189 {
190 for (Size i = 0; i < D; i++)
191 {
192 if (coordinate_[i] > point.coordinate_[i]) return false;
193 }
194 return true;
195 }
196
198 bool spatiallyGreaterEqual(const DPosition& point) const
199 {
200 for (Size i = 0; i < D; i++)
201 {
202 if (coordinate_[i] < point.coordinate_[i]) return false;
203 }
204 return true;
205 }
206
208 bool operator>(const DPosition& point) const
209 {
210 return coordinate_ > point.coordinate_;
211 }
212
214 bool operator>=(const DPosition& point) const
215 {
216 return coordinate_ >= point.coordinate_;
217 }
218
220 DPosition operator+(const DPosition& point) const
221 {
222 DPosition result(*this);
223 for (Size i = 0; i < D; ++i)
224 {
225 result.coordinate_[i] += point.coordinate_[i];
226 }
227 return result;
228 }
229
232 {
233 for (Size i = 0; i < D; ++i)
234 {
235 coordinate_[i] += point.coordinate_[i];
236 }
237 return *this;
238 }
239
241 DPosition operator-(const DPosition& point) const
242 {
243 DPosition result(*this);
244 for (Size i = 0; i < D; ++i)
245 {
246 result.coordinate_[i] -= point.coordinate_[i];
247 }
248 return result;
249 }
250
253 {
254 for (Size i = 0; i < D; ++i)
255 {
256 coordinate_[i] -= point.coordinate_[i];
257 }
258 return *this;
259 }
260
263 {
264 DPosition<D, CoordinateType> result(*this);
265 for (Size i = 0; i < D; ++i)
266 {
267 result.coordinate_[i] = -result.coordinate_[i];
268 }
269 return result;
270 }
271
274 {
275 CoordinateType prod(0);
276 for (Size i = 0; i < D; ++i)
277 {
278 prod += (point.coordinate_[i] * coordinate_[i]);
279 }
280 return prod;
281 }
282
285 {
286 for (Size i = 0; i < D; ++i)
287 {
288 coordinate_[i] *= scalar;
289 }
290 return *this;
291 }
292
295 {
296 for (Size i = 0; i < D; ++i)
297 {
298 coordinate_[i] /= scalar;
299 }
300 return *this;
301 }
302
304 constexpr static Size size()
305 {
306 return D;
307 }
308
310 void clear()
311 {
312 coordinate_.fill(0);
313 }
314
316
320 inline static constexpr DPosition zero()
321 {
322 return DPosition(0);
323 }
324
326 inline static constexpr DPosition minPositive()
327 {
328 return DPosition((std::numeric_limits<typename DPosition::CoordinateType>::min)());
329 }
330
332 inline static constexpr DPosition minNegative()
333 {
334 return DPosition(std::numeric_limits<typename DPosition::CoordinateType>::lowest());
335 }
336
338 inline static constexpr DPosition maxPositive()
339 {
340 return DPosition((std::numeric_limits<typename DPosition::CoordinateType>::max)());
341 }
342
344
349 {
350 return &coordinate_[0];
351 }
352
355 {
356 return &coordinate_[0] + D;
357 }
358
361 {
362 return &coordinate_[0];
363 }
364
367 {
368 return &coordinate_[0] + D;
369 }
370
372
373protected:
375 }; // DPosition
376
378 template <UInt D, typename TCoordinateType>
380 {
381 for (Size i = 0; i < D; ++i)
382 {
383 position[i] *= scalar;
384 }
385 return position;
386 }
387
389 template <UInt D, typename TCoordinateType>
391 {
392 for (Size i = 0; i < D; ++i)
393 {
394 position[i] *= scalar;
395 }
396 return position;
397 }
398
400 template <UInt D, typename TCoordinateType>
402 {
403 for (Size i = 0; i < D; ++i)
404 {
405 position[i] /= scalar;
406 }
407 return position;
408 }
409
411 template <UInt D, typename TCoordinateType>
412 std::ostream& operator<<(std::ostream& os, const DPosition<D, TCoordinateType>& pos)
413 {
414 os << precisionWrapper(pos[0]);
415 for (UInt i = 1; i < D; ++i)
416 {
417 os << ' ' << precisionWrapper(pos[i]);
418 }
419 return os;
420 }
421
422} // namespace OpenMS
423
424// Hash function specialization for DPosition
425namespace std
426{
427 template<OpenMS::UInt D, typename TCoordinateType>
428 struct hash<OpenMS::DPosition<D, TCoordinateType>>
429 {
430 std::size_t operator()(const OpenMS::DPosition<D, TCoordinateType>& pos) const noexcept
431 {
432 std::size_t seed = 0;
433 for (OpenMS::UInt i = 0; i < D; ++i)
434 {
436 }
437 return seed;
438 }
439 };
440} // namespace std
441
Representation of a coordinate in D-dimensional space.
Definition DPosition.h:32
@ DIMENSION
Definition DPosition.h:42
static constexpr DPosition minPositive()
smallest positive
Definition DPosition.h:326
CoordinateType value_type
Definition DPosition.h:48
DPosition & operator/=(CoordinateType scalar)
Scalar division.
Definition DPosition.h:294
DPosition operator+(const DPosition &point) const
Addition (a bit inefficient)
Definition DPosition.h:220
const_iterator begin() const
Non-mutable begin iterator.
Definition DPosition.h:348
DPosition & operator*=(CoordinateType scalar)
Scalar multiplication.
Definition DPosition.h:284
bool operator<=(const DPosition &point) const
Lexicographical greater less or equal operator.
Definition DPosition.h:182
DPosition & operator=(DPosition &&source) noexcept=default
Move Assignment operator.
DPosition(DPosition &&rhs) noexcept=default
Move constructor.
DPosition(CoordinateType x)
Constructor that fills all dimensions with the value x.
Definition DPosition.h:67
DPosition(CoordinateType x, CoordinateType y)
Constructor only for DPosition<2> that takes two Coordinates.
Definition DPosition.h:73
CoordinateType & reference
Definition DPosition.h:49
CoordinateType operator[](Size index) const
Const accessor for the dimensions.
Definition DPosition.h:126
DPosition & abs() noexcept
Make all dimension values positive.
Definition DPosition.h:113
bool spatiallyLessEqual(const DPosition &point) const
Spatially (geometrically) less or equal operator. All coordinates must be "<=".
Definition DPosition.h:188
DPosition(CoordinateType x, CoordinateType y, CoordinateType z)
Constructor only for DPosition<3> that takes three Coordinates.
Definition DPosition.h:81
DPosition()=default
Default constructor.
DPosition(const DPosition &pos)=default
Copy constructor.
CoordinateType * iterator
Definition DPosition.h:51
void setX(CoordinateType c)
Name mutator for the first dimension. Only for DPosition<2>, for visualization.
Definition DPosition.h:154
std::array< CoordinateType, D > DataType
Definition DPosition.h:37
bool operator<(const DPosition &point) const
Lexicographical less than operator. Lexicographical comparison from dimension 0 to dimension D-1 is d...
Definition DPosition.h:176
CoordinateType getY() const
Name accessor for the second dimension. Only for DPosition<2>, for visualization.
Definition DPosition.h:147
bool operator>=(const DPosition &point) const
Lexicographical greater or equal operator.
Definition DPosition.h:214
static constexpr DPosition maxPositive()
largest positive
Definition DPosition.h:338
bool operator>(const DPosition &point) const
Lexicographical greater than operator.
Definition DPosition.h:208
DPosition & operator+=(const DPosition &point)
Addition.
Definition DPosition.h:231
DPosition & operator-=(const DPosition &point)
Subtraction.
Definition DPosition.h:252
DPosition operator-(const DPosition &point) const
Subtraction (a bit inefficient)
Definition DPosition.h:241
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:140
static constexpr DPosition zero()
all zero
Definition DPosition.h:320
const CoordinateType * const_iterator
Definition DPosition.h:52
CoordinateType operator*(const DPosition &point) const
Inner product.
Definition DPosition.h:273
static constexpr DPosition minNegative()
smallest negative
Definition DPosition.h:332
CoordinateType & operator[](Size index)
Accessor for the dimensions.
Definition DPosition.h:133
void clear()
Set all dimensions to zero.
Definition DPosition.h:310
iterator end()
Mutable end iterator.
Definition DPosition.h:366
const_iterator end() const
Non-mutable end iterator.
Definition DPosition.h:354
void swap(DPosition &rhs) noexcept
Swap the two objects.
Definition DPosition.h:107
~DPosition() noexcept=default
Destructor (not-virtual as this will save a lot of space!)
iterator begin()
Mutable begin iterator.
Definition DPosition.h:360
bool spatiallyGreaterEqual(const DPosition &point) const
Spatially (geometrically) greater or equal operator. All coordinates must be ">=".
Definition DPosition.h:198
CoordinateType * pointer
Definition DPosition.h:50
TCoordinateType CoordinateType
Coordinate type.
Definition DPosition.h:35
DPosition & operator=(const DPosition &source)=default
Assignment operator.
static constexpr Size size()
Returns the number of dimensions.
Definition DPosition.h:304
DataType coordinate_
Definition DPosition.h:374
void setY(CoordinateType c)
Name mutator for the second dimension. Only for DPosition<2>, for visualization.
Definition DPosition.h:161
DPosition operator-() const
Negation (a bit inefficient)
Definition DPosition.h:262
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
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:379
void hash_combine(std::size_t &seed, std::size_t value) noexcept
Combine a hash value with additional data using golden ratio mixing.
Definition HashUtils.h:87
std::size_t hash_float(T value) noexcept
Hash for a floating point type (float or double).
Definition HashUtils.h:142
DPosition< D, TCoordinateType > operator/(DPosition< D, TCoordinateType > position, typename DPosition< D, TCoordinateType >::CoordinateType scalar)
Scalar multiplication (a bit inefficient)
Definition DPosition.h:401
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
STL namespace.
std::size_t operator()(const OpenMS::DPosition< D, TCoordinateType > &pos) const noexcept
Definition DPosition.h:430