OpenMS
RangeManager.h
Go to the documentation of this file.
1 // Copyright (c) 2002-present, The OpenMS Team -- EKU Tuebingen, ETH Zurich, and FU Berlin
2 // SPDX-License-Identifier: BSD-3-Clause
3 //
4 // --------------------------------------------------------------------------
5 // $Maintainer: Chris Bielow $
6 // $Authors: Chris Bielow $
7 // --------------------------------------------------------------------------
8 
9 #pragma once
10 
13 #include <OpenMS/config.h>
14 #include <algorithm> // for min/max
15 #include <cassert>
16 #include <cmath> // for nan()
17 #include <iosfwd> // for std::ostream
18 
19 namespace OpenMS
20 {
22 enum class MSDim
23 {
24  RT,
25  MZ,
26  INT,
27  IM
28 };
29 
30 struct RangeRT;
31 struct RangeMZ;
32 struct RangeIntensity;
33 struct RangeMobility;
34 
36 struct OPENMS_DLLAPI RangeBase
37 {
38 public:
40  RangeBase() = default;
41 
43  RangeBase(const double single): min_(single), max_(single)
44  {
45  }
46 
49  RangeBase(const double min, const double max): min_(min), max_(max)
50  {
51  if (min_ > max_) throw Exception::InvalidRange(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "Invalid initialization of range");
52  }
54  RangeBase(const RangeBase& rhs) = default;
55 
57  RangeBase(RangeBase&& rhs) noexcept = default;
58 
60  RangeBase& operator=(const RangeBase& rhs) = default;
61 
63  RangeBase& operator=(RangeBase&& rhs) noexcept = default;
64 
66  ~RangeBase() noexcept = default;
67 
70  operator RangeRT() const;
73  operator RangeMZ() const;
76  operator RangeIntensity() const;
79  operator RangeMobility() const;
80 
82  void clear()
83  {
84  *this = RangeBase(); // overwrite with fresh instance
85  }
86 
88  bool isEmpty() const
89  {
90  return min_ > max_;
91  }
92 
94  bool contains(const double value) const
95  {
96  return uint8_t(min_ <= value) & uint8_t(value <= max_); // using && leads to branches on all compilers in Debug and in Release on MVSC
97  }
98 
100  bool contains(const RangeBase& inner_range) const
101  {
102  return uint8_t(contains(inner_range.min_))
103  & uint8_t(contains(inner_range.max_)); // using && leads to branches on all compilers in Debug and in Release on MVSC
104  }
105 
111 
113  void setMin(const double min)
114  {
115  min_ = min;
116  if (max_ < min) max_ = min;
117  }
118 
120  void setMax(const double max)
121  {
122  max_ = max;
123  if (min_ > max) min_ = max;
124  }
125 
127  double getMin() const
128  {
129  return min_;
130  }
131 
133  double getMax() const
134  {
135  return max_;
136  }
138 
140  void extend(const RangeBase& other)
141  {
142  min_ = std::min(min_, other.min_);
143  max_ = std::max(max_, other.max_);
144  }
145 
147  void extend(const double value)
148  {
149  min_ = std::min(min_, value);
150  max_ = std::max(max_, value);
151  }
152 
156  void extendLeftRight(const double by)
157  {
158  if (isEmpty()) return;
159  min_ -= by;
160  max_ += by;
161  }
162 
168  void minSpanIfSingular(const double min_span)
169  {
170  if (min_ == max_) extendLeftRight(min_span / 2);
171  }
172 
179  void clampTo(const RangeBase& other)
180  {
181  if (isEmpty()) return;
182  if (other.isEmpty()) throw Exception::InvalidRange(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION);
183 
184  min_ = std::max(min_, other.min_);
185  max_ = std::min(max_, other.max_);
186  }
187 
193  void pushInto(const RangeBase& sandbox)
194  {
195  if (isEmpty()) return;
196  if (sandbox.isEmpty()) throw Exception::InvalidRange(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION);
197 
198  if (! sandbox.contains(*this))
199  {
200  if (getSpan() > sandbox.getSpan())
201  { // make interval fit into sandbox (= ensure full containment)
202  max_ = min_ + sandbox.getSpan();
203  }
204  if (min_ < sandbox.min_)
205  { // need to shift right (positive shift)
206  shift(sandbox.min_ - min_);
207  }
208  else if (max_ > sandbox.max_)
209  { // need to shift left (negative shift)
210  shift(sandbox.max_ - max_);
211  }
212  }
213  }
214 
225  void scaleBy(const double factor)
226  {
227  if (isEmpty()) return;
228  const double dist = max_ - min_;
229  const double extension = dist * (factor - 1) / 2;
230  min_ -= extension;
231  max_ += extension;
232  }
233 
236  void shift(const double distance)
237  {
238  if (isEmpty()) return;
239  min_ += distance;
240  max_ += distance;
241  }
242 
245  double center() const
246  {
247  if (isEmpty()) return nan("");
248  return min_ + (max_ - min_) / 2.0;
249  }
250 
253  double getSpan() const
254  {
255  if (isEmpty()) return nan("");
256  return max_ - min_;
257  }
258 
259  bool operator==(const RangeBase& rhs) const
260  {
261  return min_ == rhs.min_ && max_ == rhs.max_;
262  }
263 
268  std::pair<double, double> getNonEmptyRange() const
269  {
270  // pair with full range
271  if (isEmpty()) return {std::numeric_limits<double>::lowest(), std::numeric_limits<double>::max()};
272  else
273  return {min_, max_};
274  }
275 
276 protected:
277  // make members non-accessible to maintain invariant: min <= max (unless uninitialized)
278  double min_ = std::numeric_limits<double>::max();
279  double max_ = std::numeric_limits<double>::lowest();
280 };
281 
282 OPENMS_DLLAPI std::ostream& operator<<(std::ostream& out, const RangeBase& b);
283 
284 struct OPENMS_DLLAPI RangeRT : public RangeBase
285 {
286 
287  const static MSDim DIM = MSDim::RT;
288 
289  // Rule of 0!
290  using RangeBase::RangeBase; // inherit C'tors from base
291 
297 
299  void setMinRT(const double min)
300  {
301  setMin(min);
302  }
303 
305  void setMaxRT(const double max)
306  {
307  setMax(max);
308  }
309 
311  double getMinRT() const
312  {
313  return min_;
314  }
315 
317  double getMaxRT() const
318  {
319  return max_;
320  }
322 
324  void extendRT(const double value)
325  {
326  extend(value);
327  }
328 
330  bool containsRT(const double value) const
331  {
332  return RangeBase::contains(value);
333  }
334 
336  bool containsRT(const RangeBase& inner_range) const
337  {
338  return RangeBase::contains(inner_range);
339  }
340 };
341 
342 OPENMS_DLLAPI std::ostream& operator<<(std::ostream& out, const RangeRT& range);
343 
344 struct OPENMS_DLLAPI RangeMZ : public RangeBase
345 {
346 
347  const static MSDim DIM = MSDim::MZ;
348 
349  // Rule of 0!
350  using RangeBase::RangeBase; // inherit C'tors from base
351 
357 
359  void setMinMZ(const double min)
360  {
361  setMin(min);
362  }
363 
365  void setMaxMZ(const double max)
366  {
367  setMax(max);
368  }
369 
371  double getMinMZ() const
372  {
373  return min_;
374  }
375 
377  double getMaxMZ() const
378  {
379  return max_;
380  }
382 
384  void extendMZ(const double value)
385  {
386  extend(value);
387  }
388 
390  bool containsMZ(const double value) const
391  {
392  return RangeBase::contains(value);
393  }
394 
396  bool containsMZ(const RangeBase& inner_range) const
397  {
398  return RangeBase::contains(inner_range);
399  }
400 };
401 OPENMS_DLLAPI std::ostream& operator<<(std::ostream& out, const RangeMZ& range);
402 
403 struct OPENMS_DLLAPI RangeIntensity : public RangeBase
404 {
405 
406  const static MSDim DIM = MSDim::INT;
407 
408  // Rule of 0!
409  using RangeBase::RangeBase; // inherit C'tors from base
410 
416 
418  void setMinIntensity(const double min)
419  {
420  setMin(min);
421  }
422 
424  void setMaxIntensity(const double max)
425  {
426  setMax(max);
427  }
428 
430  double getMinIntensity() const
431  {
432  return min_;
433  }
434 
436  double getMaxIntensity() const
437  {
438  return max_;
439  }
441 
443  void extendIntensity(const double value)
444  {
445  extend(value);
446  }
447 
449  bool containsIntensity(const double value) const
450  {
451  return RangeBase::contains(value);
452  }
453 
455  bool containsIntensity(const RangeBase& inner_range) const
456  {
457  return RangeBase::contains(inner_range);
458  }
459 };
460 OPENMS_DLLAPI std::ostream& operator<<(std::ostream& out, const RangeIntensity& range);
461 
462 struct OPENMS_DLLAPI RangeMobility : public RangeBase
463 {
464  const static MSDim DIM = MSDim::IM;
465 
466  // Rule of 0!
467  using RangeBase::RangeBase; // inherit C'tors from base
468 
474 
476  void setMinMobility(const double min)
477  {
478  setMin(min);
479  }
480 
482  void setMaxMobility(const double max)
483  {
484  setMax(max);
485  }
486 
488  double getMinMobility() const
489  {
490  return min_;
491  }
492 
494  double getMaxMobility() const
495  {
496  return max_;
497  }
499 
501  void extendMobility(const double value)
502  {
503  extend(value);
504  }
505 
507  bool containsMobility(const double value) const
508  {
509  return RangeBase::contains(value);
510  }
511 
513  bool containsMobility(const RangeBase& inner_range) const
514  {
515  return RangeBase::contains(inner_range);
516  }
517 };
518 
519 OPENMS_DLLAPI std::ostream& operator<<(std::ostream& out, const RangeMobility& range);
520 
522 enum class HasRangeType
523 {
524  ALL,
525  SOME,
526  NONE
527 };
528 
544 template<typename... RangeBases>
545 class RangeManager : public RangeBases...
546 {
547 public:
548  using ThisRangeType = RangeManager<RangeBases...>;
549 
550  // rule of 0 -- no need for a virtual d'tor or anything fancy
551  // ...
552 
553  bool operator==(const RangeManager& rhs) const
554  {
555  bool equal = true;
556  for_each_base_([&](auto* base) {
557  using T_BASE = std::decay_t<decltype(*base)>; // remove const/ref qualifiers
558  equal &= ((T_BASE&)rhs == (T_BASE&)*this);
559  });
560  return equal;
561  }
562 
563  bool operator!=(const RangeManager& rhs) const
564  {
565  return ! operator==(rhs);
566  }
567 
572  template<typename... RangeBasesOther>
574  {
575  bool found = false;
576  for_each_base_([&](auto* base) {
577  using T_BASE = std::decay_t<decltype(*base)>; // remove const/ref qualifiers
578  if constexpr (std::is_base_of_v<T_BASE, RangeManager<RangeBasesOther...>>)
579  {
580  base->operator=((T_BASE&)rhs);
581  found = true;
582  }
583  });
584 
585  return found;
586  }
587 
592  template<typename... RangeBasesOther>
594  {
595  if (! assignUnsafe(rhs))
596  {
597  throw Exception::InvalidRange(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "No assignment took place (no dimensions in common!);");
598  }
599  return *this;
600  }
601 
606  template<typename... RangeBasesOther>
608  {
609  bool found = false;
610  for_each_base_([&](auto* base) {
611  using T_BASE = std::decay_t<decltype(*base)>; // remove const/ref qualifiers
612  if constexpr (std::is_base_of_v<T_BASE, RangeManager<RangeBasesOther...>>)
613  {
614  base->extend((T_BASE&)rhs);
615  found = true;
616  }
617  });
618  return found;
619  }
620 
625  template<typename... RangeBasesOther>
627  {
628  if (! extendUnsafe(rhs))
629  {
630  throw Exception::InvalidRange(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "No assignment took place (no dimensions in common!);");
631  }
632  }
633 
635  void scaleBy(const double factor)
636  {
637  for_each_base_([&](auto* base) { base->scaleBy(factor); });
638  }
639 
648  void minSpanIfSingular(const double min_span)
649  {
650  for_each_base_([&](auto* base) { base->minSpanIfSingular(min_span); });
651  }
652 
653 
659  template<typename... RangeBasesOther>
661  {
662  bool found = false;
663  for_each_base_([&](auto* base) {
664  using T_BASE = std::decay_t<decltype(*base)>; // remove const/ref qualifiers
665  if constexpr (std::is_base_of_v<T_BASE, RangeManager<RangeBasesOther...>>)
666  {
667  const auto& rhs_base = (T_BASE&)rhs;
668  if (! rhs_base.isEmpty()) base->pushInto(rhs_base);
669  found = true;
670  }
671  });
672  return found;
673  }
674 
680  template<typename... RangeBasesOther>
682  {
683  if (! pushIntoUnsafe(sandbox))
684  {
685  throw Exception::InvalidRange(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "No assignment took place (no dimensions in common!);");
686  }
687  }
688 
689 
694  template<typename... RangeBasesOther>
696  {
697  bool found = false;
698  for_each_base_([&](auto* base) {
699  using T_BASE = std::decay_t<decltype(*base)>; // remove const/ref qualifiers
700  if constexpr (std::is_base_of_v<T_BASE, RangeManager<RangeBasesOther...>>)
701  {
702  const auto& rhs_base = (T_BASE&)rhs;
703  if (! rhs_base.isEmpty()) base->clampTo(rhs_base);
704  found = true;
705  }
706  });
707  return found;
708  }
709 
715  template<typename... RangeBasesOther>
717  {
718  if (! clampToUnsafe(rhs))
719  {
720  throw Exception::InvalidRange(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "No assignment took place (no dimensions in common!);");
721  }
722  }
723 
725  const RangeBase& getRangeForDim(MSDim dim) const
726  {
727  RangeBase* r_base = nullptr;
728 
729  static_for_each_base_([&](auto* base) {
730  using Base = std::decay_t<decltype(*base)>; // remove const/ref qualifiers
731  if (base->DIM == dim) r_base = (Base*)this;
732  });
733 
734  assert((r_base != nullptr) && "No base class has this MSDim!");
735  return *r_base;
736  }
737 
740  {
741  RangeBase* r_base = nullptr;
742 
743  static_for_each_base_([&](auto* base) {
744  using Base = std::decay_t<decltype(*base)>; // remove const/ref qualifiers
745  if (base->DIM == dim) r_base = (Base*)this;
746  });
747 
748  assert((r_base != nullptr) && "No base class has this MSDim!");
749  return *r_base;
750  }
751 
754  {
755  constexpr size_t total {sizeof...(RangeBases)}; // total number of bases
756  size_t count {0};
757  for_each_base_([&](auto* base) { count += ! base->isEmpty(); });
758  switch (count)
759  {
760  case 0:
761  return HasRangeType::NONE;
762  case total:
763  return HasRangeType::ALL;
764  default:
765  return HasRangeType::SOME;
766  }
767  }
768 
773  template<typename... RangeBasesOther>
775  {
776  bool contained = true; // assume rhs is contained, until proven otherwise
777  bool has_overlap = false;
778  for_each_base_([&](auto* base) {
779  using T_BASE = std::decay_t<decltype(*base)>; // remove const/ref qualifiers
780  if constexpr (std::is_base_of_v<T_BASE, RangeManager<RangeBasesOther...>>)
781  {
782  has_overlap = true; // at least one dimension overlaps
783  if (((T_BASE&)rhs).isEmpty()) return;
784  if (base->contains((T_BASE&)rhs)) return;
785  contained = false;
786  }
787  });
788  if (! has_overlap) throw Exception::InvalidRange(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION);
789 
790  return contained;
791  }
792 
794  void clearRanges()
795  {
796  for_each_base_([&](auto* base) { base->clear(); });
797  }
798 
802  {
803  switch (range)
804  {
805  case DIM_UNIT::RT:
806  if constexpr (std::is_base_of_v<RangeRT, ThisRangeType>) this->RangeRT::clear();
807  break;
808  case DIM_UNIT::MZ:
809  if constexpr (std::is_base_of_v<RangeMZ, ThisRangeType>) this->RangeMZ::clear();
810  break;
811  case DIM_UNIT::INT:
812  if constexpr (std::is_base_of_v<RangeIntensity, ThisRangeType>) this->RangeIntensity::clear();
813  break;
814  // assume all ion mobility ranges are the same and never occur together. If this is violated at some point, then split RangeMobility into
815  // subclasses...
816  case DIM_UNIT::IM_MS:
817  case DIM_UNIT::IM_VSSC:
818  case DIM_UNIT::FAIMS_CV:
819  if constexpr (std::is_base_of_v<RangeMobility, ThisRangeType>) this->RangeMobility::clear();
820  break;
821  default:
822  // all cases should be covered above
823  assert(false && "This should never be reached. Did you forget to implement a new DIM_UNIT?");
824  }
825  return *this;
826  }
827 
829  void printRange(std::ostream& out) const
830  {
831  for_each_base_([&](auto* base) { out << *base; });
832  }
833 
834 protected:
836  template<typename Visitor>
837  void for_each_base_(Visitor&& visitor)
838  {
839  (void(visitor(static_cast<RangeBases*>(this))), ...);
840  }
842  template<typename Visitor>
843  void for_each_base_(Visitor&& visitor) const
844  {
845  (void(visitor(static_cast<const RangeBases*>(this))), ...);
846  }
847 
849  template<typename Visitor>
850  static void static_for_each_base_(Visitor&& visitor)
851  {
852  (void(visitor(static_cast<const RangeBases*>(nullptr))), ...);
853  }
854 };
855 
856 template<typename... Range>
857 std::ostream& operator<<(std::ostream& out, const RangeManager<Range...>& me)
858 {
859  me.printRange(out);
860  return out;
861 }
862 
865 template<typename... RangeBases>
866 class RangeManagerContainer : public RangeManager<RangeBases...>
867 {
868 public:
869  using ThisRangeType = typename RangeManager<RangeBases...>::ThisRangeType;
870 
872  virtual ~RangeManagerContainer() = default; // required since we have virtual methods
873 
876  virtual void updateRanges() = 0;
877 
879  const ThisRangeType& getRange() const
880  {
881  return (ThisRangeType&)*this;
882  }
883 
886  {
887  return (ThisRangeType&)*this;
888  }
889 };
890 
893 
894 } // namespace OpenMS
Invalid range exception.
Definition: Exception.h:257
Definition: RangeManager.h:867
const ThisRangeType & getRange() const
get range of current data (call updateRanges() before to ensure the range is accurate)
Definition: RangeManager.h:879
typename RangeManager< RangeBases... >::ThisRangeType ThisRangeType
Definition: RangeManager.h:869
virtual void updateRanges()=0
ThisRangeType & getRange()
get mutable range, provided for efficiency reasons (avoid updateRanges(), if only minor changes were ...
Definition: RangeManager.h:885
virtual ~RangeManagerContainer()=default
D'tor.
Handles the management of a multidimensional range, e.g. RangeMZ and RangeIntensity for spectra.
Definition: RangeManager.h:546
void pushInto(const RangeManager< RangeBasesOther... > &sandbox)
Definition: RangeManager.h:681
bool assignUnsafe(const RangeManager< RangeBasesOther... > &rhs)
Definition: RangeManager.h:573
const RangeBase & getRangeForDim(MSDim dim) const
obtain a range dimension at runtime using dim
Definition: RangeManager.h:725
bool pushIntoUnsafe(const RangeManager< RangeBasesOther... > &rhs)
Definition: RangeManager.h:660
bool clampToUnsafe(const RangeManager< RangeBasesOther... > &rhs)
Definition: RangeManager.h:695
HasRangeType hasRange() const
is any/some/all dimension in this range populated?
Definition: RangeManager.h:753
RangeBase & getRangeForDim(MSDim dim)
obtain a range dimension at runtime using dim
Definition: RangeManager.h:739
bool operator==(const RangeManager &rhs) const
Definition: RangeManager.h:553
void for_each_base_(Visitor &&visitor)
use fold expression to iterate over all RangeBases of RangeManager and apply a lambda (Visitor) for e...
Definition: RangeManager.h:837
void for_each_base_(Visitor &&visitor) const
.. and a const version
Definition: RangeManager.h:843
ThisRangeType & clear(const DIM_UNIT range)
Definition: RangeManager.h:801
void clampTo(const RangeManager< RangeBasesOther... > &rhs)
Definition: RangeManager.h:716
void scaleBy(const double factor)
calls RangeBase::scale() for each dimension
Definition: RangeManager.h:635
void minSpanIfSingular(const double min_span)
If any dimension is a single point, e.g. min==max, then extend this dimension by min_span / 2 on eith...
Definition: RangeManager.h:648
auto & assign(const RangeManager< RangeBasesOther... > &rhs)
Definition: RangeManager.h:593
bool extendUnsafe(const RangeManager< RangeBasesOther... > &rhs)
Definition: RangeManager.h:607
void clearRanges()
Resets all ranges.
Definition: RangeManager.h:794
void printRange(std::ostream &out) const
print each dimension (base classes) to a stream
Definition: RangeManager.h:829
void extend(const RangeManager< RangeBasesOther... > &rhs)
Definition: RangeManager.h:626
bool operator!=(const RangeManager &rhs) const
Definition: RangeManager.h:563
bool containsAll(const RangeManager< RangeBasesOther... > &rhs) const
Definition: RangeManager.h:774
static void static_for_each_base_(Visitor &&visitor)
use fold expression to iterate over all RangeBases of RangeManager and apply a lambda (Visitor) for e...
Definition: RangeManager.h:850
bool contains(T value, T min, T max)
Is a value contained in [min, max] ?
Definition: MathFunctions.h:63
Main OpenMS namespace.
Definition: openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19
std::ostream & operator<<(std::ostream &os, const AccurateMassSearchResult &amsr)
DIM
Definition: DimMapper.h:601
MSDim
Dimensions of data acquisition for MS data.
Definition: RangeManager.h:23
DIM_UNIT
Definition: CommonEnums.h:20
@ IM_VSSC
volt-second per square centimeter (i.e. 1/K_0)
@ INT
intensity
@ FAIMS_CV
FAIMS compensation voltage.
@ RT
RT in seconds.
@ IM_MS
ion mobility milliseconds
HasRangeType
Enum listing state of dimensions (RangeBases)
Definition: RangeManager.h:523
@ ALL
all dimensions are filled
@ SOME
some dimensions are empty, some are filled
@ NONE
all dimensions are empty (=cleared)
Base class for a simple range with minimum and maximum.
Definition: RangeManager.h:37
double max_
Definition: RangeManager.h:279
double getSpan() const
Definition: RangeManager.h:253
RangeBase(const double single)
Cutom C'tor which sets the range to a singular point.
Definition: RangeManager.h:43
RangeBase(const RangeBase &rhs)=default
Copy C'tor.
void setMin(const double min)
sets the minimum (and the maximum, if uninitialized)
Definition: RangeManager.h:113
RangeBase & operator=(RangeBase &&rhs) noexcept=default
Move assignment (seems useless, but is required for completeness in derived classes' move c'tor)
std::pair< double, double > getNonEmptyRange() const
Return the current range, or (if empty) a full range (-1e308, 1e308).
Definition: RangeManager.h:268
void scaleBy(const double factor)
Scale the range of the dimension by a factor. A factor > 1 increases the range; factor < 1 decreases ...
Definition: RangeManager.h:225
RangeBase & operator=(const RangeBase &rhs)=default
Assignment operator.
void minSpanIfSingular(const double min_span)
If the current range is a single point, e.g. min==max, then extend the range by min_span / 2 on eithe...
Definition: RangeManager.h:168
void pushInto(const RangeBase &sandbox)
Definition: RangeManager.h:193
void shift(const double distance)
Definition: RangeManager.h:236
~RangeBase() noexcept=default
D'tor.
bool contains(const double value) const
is value within [min, max]?
Definition: RangeManager.h:94
double center() const
Definition: RangeManager.h:245
RangeBase()=default
C'tor: initialize with empty range.
void extend(const double value)
extend the range such that it includes the given value
Definition: RangeManager.h:147
void extendLeftRight(const double by)
Definition: RangeManager.h:156
RangeBase(RangeBase &&rhs) noexcept=default
Move C'tor (seems useless, but is required for completeness in derived classes' move c'tor)
bool contains(const RangeBase &inner_range) const
is the range inner_range within [min, max]?
Definition: RangeManager.h:100
void clampTo(const RangeBase &other)
Definition: RangeManager.h:179
double getMin() const
only useful if isEmpty() returns false
Definition: RangeManager.h:127
void clear()
make the range empty, i.e. isEmpty() will be true
Definition: RangeManager.h:82
void setMax(const double max)
sets the maximum (and the minimum, if uninitialized)
Definition: RangeManager.h:120
bool isEmpty() const
is the range empty (i.e. min > max)?
Definition: RangeManager.h:88
double min_
Definition: RangeManager.h:278
RangeBase(const double min, const double max)
Definition: RangeManager.h:49
bool operator==(const RangeBase &rhs) const
Definition: RangeManager.h:259
double getMax() const
only useful if isEmpty() returns false
Definition: RangeManager.h:133
void extend(const RangeBase &other)
ensure the range includes the range of other
Definition: RangeManager.h:140
Definition: RangeManager.h:404
void setMinIntensity(const double min)
sets the minimum (and the maximum, if uninitialized)
Definition: RangeManager.h:418
double getMinIntensity() const
only useful if isEmpty() returns false
Definition: RangeManager.h:430
void extendIntensity(const double value)
extend the range such that it includes the given value
Definition: RangeManager.h:443
bool containsIntensity(const double value) const
is value within [min, max]?
Definition: RangeManager.h:449
double getMaxIntensity() const
only useful if isEmpty() returns false
Definition: RangeManager.h:436
bool containsIntensity(const RangeBase &inner_range) const
is the range inner_range within [min, max] of this range?
Definition: RangeManager.h:455
void setMaxIntensity(const double max)
sets the maximum (and the minimum, if uninitialized)
Definition: RangeManager.h:424
Definition: RangeManager.h:345
bool containsMZ(const RangeBase &inner_range) const
is the range inner_range within [min, max] of this range?
Definition: RangeManager.h:396
void setMaxMZ(const double max)
sets the maximum (and the minimum, if uninitialized)
Definition: RangeManager.h:365
void extendMZ(const double value)
extend the range such that it includes the given value
Definition: RangeManager.h:384
void setMinMZ(const double min)
sets the minimum (and the maximum, if uninitialized)
Definition: RangeManager.h:359
double getMaxMZ() const
only useful if isEmpty() returns false
Definition: RangeManager.h:377
double getMinMZ() const
only useful if isEmpty() returns false
Definition: RangeManager.h:371
bool containsMZ(const double value) const
is value within [min, max]?
Definition: RangeManager.h:390
Definition: RangeManager.h:463
bool containsMobility(const double value) const
is value within [min, max]?
Definition: RangeManager.h:507
void extendMobility(const double value)
extend the range such that it includes the given value
Definition: RangeManager.h:501
double getMinMobility() const
only useful if isEmpty() returns false
Definition: RangeManager.h:488
bool containsMobility(const RangeBase &inner_range) const
is the range inner_range within [min, max] of this range?
Definition: RangeManager.h:513
double getMaxMobility() const
only useful if isEmpty() returns false
Definition: RangeManager.h:494
void setMinMobility(const double min)
sets the minimum (and the maximum, if uninitialized)
Definition: RangeManager.h:476
void setMaxMobility(const double max)
sets the maximum (and the minimum, if uninitialized)
Definition: RangeManager.h:482
Definition: RangeManager.h:285
bool containsRT(const RangeBase &inner_range) const
is the range inner_range within [min, max] of this range?
Definition: RangeManager.h:336
void extendRT(const double value)
extend the range such that it includes the given value
Definition: RangeManager.h:324
double getMaxRT() const
only useful if isEmpty() returns false
Definition: RangeManager.h:317
void setMaxRT(const double max)
sets the maximum (and the minimum, if uninitialized)
Definition: RangeManager.h:305
void setMinRT(const double min)
sets the minimum (and the maximum, if uninitialized)
Definition: RangeManager.h:299
double getMinRT() const
only useful if isEmpty() returns false
Definition: RangeManager.h:311
bool containsRT(const double value) const
is value within [min, max]?
Definition: RangeManager.h:330