ATLAS Offline Software
Public Member Functions | Private Attributes | List of all members
Range::identifier_factory Class Reference

This factory is able to generate all possible identifiers, from a
fully bounded Range. More...

#include <Range.h>

Collaboration diagram for Range::identifier_factory:

Public Member Functions

 identifier_factory ()
 
 identifier_factory (const Range &range)
 
 identifier_factory (const identifier_factory &)=default
 
identifier_factoryoperator= (const identifier_factory &other)
 
identifier_factoryoperator= (identifier_factory &&other)
 
void operator++ ()
 
const ExpandedIdentifieroperator* () const
 
bool operator== (const identifier_factory &other) const
 
bool operator!= (const identifier_factory &other) const
 

Private Attributes

std::vector< size_typem_indices
 
ExpandedIdentifier m_id
 
ExpandedIdentifier m_min
 
ExpandedIdentifier m_max
 
const Rangem_range
 

Detailed Description

This factory is able to generate all possible identifiers, from a
fully bounded Range.

The precondition is that the Range used to parameterize the factory
must have all its fields completely bounded.

Definition at line 166 of file DetectorDescription/Identifier/Identifier/Range.h.

Constructor & Destructor Documentation

◆ identifier_factory() [1/3]

Range::identifier_factory::identifier_factory ( )

Definition at line 1746 of file DetectorDescription/Identifier/src/Range.cxx.

1746  : m_range (nullptr)
1747 {
1748 }

◆ identifier_factory() [2/3]

Range::identifier_factory::identifier_factory ( const Range range)

Fill all running identifiers m_id : the current id m_min : the set of low bounds m_max : the set of high bounds

Definition at line 1751 of file DetectorDescription/Identifier/src/Range.cxx.

1751  : m_range (&range)
1752 {
1759  for (Range::size_type i = 0; i < range.fields (); ++i)
1760  {
1763 
1764  m_indices.push_back (0);
1765 
1766  const field& f = range[i];
1767 
1768  switch (f.get_mode ())
1769  {
1771  m_id << 0;
1772  m_min << 0;
1773  m_max << 0;
1774  break;
1776  minimum = f.get_minimum ();
1777  m_id << minimum;
1778  m_min << minimum;
1779  m_max << minimum;
1780  break;
1782  maximum = f.get_maximum ();
1783  m_id << maximum;
1784  m_min << maximum;
1785  m_max << maximum;
1786  break;
1789  minimum = f.get_minimum ();
1790  maximum = f.get_maximum ();
1791  m_id << minimum;
1792  m_min << minimum;
1793  m_max << maximum;
1794  break;
1795  }
1796  }
1797 }

◆ identifier_factory() [3/3]

Range::identifier_factory::identifier_factory ( const identifier_factory )
default

Member Function Documentation

◆ operator!=()

Definition at line 1920 of file DetectorDescription/Identifier/src/Range.cxx.

1921 {
1922  if (m_id != other.m_id) return (true);
1923  return (false);
1924 }

◆ operator*()

const ExpandedIdentifier & Range::identifier_factory::operator* ( ) const

Definition at line 1907 of file DetectorDescription/Identifier/src/Range.cxx.

1908 {
1909  return (m_id);
1910 }

◆ operator++()

void Range::identifier_factory::operator++ ( )

The local range is not exceeded. increase the value then reset the remaining fields.

The current range field was exhausted check the previous one.

Definition at line 1828 of file DetectorDescription/Identifier/src/Range.cxx.

1829 {
1830  if (m_id.fields () == 0) return;
1831 
1832  size_type fields = m_id.fields ();
1833  size_type i = fields - 1;
1834 
1835  //
1836  // Starting from the end, we try to increment the m_id fields
1837  // If at a given position it's not possible (max reached)
1838  // then we move back one pos and try again.
1839  //
1840  // As soon as increment is possible, then the rest of the m_id
1841  // is reset to min values.
1842  //
1843 
1844  for (;;)
1845  {
1846  const field& f = (*m_range)[i];
1847  bool done = false;
1848  element_type value = 0;
1849 
1850  if (f.get_mode () == Range::field::enumerated)
1851  {
1853  index++;
1854  if (index < f.get_indices ())
1855  {
1856  m_indices[i] = index;
1857  value = f.get_value_at (index);
1858  done = true;
1859  }
1860  }
1861  else
1862  {
1863  value = m_id[i];
1864 
1865  if (value < m_max[i])
1866  {
1871  ++value;
1872  done = true;
1873  }
1874  }
1875 
1876  if (done)
1877  {
1878  m_id[i] = value;
1879 
1880  for (++i; i < fields; ++i)
1881  {
1882  m_indices[i] = 0;
1883  m_id[i] = m_min[i];
1884  }
1885 
1886  break;
1887  }
1888 
1894  if (i == 0)
1895  {
1896  m_id.clear ();
1897  break;
1898  }
1899 
1900 
1901  --i;
1902 
1903  }
1904 }

