ATLAS Offline Software
Loading...
Searching...
No Matches
MultiRange.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include "GaudiKernel/MsgStream.h"
7
8#include <sstream>
9#include <algorithm> //remove_if
10#include <ranges>
11#include <numeric>
12
13MultiRange::MultiRange (const Range& r, const Range& s) {
14 m_ranges.push_back (r);
15 m_ranges.push_back (s);
16}
17
18//-----------------------------------------------
20 m_ranges.clear ();
21}
22
23//-----------------------------------------------
24void MultiRange::add (const Range& range) {
25 // Add new range ONLY if an equivalent does NOT exist
26 if (std::ranges::find(m_ranges, range) == m_ranges.end()) {
27 m_ranges.push_back(range);
28 }
29}
30
31//-----------------------------------------------
32void MultiRange::add (Range&& range) {
33 // Add new range ONLY if an equivalent does NOT exist
34 if (std::ranges::find(m_ranges, range) == m_ranges.end()) {
35 m_ranges.emplace_back (std::move(range));
36 }
37}
38
39//-----------------------------------------------
41 m_ranges.emplace_back (id);
42}
43
44//-----------------------------------------------
46 // Remove all ranges for which id matches
47 [[maybe_unused]] auto erased = std::erase_if (m_ranges,
48 [&id] (const Range& r) { return r.match(id); });
49}
50
51
52
53//-----------------------------------------------
55 return (m_ranges.back());
56}
57
58//-----------------------------------------------
60 bool result = std::ranges::any_of(m_ranges, [&id](const Range & r){return r.match(id);});
61 return result ? 1:0;
62}
63
64//-----------------------------------------------
66 static const Range null_range;
67 if (index >= m_ranges.size ()) return (null_range);
68 return (m_ranges[index]);
69}
70
71//-----------------------------------------------
73 return (m_ranges.size ());
74}
75
77 return (m_ranges.begin ());
78}
79
81 return (m_ranges.end ());
82}
83
85 size_type init = 0;
86 return std::accumulate(m_ranges.begin(), m_ranges.end(), init,
87 [](size_type a, const Range& b){return a + b.cardinality();});
88}
89
91 // Loop over ranges in MultiRange and calculate hash for each
92 // range
93 size_type init = 0;
94 return std::accumulate(m_ranges.begin(), m_ranges.end(), init,
95 [&id](size_type a, const Range& b){return a + b.cardinalityUpTo(id);});
96}
97
98
99//-----------------------------------------------
101 range_vector::size_type i;
102 range_vector::size_type j;
103 for (i = 0; i < m_ranges.size (); ++i) {
104 const Range& r = m_ranges[i];
105 for (j = i + 1; j < m_ranges.size (); ++j) {
106 const Range& s = m_ranges[j];
107 if (r.overlaps_with (s)) return (true);
108 }
109 }
110 return (false);
111}
112
113//-----------------------------------------------
118
119//-----------------------------------------------
124
125//-----------------------------------------------
127 static const identifier_factory factory(*this);
128 return (factory);
129}
130
131//-----------------------------------------------
133 static const const_identifier_factory factory;
134 return (factory);
135}
136
137//-----------------------------------------------
139 :
140 m_range_it(multirange.m_ranges.begin()),
141 m_range_end(multirange.m_ranges.end()){
142 if (m_range_it == m_range_end)return; // no ranges
146 if (m_range_it != m_range_end) {
147 m_id_fac_it = ConstRangeIterator(*m_range_it).begin();
148 m_id_fac_end = ConstRangeIterator(*m_range_it).end();
150 // Set id
151 m_id = *m_id_fac_it;
152 }
153 }
154}
155
156//-----------------------------------------------
158 if (m_id.fields () == 0) return;
159 m_id.clear();
160 if (m_range_it != m_range_end) {
161 if (m_id_fac_it != m_id_fac_end) {
162 ++m_id_fac_it;
163 }
164 if (m_id_fac_it == m_id_fac_end) {
165 ++m_range_it;
166 if (m_range_it != m_range_end) {
167 m_id_fac_it = ConstRangeIterator(*m_range_it).begin();
168 m_id_fac_end = ConstRangeIterator(*m_range_it).end();
169 }
170 }
171 if (m_id_fac_it != m_id_fac_end) {
172 m_id = *m_id_fac_it;
173 }
174 }
175}
176
177//-----------------------------------------------
181
182//-----------------------------------------------
184 return (m_id == other.m_id);
185}
186
187//-----------------------------------------------
189 :
190 m_range_it(multirange.m_ranges.begin()),
191 m_range_end(multirange.m_ranges.end()){
192
193 if (m_range_it == m_range_end) return; // no ranges
197 if (m_range_it != m_range_end) {
198 m_id_fac_it = ConstRangeIterator(*m_range_it).begin();
199 m_id_fac_end = ConstRangeIterator(*m_range_it).end();
201 // Set id
202 m_id = *m_id_fac_it;
203 }
204 }
205}
206
207//-----------------------------------------------
209 if (m_id.fields () == 0) return;
210 m_id.clear();
211 if (m_range_it != m_range_end) {
212 if (m_id_fac_it != m_id_fac_end) {
213 ++m_id_fac_it;
214 }
215 if (m_id_fac_it == m_id_fac_end) {
216 ++m_range_it;
217 if (m_range_it != m_range_end) {
218 m_id_fac_it = ConstRangeIterator(*m_range_it).begin();
219 m_id_fac_end = ConstRangeIterator(*m_range_it).end();
220 }
221 }
222 if (m_id_fac_it != m_id_fac_end) {
223 m_id = *m_id_fac_it;
224 }
225 }
226}
227
228//-----------------------------------------------
232
233//-----------------------------------------------
235 return (m_id == other.m_id);
236}
237
238
239
240void MultiRange::show (std::ostream& s) const {
241 range_vector::size_type i;
242 for (i = 0; i < m_ranges.size (); ++i) {
243 if (i > 0) s << std::endl;
244 const Range& r = m_ranges[i];
245 r.show (s);
246 }
247}
248
249void MultiRange::show (MsgStream & out) const {
250 std::ostringstream os;
251 show(os);
252 out << os.str();
253}
254
255//-----------------------------------------------
256MultiRange::operator std::string () const {
257 std::string result;
258 range_vector::size_type i{};
259 for ( ; i < m_ranges.size (); ++i){
260 if (i > 0) result += " | ";
261 const Range& r = m_ranges[i];
262 result += (std::string) r;
263 }
264 return (result);
265}
static Double_t a
ConstRangeIterator end() const
ConstRangeIterator begin() const
range_vector::const_iterator m_range_end
Definition MultiRange.h:69
const ExpandedIdentifier & operator*() const
bool operator==(const const_identifier_factory &other) const
range_vector::const_iterator m_range_it
Definition MultiRange.h:68
This factory is able to generate all possible identifiers, from a fully bounded Range.
Definition MultiRange.h:30
range_vector::const_iterator m_range_it
Definition MultiRange.h:46
bool operator==(const identifier_factory &other) const
range_vector::const_iterator m_range_end
Definition MultiRange.h:47
ConstRangeIterator m_id_fac_it
Definition MultiRange.h:44
ConstRangeIterator m_id_fac_end
Definition MultiRange.h:45
const ExpandedIdentifier & operator*() const
ExpandedIdentifier m_id
Definition MultiRange.h:43
void clear()
size_type cardinalityUpTo(const ExpandedIdentifier &id) const
bool has_overlap() const
Check if there are overlaps between any couple of Ranges.
range_vector::const_iterator const_iterator
Definition MultiRange.h:22
identifier_factory factory_end()
const Range & operator[](size_type index) const
Accessors.
void remove_range(const ExpandedIdentifier &id)
Remove a Range made from a single ExpandedIdentifier.
range_vector m_ranges
Definition MultiRange.h:131
size_type cardinality() const
Computes a possible cardinality from all ranges.
const_iterator begin() const
void show(std::ostream &s=std::cout) const
Range & back()
Get the last entered Range.
ExpandedIdentifier::size_type size_type
Definition MultiRange.h:21
identifier_factory factory_begin()
const_iterator end() const
void add(const Range &range)
int match(const ExpandedIdentifier &id) const
Match an identifier.
MultiRange()=default
size_type size() const
A Range describes the possible ranges for the field values of an ExpandedIdentifier.
int r
Definition globals.cxx:22
Definition index.py:1
std::size_t erase_if(T_container &container, T_Func pred)