ATLAS Offline Software
IdentifierField.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef IDENTIFIER_IDENTIFIERFIELD_H
6 #define IDENTIFIER_IDENTIFIERFIELD_H
8 #include <vector>
9 #include <string>
10 #include <stdexcept>
11 #include <iosfwd>
12 #include <limits>
13 #include <utility>
14 #include <variant>
15 
16 
83 {
84  public :
87  using element_vector = std::vector <element_type>;
88  using index_vector = std::vector <size_type>;
89  using BoundedRange = std::pair<element_type, element_type>;
92  static constexpr auto invalidValues = element_vector{};
93 
95  none,
100  } ;
101 
103  IdentifierField () = default;
104 
107 
109  IdentifierField (element_type minimum, element_type maximum);
110 
113 
114  //
115  inline bool
118 
119  //
120  inline element_type
121  get_minimum() const {return m_minimum;}
122 
123  //
124  inline std::pair<element_type, element_type>
125  get_minmax() const {
126  return {m_minimum, m_maximum};
127  }
128  //
129  inline element_type
130  get_maximum () const {return m_maximum;}
131  //
132  inline const element_vector&
133  get_values() const {
134  if (isBounded()) return invalidValues;
135  return std::get<element_vector>(m_data);
136  }
140  size_type get_indices () const {return m_size;}
141  const index_vector& get_indexes () const {return m_indexes;}
143  size_type get_bits () const;
146 
149  bool match (element_type value) const;
150 
153  bool overlaps_with (const IdentifierField& other) const;
154 
156  void clear ();
157  void set (element_type minimum, element_type maximum);
158  void add_value (element_type value);
159  void set (const element_vector& values);
160  void set (bool wraparound);
161  void set_next (int next);
162  void set_previous (int previous);
166  void operator |= (const IdentifierField& other);
167 
168  operator std::string () const;
169  bool operator == (const IdentifierField& other) const;
170 
171  void show() const;
172 
174  bool check_for_both_bounded();
175 
178  void optimize();
179 
182  inline bool empty() const {return m_empty;}
184  inline bool isBounded() const {return std::holds_alternative<BoundedRange>(m_data);}
185  inline bool isEnumerated() const {return std::holds_alternative<element_vector>(m_data);}
186 
187 private :
188  static constexpr int m_maxNumberOfIndices = 100;
191 
193  void create_index_table();
194  template <class T>
195  T * dataPtr(){return std::get_if<T>(&m_data);}
196  //
199  std::variant<element_vector, BoundedRange> m_data{};
204  bool m_empty{true};
206 };
207 
210  // Only both_bounded and enumerated are valid to calculate the
211  // value.
212  // both_bounded is the more frequent case and so comes first.
213  if (m_empty) return 0;
214  if (const auto * p{std::get_if<BoundedRange>(&m_data)}; p) {
215  if (index >= (size_type) (p->second - p->first + 1)) {
216  throw std::out_of_range("IdentifierField::get_value_at");
217  }
218  return (p->first + index);
219  }
220  return ((std::get<element_vector>(m_data)).at(index));
221 
222 }
223 
224 std::ostream &
225 operator << (std::ostream &out, const IdentifierField &c);
226 std::istream &
227 operator >> (std::istream &in, IdentifierField &c);
228 #endif
fillPileUpNoiseLumi.current
current
Definition: fillPileUpNoiseLumi.py:52
IdentifierField::get_bits
size_type get_bits() const
Return the number of bits needed to store a value of this field.
Definition: IdentifierField.cxx:40
IdentifierField::element_type
ExpandedIdentifier::element_type element_type
Definition: IdentifierField.h:85
IdentifierField::get_minmax
std::pair< element_type, element_type > get_minmax() const
Definition: IdentifierField.h:125
IdentifierField::overlaps_with
bool overlaps_with(const IdentifierField &other) const
Check whether two IdentifierFields overlap (Are there any values which satisfy the constraints of bot...
Definition: IdentifierField.cxx:194
index
Definition: index.py:1
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
IdentifierField::get_minimum
element_type get_minimum() const
Query the values.
Definition: IdentifierField.h:121
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
IdentifierField::m_maxNumberOfIndices
static constexpr int m_maxNumberOfIndices
Definition: IdentifierField.h:188
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:70
IdentifierField::clear
void clear()
Set methods.
Definition: IdentifierField.cxx:224
IdentifierField::m_maximum
element_type m_maximum
Definition: IdentifierField.h:198
athena.value
value
Definition: athena.py:124
IdentifierField::get_values
const element_vector & get_values() const
Definition: IdentifierField.h:133
IdentifierField::get_maximum
element_type get_maximum() const
Definition: IdentifierField.h:130
IdentifierField::set
void set(element_type minimum, element_type maximum)
Definition: IdentifierField.cxx:237
ExpandedIdentifier.h
IdentifierField::has_both
@ has_both
Definition: IdentifierField.h:98
IdentifierField::m_continuation_mode
continuation_mode m_continuation_mode
Definition: IdentifierField.h:205
IdentifierField::set_next
void set_next(int next)
Definition: IdentifierField.cxx:295
IdentifierField::m_next
element_type m_next
Definition: IdentifierField.h:203
IdentifierField::create_index_table
void create_index_table()
Create index table from value table.
Definition: IdentifierField.cxx:444
python.Bindings.values
values
Definition: Control/AthenaPython/python/Bindings.py:808
IdentifierField::set_minimum
void set_minimum(element_type value)
IdentifierField::m_size
size_type m_size
Definition: IdentifierField.h:201
IdentifierField::match
bool match(element_type value) const
The basic match operation Given a value, test to see if it satisfies the constraints for this field.
Definition: IdentifierField.cxx:71
IdentifierField::get_indexes
const index_vector & get_indexes() const
Definition: IdentifierField.h:141
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:209
IdentifierField::get_value_index
size_type get_value_index(element_type value) const
Definition: IdentifierField.cxx:49
IdentifierField::operator==
bool operator==(const IdentifierField &other) const
Definition: IdentifierField.cxx:368
IdentifierField::wrap_around
bool wrap_around() const
Definition: IdentifierField.h:116
fillPileUpNoiseLumi.next
next
Definition: fillPileUpNoiseLumi.py:52
IdentifierField::empty
bool empty() const
If true, this field does not have any constraints, and may hold any value representable by element_ty...
Definition: IdentifierField.h:182
IdentifierField::m_previous
element_type m_previous
Definition: IdentifierField.h:202
IdentifierField::minimum_possible
static constexpr auto minimum_possible
Definition: IdentifierField.h:90
IdentifierField::set_maximum
void set_maximum(element_type value)
IdentifierField::m_minimum
element_type m_minimum
Definition: IdentifierField.h:197
IdentifierField::m_data
std::variant< element_vector, BoundedRange > m_data
Definition: IdentifierField.h:199
IdentifierField::get_next
bool get_next(element_type current, element_type &next) const
Definition: IdentifierField.cxx:149
IdentifierField::isEnumerated
bool isEnumerated() const
Definition: IdentifierField.h:185
ExpandedIdentifier::size_type
boost::container::small_vector< element_type, 12 >::size_type size_type
Definition: DetectorDescription/Identifier/Identifier/ExpandedIdentifier.h:112
IdentifierField::element_vector
std::vector< element_type > element_vector
Definition: IdentifierField.h:87
IdentifierField::none
@ none
Definition: IdentifierField.h:95
IdentifierField::continuation_mode
continuation_mode
Definition: IdentifierField.h:94
IdentifierField::set_previous
void set_previous(int previous)
Definition: IdentifierField.cxx:307
IdentifierField::check_for_both_bounded
bool check_for_both_bounded()
Check mode - switch from enumerated to both_bounded if possible.
Definition: IdentifierField.cxx:430
IdentifierField::size_type
ExpandedIdentifier::size_type size_type
Definition: IdentifierField.h:86
IdentifierField::maximum_possible
static constexpr auto maximum_possible
Definition: IdentifierField.h:91
IdentifierField::index_vector
std::vector< size_type > index_vector
Definition: IdentifierField.h:88
IdentifierField::dataPtr
T * dataPtr()
Definition: IdentifierField.h:195
IdentifierField::isBounded
bool isBounded() const
Definition: IdentifierField.h:184
IdentifierField::has_wrap_around
@ has_wrap_around
Definition: IdentifierField.h:99
IdentifierField::m_empty
bool m_empty
Definition: IdentifierField.h:204
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
IdentifierField::set
void set(const element_vector &values)
IdentifierField::operator|=
void operator|=(const IdentifierField &other)
Find the union of two fields.
Definition: IdentifierField.cxx:319
operator<<
std::ostream & operator<<(std::ostream &out, const IdentifierField &c)
Definition: IdentifierField.cxx:476
IdentifierField::m_indexes
index_vector m_indexes
Definition: IdentifierField.h:200
IdentifierField
This is the individual specification for the range of one ExpandedIdentifier IdentifierField.
Definition: IdentifierField.h:83
IdentifierField::BoundedRange
std::pair< element_type, element_type > BoundedRange
Definition: IdentifierField.h:89
IdentifierField::has_next
@ has_next
Definition: IdentifierField.h:96
IdentifierField::get_value_at
element_type get_value_at(size_type index) const
Definition: IdentifierField.h:209
IdentifierField::get_previous
bool get_previous(element_type current, element_type &previous) const
Returns false if previous/next is at end of range, or not possible.
Definition: IdentifierField.cxx:106
private
#define private
Definition: xAODTruthCnvAlg.h:20
IdentifierField::invalidValues
static constexpr auto invalidValues
Definition: IdentifierField.h:92
IdentifierField::has_previous
@ has_previous
Definition: IdentifierField.h:97
IdentifierField::show
void show() const
Definition: IdentifierField.cxx:376
IdentifierField::optimize
void optimize()
Optimize - try to switch mode to both_bounded, set up lookup table for finding index from value.
Definition: IdentifierField.cxx:422
ExpandedIdentifier::element_type
int element_type
Definition: DetectorDescription/Identifier/Identifier/ExpandedIdentifier.h:106
operator>>
std::istream & operator>>(std::istream &in, IdentifierField &c)
Definition: IdentifierField.cxx:483
python.compressB64.c
def c
Definition: compressB64.py:93
IdentifierField::add_value
void add_value(element_type value)
Definition: IdentifierField.cxx:250
IdentifierField::get_indices
size_type get_indices() const
Definition: IdentifierField.h:140
TSU::T
unsigned long long T
Definition: L1TopoDataTypes.h:35
Trk::previous
@ previous
Definition: BinningData.h:32
IdentifierField::IdentifierField
IdentifierField()=default
Create a wild-card value.