ATLAS Offline Software
IdentifierField.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 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 
21 {
22  public :
25  using element_vector = std::vector <element_type>;
26  using index_vector = std::vector <size_type>;
27  using BoundedRange = std::pair<element_type, element_type>;
30  static constexpr auto invalidValues = element_vector{};
31 
33  none,
38  } ;
39 
41  IdentifierField () = default;
42 
45 
47  IdentifierField (element_type minimum, element_type maximum);
48 
51 
52  //
53  inline bool
56 
57  //
58  inline element_type
59  get_minimum() const {return m_minimum;}
60 
61  //
62  inline std::pair<element_type, element_type>
63  get_minmax() const {
64  return {m_minimum, m_maximum};
65  }
66  //
67  inline element_type
68  get_maximum () const {return m_maximum;}
69  //
70  inline const element_vector&
71  get_values() const {
72  if (isBounded()) return invalidValues;
73  return std::get<element_vector>(m_data);
74  }
78  size_type get_indices () const {return m_size;}
79  const index_vector& get_indexes () const {return m_indexes;}
80  size_type get_bits () const;
83 
85  bool match (element_type value) const;
86 
88  bool overlaps_with (const IdentifierField& other) const;
89 
91  void clear ();
92  void set (element_type minimum, element_type maximum);
94  void set (const element_vector& values);
95  void set (bool wraparound);
96  void set_next (int next);
97  void set_previous (int previous);
99  void operator |= (const IdentifierField& other);
100 
101  operator std::string () const;
102  bool operator == (const IdentifierField& other) const;
103 
104  void show() const;
105 
107  bool check_for_both_bounded();
108 
111  void optimize();
112 
114  inline bool empty() const {return m_empty;}
116  inline bool isBounded() const {return std::holds_alternative<BoundedRange>(m_data);}
117  inline bool isEnumerated() const {return std::holds_alternative<element_vector>(m_data);}
118 
119 private :
120  static constexpr int m_maxNumberOfIndices = 100;
123 
125  void create_index_table();
126  template <class T>
127  T * dataPtr(){return std::get_if<T>(&m_data);}
128  //
131  std::variant<element_vector, BoundedRange> m_data{};
136  bool m_empty{true};
138 };
139 
142  // Only both_bounded and enumerated are valid to calculate the
143  // value.
144  // both_bounded is the more frequent case and so comes first.
145  if (m_empty) return 0;
146  if (const auto * p{std::get_if<BoundedRange>(&m_data)}; p) {
147  if (index >= (size_type) (p->second - p->first + 1)) {
148  throw std::out_of_range("IdentifierField::get_value_at");
149  }
150  return (p->first + index);
151  }
152  return ((std::get<element_vector>(m_data)).at(index));
153 
154 }
155 
156 std::ostream &
157 operator << (std::ostream &out, const IdentifierField &c);
158 std::istream &
159 operator >> (std::istream &in, IdentifierField &c);
160 #endif
fillPileUpNoiseLumi.current
current
Definition: fillPileUpNoiseLumi.py:52
IdentifierField::get_bits
size_type get_bits() const
Definition: IdentifierField.cxx:40
IdentifierField::element_type
ExpandedIdentifier::element_type element_type
Definition: IdentifierField.h:23
IdentifierField::get_minmax
std::pair< element_type, element_type > get_minmax() const
Definition: IdentifierField.h:63
IdentifierField::overlaps_with
bool overlaps_with(const IdentifierField &other) const
Check whether two IdentifierFields overlap.
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:59
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
IdentifierField::m_maxNumberOfIndices
static constexpr int m_maxNumberOfIndices
Definition: IdentifierField.h:120
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
IdentifierField::clear
void clear()
Set methods.
Definition: IdentifierField.cxx:224
IdentifierField::m_maximum
element_type m_maximum
Definition: IdentifierField.h:130
athena.value
value
Definition: athena.py:124
IdentifierField::get_values
const element_vector & get_values() const
Definition: IdentifierField.h:71
IdentifierField::get_maximum
element_type get_maximum() const
Definition: IdentifierField.h:68
IdentifierField::set
void set(element_type minimum, element_type maximum)
Definition: IdentifierField.cxx:237
ExpandedIdentifier.h
IdentifierField::has_both
@ has_both
Definition: IdentifierField.h:36
IdentifierField::m_continuation_mode
continuation_mode m_continuation_mode
Definition: IdentifierField.h:137
IdentifierField::set_next
void set_next(int next)
Definition: IdentifierField.cxx:295
IdentifierField::m_next
element_type m_next
Definition: IdentifierField.h:135
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:805
IdentifierField::set_minimum
void set_minimum(element_type value)
IdentifierField::m_size
size_type m_size
Definition: IdentifierField.h:133
IdentifierField::match
bool match(element_type value) const
The basic match operation.
Definition: IdentifierField.cxx:71
IdentifierField::get_indexes
const index_vector & get_indexes() const
Definition: IdentifierField.h:79
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
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:54
fillPileUpNoiseLumi.next
next
Definition: fillPileUpNoiseLumi.py:52
IdentifierField::empty
bool empty() const
Definition: IdentifierField.h:114
IdentifierField::m_previous
element_type m_previous
Definition: IdentifierField.h:134
IdentifierField::minimum_possible
static constexpr auto minimum_possible
Definition: IdentifierField.h:28
IdentifierField::set_maximum
void set_maximum(element_type value)
IdentifierField::m_minimum
element_type m_minimum
Definition: IdentifierField.h:129
IdentifierField::m_data
std::variant< element_vector, BoundedRange > m_data
Definition: IdentifierField.h:131
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:117
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:25
IdentifierField::none
@ none
Definition: IdentifierField.h:33
IdentifierField::continuation_mode
continuation_mode
Definition: IdentifierField.h:32
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:24
private
#define private
Definition: DetDescrConditionsDict_dict_fixes.cxx:13
IdentifierField::maximum_possible
static constexpr auto maximum_possible
Definition: IdentifierField.h:29
IdentifierField::operator[]
const IdentifierField & operator[](IdentifierField::size_type index) const
IdentifierField::index_vector
std::vector< size_type > index_vector
Definition: IdentifierField.h:26
IdentifierField::dataPtr
T * dataPtr()
Definition: IdentifierField.h:127
IdentifierField::isBounded
bool isBounded() const
Definition: IdentifierField.h:116
IdentifierField::has_wrap_around
@ has_wrap_around
Definition: IdentifierField.h:37
IdentifierField::m_empty
bool m_empty
Definition: IdentifierField.h:136
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
IdentifierField::set
void set(const element_vector &values)
IdentifierField::operator|=
void operator|=(const IdentifierField &other)
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:132
IdentifierField
This is the individual specification for the range of one ExpandedIdentifier IdentifierField.
Definition: IdentifierField.h:21
IdentifierField::BoundedRange
std::pair< element_type, element_type > BoundedRange
Definition: IdentifierField.h:27
IdentifierField::has_next
@ has_next
Definition: IdentifierField.h:34
IdentifierField::get_value_at
element_type get_value_at(size_type index) const
Definition: IdentifierField.h:141
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
IdentifierField::invalidValues
static constexpr auto invalidValues
Definition: IdentifierField.h:30
IdentifierField::has_previous
@ has_previous
Definition: IdentifierField.h:35
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:78
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.