ATLAS Offline Software
Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
MultiRangeParser Class Reference
Collaboration diagram for MultiRangeParser:

Public Types

typedef MultiRange::size_type size_type
 

Public Member Functions

 MultiRangeParser ()
 
bool run (const std::string &text, MultiRange &multirange)
 

Private Member Functions

bool parse_number (const std::string &text, size_type &pos, int &value)
 
bool parse_field (const std::string &text, size_type &pos)
 
bool parse_fields (const std::string &text, size_type &pos)
 
bool parse (const std::string &text, size_type &pos)
 
bool skip_spaces (const std::string &text, size_type &pos)
 
bool test_token (const std::string &text, size_type &pos, char token)
 

Private Attributes

MultiRangem_multirange
 

Detailed Description

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

Member Typedef Documentation

◆ size_type

Constructor & Destructor Documentation

◆ MultiRangeParser()

MultiRangeParser::MultiRangeParser ( )
inline

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

2116  {
2117  m_multirange = nullptr;
2118  }

Member Function Documentation

◆ parse()

bool MultiRangeParser::parse ( const std::string &  text,
size_type pos 
)
inlineprivate

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

2303  {
2304  bool result = true;
2305  bool finished = false;
2306 
2307  if (!skip_spaces (text, pos)) return (true);
2308 
2309  while (!finished)
2310  {
2311  char c = text[pos];
2312 
2313  switch (c)
2314  {
2315  case '0':
2316  case '1':
2317  case '2':
2318  case '3':
2319  case '4':
2320  case '5':
2321  case '6':
2322  case '7':
2323  case '8':
2324  case '9':
2325  case '+':
2326  case '-':
2327  case ':':
2328  case '*':
2329  m_multirange->add_range ();
2330  if (!parse_fields (text, pos))
2331  {
2332  result = false;
2333  finished = true;
2334  }
2335  break;
2336  case '|':
2337  pos++;
2338  break;
2339  default:
2340  finished = true;
2341  break;
2342  }
2343  }
2344 
2345  return (result);
2346  }

◆ parse_field()

bool MultiRangeParser::parse_field ( const std::string &  text,
size_type pos 
)
inlineprivate

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

2154  {
2155  bool result = true;
2156  int minimum;
2157  int maximum;
2158 
2159  if (!skip_spaces (text, pos)) return (false);
2160 
2161  char c = text[pos];
2162  switch (c)
2163  {
2164  case '0':
2165  case '1':
2166  case '2':
2167  case '3':
2168  case '4':
2169  case '5':
2170  case '6':
2171  case '7':
2172  case '8':
2173  case '9':
2174  case '+':
2175  case '-':
2176  if (true)
2177  {
2178  //
2179  // The current range is considered
2180  //
2181  Range& r = m_multirange->back ();
2182 
2183  if (!parse_number (text, pos, minimum))
2184  {
2185  result = false;
2186  break;
2187  }
2188 
2189  if (test_token (text, pos, ':'))
2190  {
2191  if (!parse_number (text, pos, maximum))
2192  {
2193  r.add_minimum ((MultiRange::element_type) minimum);
2194  }
2195  else
2196  {
2197  r.add ((MultiRange::element_type) minimum,
2198  (MultiRange::element_type) maximum);
2199  }
2200  }
2201  else
2202  {
2203  r.add ((MultiRange::element_type) minimum);
2204  }
2205  }
2206 
2207  break;
2208  case ':':
2209  pos++;
2210  {
2211 
2212  Range& r = m_multirange->back ();
2213 
2214 
2215 
2216  if (!parse_number (text, pos, maximum))
2217 
2218  {
2219 
2220  result = false;
2221 
2222  }
2223 
2224  else
2225 
2226  {
2227 
2228  r.add_maximum ((MultiRange::element_type) maximum);
2229 
2230  }
2231 
2232  }
2233 
2234  break;
2235  case '*':
2236  pos++;
2237  {
2238 
2239  Range& r = m_multirange->back ();
2240 
2241  r.add ();
2242 
2243  }
2244 
2245  break;
2246  default:
2247  result = false;
2248  }
2249 
2250  return (result);
2251  }

◆ parse_fields()

bool MultiRangeParser::parse_fields ( const std::string &  text,
size_type pos 
)
inlineprivate

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

