ROOT  6.06/09
Reference Guide
THistBinIter.h
Go to the documentation of this file.
1 /// \file ROOT/THistBinIter.h
2 /// \ingroup Hist ROOT7
3 /// \author Axel Naumann <axel@cern.ch>
4 /// \ingroup Hist ROOT7
5 /// \date 2015-08-07
6 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback is welcome!
7 
8 /*************************************************************************
9  * Copyright (C) 1995-2015, Rene Brun and Fons Rademakers. *
10  * All rights reserved. *
11  * *
12  * For the licensing terms see $ROOTSYS/LICENSE. *
13  * For the list of contributors see $ROOTSYS/README/CREDITS. *
14  *************************************************************************/
15 
16 #ifndef ROOT7_THistBinIter
17 #define ROOT7_THistBinIter
18 
19 #include <iterator>
20 
21 namespace ROOT {
22 namespace Internal {
23 
24 class THistBinIterBase: public std::iterator<std::random_access_iterator_tag,
25  int /*value*/, int /*distance*/, const int* /*pointer*/, const int& /*ref*/> {
26 
27 protected:
28  /*
29  TODO: How can I prevent splicing and still make it available?
30  ///\{ no splicing
31  THistBinIterBase(const THistBinIterBase &) = default;
32  THistBinIterBase(THistBinIterBase &&) = default;
33  THistBinIterBase &operator=(const THistBinIterBase &) = default;
34  THistBinIterBase &operator=(THistBinIterBase &&) = default;
35  ///\}
36  */
37 
38 public:
39  THistBinIterBase() = default;
40 
41  explicit THistBinIterBase(int idx): fCursor(idx) {}
42 
43  const int* operator*() const noexcept { return &fCursor; }
44  int operator->() const noexcept { return fCursor; }
45 
46  friend bool operator<(THistBinIterBase lhs, THistBinIterBase rhs) noexcept;
47  friend bool operator>(THistBinIterBase lhs, THistBinIterBase rhs) noexcept;
48  friend bool operator<=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept;
49  friend bool operator>=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept;
50  friend bool operator==(THistBinIterBase lhs, THistBinIterBase rhs) noexcept;
51  friend bool operator!=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept;
52 
53  int fCursor;
54 };
55 
56 
57 bool operator<(THistBinIterBase lhs, THistBinIterBase rhs) noexcept {
58  return lhs.fCursor < rhs.fCursor;
59 }
60 
61 bool operator>(THistBinIterBase lhs, THistBinIterBase rhs) noexcept {
62  return lhs.fCursor > rhs.fCursor;
63 }
64 
65 bool operator<=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept {
66  return lhs.fCursor <= rhs.fCursor;
67 }
68 
69 inline bool operator>=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept {
70  return lhs.fCursor >= rhs.fCursor;
71 }
72 
73 inline bool operator==(THistBinIterBase lhs, THistBinIterBase rhs) noexcept {
74  return lhs.fCursor == rhs.fCursor;
75 }
76 
77 inline bool operator!=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept {
78  return lhs.fCursor != rhs.fCursor;
79 }
80 
81 
82 /// A predicate for THistBinIterBase to accept all bins.
84  bool operator()(int) const { return true; }
85 };
86 
87 /// A bin iterator taking a predicate whether it should skip a bin.
88 template <class OUTOFRANGE>
90  private OUTOFRANGE {
91  using OutOfRange_t = OUTOFRANGE;
92  const OutOfRange_t& GetOutOfRange() const { return *this; }
93 public:
94  THistBinIter() = default;
95  THistBinIter(const THistBinIter&) = default;
96  THistBinIter(THistBinIter&&) = default;
97  explicit THistBinIter(int idx, const OUTOFRANGE& oor = OUTOFRANGE()):
98  THistBinIterBase(idx), OutOfRange_t(oor) {}
99 
100  /// ++i
101  THistBinIter &operator++() noexcept {
102  // Could check whether fCursor < fEnd - but what for?
103  do {
104  ++fCursor;
105  } while (GetOutOfRange()(fCursor));
106  return *this;
107  }
108 
109  /// --i
110  THistBinIter &operator--() noexcept {
111  // Could check whether fCursor > fBegin - but what for?
112  do {
113  --fCursor;
114  } while (GetOutOfRange()(fCursor));
115  return *this;
116  }
117 
118  /// i++
119  THistBinIter operator++(int) noexcept {
120  THistBinIter old(*this);
121  ++(*this);
122  return old;
123  }
124 
125  // i--
126  THistBinIter operator--(int) noexcept {
127  THistBinIter old(*this);
128  --(*this);
129  return old;
130  }
131 
132  THistBinIter &operator+=(int d) noexcept {
133  do {
134  ++(*this);
135  --d;
136  } while (d > 0);
137  return *this;
138  }
139 
140  THistBinIter &operator-=(int d) noexcept {
141  do {
142  --(*this);
143  --d;
144  } while (d > 0);
145  return *this;
146  }
147 
148  THistBinIter operator+(int d) noexcept {
149  THistBinIter ret(*this);
150  ret += d;
151  return ret;
152  }
153 
154  THistBinIter operator-(int d) noexcept {
155  THistBinIter ret(*this);
156  ret -= d;
157  return ret;
158  }
159 };
160 } // namespace Internal
161 } // namespace ROOT
162 
163 #endif
const int * operator*() const noexcept
Definition: THistBinIter.h:43
const OutOfRange_t & GetOutOfRange() const
Definition: THistBinIter.h:92
bool operator<(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:57
THistBinIter & operator+=(int d) noexcept
Definition: THistBinIter.h:132
Namespace for new ROOT classes and functions.
Definition: ROOT.py:1
bool operator>(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:61
friend bool operator==(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:73
friend bool operator!=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:77
int operator->() const noexcept
Definition: THistBinIter.h:44
friend bool operator>(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:61
friend bool operator<=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:65
bool operator!=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:77
THistBinIter(int idx, const OUTOFRANGE &oor=OUTOFRANGE())
Definition: THistBinIter.h:97
THistBinIter operator+(int d) noexcept
Definition: THistBinIter.h:148
bool operator==(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:73
friend bool operator>=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:69
THistBinIter operator-(int d) noexcept
Definition: THistBinIter.h:154
A predicate for THistBinIterBase to accept all bins.
Definition: THistBinIter.h:83
THistBinIter & operator--() noexcept
–i
Definition: THistBinIter.h:110
bool operator<=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:65
THistBinIter & operator++() noexcept
++i
Definition: THistBinIter.h:101
friend bool operator<(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:57
THistBinIter operator--(int) noexcept
Definition: THistBinIter.h:126
A bin iterator taking a predicate whether it should skip a bin.
Definition: THistBinIter.h:89
THistBinIter operator++(int) noexcept
i++
Definition: THistBinIter.h:119
THistBinIter & operator-=(int d) noexcept
Definition: THistBinIter.h:140
bool operator>=(THistBinIterBase lhs, THistBinIterBase rhs) noexcept
Definition: THistBinIter.h:69