◆ operator=() [1/2]

Range::identifier_factory & Range::identifier_factory::operator= ( const identifier_factory other)

Definition at line 1800 of file DetectorDescription/Identifier/src/Range.cxx.

1801 {
1802  if (&other != this) {
1803  m_indices = other.m_indices;
1804  m_id = other.m_id;
1805  m_min = other.m_min;
1806  m_max = other.m_max;
1807  m_range = other.m_range;
1808  }
1809 
1810  return (*this);
1811 }

◆ operator=() [2/2]

Range::identifier_factory & Range::identifier_factory::operator= ( identifier_factory &&  other)

Definition at line 1814 of file DetectorDescription/Identifier/src/Range.cxx.

1815 {
1816  if (&other != this) {
1817  m_indices = std::move(other.m_indices);
1818  m_id = std::move(other.m_id);
1819  m_min = std::move(other.m_min);
1820  m_max = std::move(other.m_max);
1821  m_range = other.m_range;
1822  }
1823 
1824  return (*this);
1825 }

◆ operator==()

bool Range::identifier_factory::operator== ( const identifier_factory other) const

Definition at line 1913 of file DetectorDescription/Identifier/src/Range.cxx.

1914 {
1915  if (m_id == other.m_id) return (true);
1916  return (false);
1917 }

Member Data Documentation

◆ m_id

ExpandedIdentifier Range::identifier_factory::m_id
private

◆ m_indices

std::vector<size_type> Range::identifier_factory::m_indices
private

◆ m_max

ExpandedIdentifier Range::identifier_factory::m_max
private

◆ m_min

ExpandedIdentifier Range::identifier_factory::m_min
private

◆ m_range

const Range* Range::identifier_factory::m_range
private

The documentation for this class was generated from the following files:
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
Range::element_type
ExpandedIdentifier::element_type element_type
Definition: DetectorDescription/Identifier/Identifier/Range.h:30
Range::field::both_bounded
@ both_bounded
Definition: DetectorDescription/Identifier/Identifier/Range.h:48
index
Definition: index.py:1
Range::maximum
ExpandedIdentifier maximum() const
Definition: DetectorDescription/Identifier/src/Range.cxx:1410
athena.value
value
Definition: athena.py:122
ExpandedIdentifier::fields
size_type fields() const
ReadOfcFromCool.field
field
Definition: ReadOfcFromCool.py:48
Range::identifier_factory::m_range
const Range * m_range
Definition: DetectorDescription/Identifier/Identifier/Range.h:187
Range::identifier_factory::m_indices
std::vector< size_type > m_indices
Definition: DetectorDescription/Identifier/Identifier/Range.h:183
Range::minimum
ExpandedIdentifier minimum() const
min and max ExpandedIdentifiers (if they exist, ie.
Definition: DetectorDescription/Identifier/src/Range.cxx:1371
Range::field::high_bounded
@ high_bounded
Definition: DetectorDescription/Identifier/Identifier/Range.h:47
lumiFormat.i
int i
Definition: lumiFormat.py:92
Range::field::unbounded
@ unbounded
Definition: DetectorDescription/Identifier/Identifier/Range.h:45
Range::identifier_factory::m_max
ExpandedIdentifier m_max
Definition: DetectorDescription/Identifier/Identifier/Range.h:186
Range::identifier_factory::m_min
ExpandedIdentifier m_min
Definition: DetectorDescription/Identifier/Identifier/Range.h:185
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
Range::size_type
ExpandedIdentifier::size_type size_type
Definition: DetectorDescription/Identifier/Identifier/Range.h:31
Range::field::low_bounded
@ low_bounded
Definition: DetectorDescription/Identifier/Identifier/Range.h:46
Range::fields
size_type fields() const
Definition: DetectorDescription/Identifier/Identifier/Range.h:669
Range::identifier_factory::m_id
ExpandedIdentifier m_id
Definition: DetectorDescription/Identifier/Identifier/Range.h:184
DeMoScan.index
string index
Definition: DeMoScan.py:362
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
ExpandedIdentifier::clear
void clear()
Range::field::enumerated
@ enumerated
Definition: DetectorDescription/Identifier/Identifier/Range.h:49