2254  {
2255  bool finished = false;
2256  bool result = true;
2257 
2258  while (!finished)
2259  {
2260  if (!skip_spaces (text, pos))
2261  {
2262  result = false;
2263  break;
2264  }
2265 
2266  char c = text[pos];
2267 
2268  switch (c)
2269  {
2270  case '0':
2271  case '1':
2272  case '2':
2273  case '3':
2274  case '4':
2275  case '5':
2276  case '6':
2277  case '7':
2278  case '8':
2279  case '9':
2280  case '+':
2281  case '-':
2282  case ':':
2283  case '*':
2284  if (!parse_field (text, pos))
2285  {
2286  result = false;
2287  finished = true;
2288  }
2289  break;
2290  case '/':
2291  pos++;
2292  break;
2293  default:
2294  finished = true;
2295  break;
2296  }
2297  }
2298 
2299  return (result);
2300  }

◆ parse_number()

bool MultiRangeParser::parse_number ( const std::string &  text,
size_type pos,
int &  value 
)
inlineprivate

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

2133  {
2134  if (pos == std::string::npos) return (false);
2135 
2136  const char& cha = (text.at (pos));
2137  const char* ptr = &cha;
2138  int items;
2139 
2140  value = 0;
2141 
2142  items = sscanf (ptr, "%80d", &value);
2143  if (items == 0)
2144  {
2145  return (false);
2146  }
2147 
2148  pos = text.find_first_not_of ("0123456789+- \t", pos);
2149 
2150  return (true);
2151  }

◆ run()

bool MultiRangeParser::run ( const std::string &  text,
MultiRange multirange 
)
inline

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

2121  {
2122  m_multirange = &multirange;
2123  multirange.clear ();
2124  size_type pos = 0;
2125  return (parse (text, pos));
2126  }

◆ skip_spaces()

bool MultiRangeParser::skip_spaces ( const std::string &  text,
size_type pos 
)
inlineprivate

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

2349  {
2350  pos = text.find_first_not_of (" \t", pos);
2351  if (pos == std::string::npos) return (false);
2352  return (true);
2353  }

◆ test_token()

bool MultiRangeParser::test_token ( const std::string &  text,
size_type pos,
char  token 
)
inlineprivate

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

2356  {
2357  if (!skip_spaces (text, pos))return (false);
2358 
2359  char c = text[pos];
2360  if (c != token) return (false);
2361 
2362  pos++;
2363  return (true);
2364  }

Member Data Documentation

◆ m_multirange

MultiRange* MultiRangeParser::m_multirange
private

The documentation for this class was generated from the following file:
beamspotman.r
def r
Definition: beamspotman.py:676
get_generator_info.result
result
Definition: get_generator_info.py:21
MultiRangeParser::size_type
MultiRange::size_type size_type
Definition: DetectorDescription/Identifier/src/Range.cxx:2113
MultiRange::clear
void clear()
Modifications.
Definition: DetectorDescription/Identifier/src/Range.cxx:2404
MultiRangeParser::test_token
bool test_token(const std::string &text, size_type &pos, char token)
Definition: DetectorDescription/Identifier/src/Range.cxx:2355
athena.value
value
Definition: athena.py:122
MultiRangeParser::parse_number
bool parse_number(const std::string &text, size_type &pos, int &value)
Definition: DetectorDescription/Identifier/src/Range.cxx:2130
MultiRange::back
Range & back()
Get the last entered Range.
Definition: DetectorDescription/Identifier/src/Range.cxx:2457
MultiRange::element_type
ExpandedIdentifier::element_type element_type
Definition: DetectorDescription/Identifier/Identifier/Range.h:355
TrigJetMonitorAlgorithm.items
items
Definition: TrigJetMonitorAlgorithm.py:79
Range
A Range describes the possible ranges for the field values of an ExpandedIdentifier.
Definition: DetectorDescription/Identifier/Identifier/Range.h:27
MultiRangeParser::parse_fields
bool parse_fields(const std::string &text, size_type &pos)
Definition: DetectorDescription/Identifier/src/Range.cxx:2253
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
MultiRangeParser::parse
bool parse(const std::string &text, size_type &pos)
Definition: DetectorDescription/Identifier/src/Range.cxx:2302
MultiRange::add_range
Range & add_range()
Create a new empty Range that can be adapted afterwards.
Definition: DetectorDescription/Identifier/src/Range.cxx:2449
makeTransCanvas.text
text
Definition: makeTransCanvas.py:11
MultiRangeParser::skip_spaces
bool skip_spaces(const std::string &text, size_type &pos)
Definition: DetectorDescription/Identifier/src/Range.cxx:2348
MultiRangeParser::parse_field
bool parse_field(const std::string &text, size_type &pos)
Definition: DetectorDescription/Identifier/src/Range.cxx:2153
python.compressB64.c
def c
Definition: compressB64.py:93
MultiRangeParser::m_multirange
MultiRange * m_multirange
Definition: DetectorDescription/Identifier/src/Range.cxx:2366