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

Public Types

typedef Range::size_type size_type
 

Public Member Functions

 RangeParser ()
 
bool run (Range &range, const std::string &text)
 

Private Member Functions

bool skip_spaces (const std::string &text, size_type &pos)
 
bool test_token (const std::string &text, size_type &pos, char token)
 
bool parse_number (const std::string &text, size_type &pos, int &value)
 
bool parse_maximum (Range::field &field, const std::string &text, size_type &pos)
 
bool parse_list (Range::field &field, const std::string &text, size_type &pos)
 
bool parse_field (Range::field &field, const std::string &text, size_type &pos)
 
bool parse (Range &range, const std::string &text, size_type &pos)
 

Detailed Description

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

Member Typedef Documentation

◆ size_type

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

Constructor & Destructor Documentation

◆ RangeParser()

RangeParser::RangeParser ( )
inline

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

48  {
49  }

Member Function Documentation

◆ parse()

bool RangeParser::parse ( Range range,
const std::string &  text,
size_type pos 
)
inlineprivate

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

260  {
261  bool result = true;
262  bool finished = false;
263 
264  if (!skip_spaces (text, pos)) return (true);
265 
266  while (!finished && pos != std::string::npos && pos < text.size())
267  {
268  char c = text[pos];
269 
270  switch (c)
271  {
272  case '0':
273  case '1':
274  case '2':
275  case '3':
276  case '4':
277  case '5':
278  case '6':
279  case '7':
280  case '8':
281  case '9':
282  case '+':
283  case '-':
284  case ':':
285  case '*':
286  {
288  if (!parse_field (field, text, pos))
289  {
290  result = false;
291  finished = true;
292  }
293  else
294  {
295  range.add (field);
296  }
297  }
298  break;
299  case '/':
300  pos++;
301  break;
302  default:
303  finished = true;
304  break;
305  }
306  }
307 
308  return (result);
309  }

◆ parse_field()

bool RangeParser::parse_field ( Range::field field,
const std::string &  text,
size_type pos 
)
inlineprivate

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

192  {
193  bool result = true;
194  int minimum;
195 
196  if (!skip_spaces (text, pos)) return (false);
197 
198  char c = text[pos];
199  switch (c)
200  {
201  case '0':
202  case '1':
203  case '2':
204  case '3':
205  case '4':
206  case '5':
207  case '6':
208  case '7':
209  case '8':
210  case '9':
211  case '+':
212  case '-':
213  if (!parse_number (text, pos, minimum))
214  {
215  result = false;
216  break;
217  }
218  else
219  {
220  field.set_minimum (minimum);
221  result = true;
222 
223  if (test_token (text, pos, ':'))
224  {
225  // max is optional, so we don't want to reset result here RDS 4/02
226  // result = parse_maximum (field, text, pos);
227 
228  // Optionally, look for max
230  }
231  else if (test_token (text, pos, ','))
232  {
233  result = parse_list (field, text, pos);
234  }
235  else
236  {
237  field.set_maximum (minimum);
238  result = true;
239  }
240  }
241 
242  break;
243  case ':':
244  pos++;
246  break;
247  case '*':
248  pos++;
249  result = true;
250  break;
251  default:
252  result = false;
253  break;
254  }
255 
256  return (result);
257  }

◆ parse_list()

bool RangeParser::parse_list ( Range::field field,
const std::string &  text,
size_type pos 
)
inlineprivate

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

143  {
144  bool finished = false;
145  bool result = true;
146  int value;
147 
148  while (!finished)
149  {
150  if (!skip_spaces (text, pos)) return (true);
151 
152  char c = text[pos];
153  switch (c)
154  {
155  case '0':
156  case '1':
157  case '2':
158  case '3':
159  case '4':
160  case '5':
161  case '6':
162  case '7':
163  case '8':
164  case '9':
165  case '+':
166  case '-':
167  if (!parse_number (text, pos, value))
168  {
169  finished = true;
170  result = false;
171  break;
172  }
173  else
174  {
175  field.add_value (value);
176  }
177  break;
178  case ',':
179  pos++;
180  break;
181  default:
182  finished = true;
183  result = true;
184  break;
185  }
186  }
187 
188  return (result);
189  }

◆ parse_maximum()

bool RangeParser::parse_maximum ( Range::field field,
const std::string &  text,
size_type pos 
)
inlineprivate

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

102  {
103  bool result = true;
104  int maximum;
105 
106  if (!skip_spaces (text, pos)) return (false);
107 
108  char c = text[pos];
109  switch (c)
110  {
111  case '0':
112  case '1':
113  case '2':
114  case '3':
115  case '4':
116  case '5':
117  case '6':
118  case '7':
119  case '8':
120  case '9':
121  case '+':
122  case '-':
123  if (!parse_number (text, pos, maximum))
124  {
125  result = false;
126  break;
127  }
128  else
129  {
130  result = true;
131  field.set_maximum (maximum);
132  }
133  break;
134  default:
135  result = false;
136  break;
137  }
138 
139  return (result);
140  }

◆ parse_number()

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

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

81  {
82  if (pos == std::string::npos) return (false);
83 
84  const char& cha = (text.at (pos));
85  const char* ptr = &cha;
86  int items;
87 
88  value = 0;
89 
90  items = sscanf (ptr, "%80d", &value);
91  if (items == 0)
92  {
93  return (false);
94  }
95 
96  pos = text.find_first_not_of ("0123456789+- \t", pos);
97 
98  return (true);
99  }

◆ run()

bool RangeParser::run ( Range range,
const std::string &  text 
)
inline

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

52  {
53  range.clear ();
54  size_type pos = 0;
55  return (parse (range, text, pos));
56  }

◆ skip_spaces()

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

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

61  {
62  pos = text.find_first_not_of (" \t", pos);
63  if (pos == std::string::npos) return (false);
64  return (true);
65  }

◆ test_token()

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

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

68  {
69  if (!skip_spaces (text, pos))return (false);
70 
71  char c = text[pos];
72  if (c != token) return (false);
73 
74  pos++;
75  return (true);
76  }

The documentation for this class was generated from the following file:
get_generator_info.result
result
Definition: get_generator_info.py:21
RangeParser::parse
bool parse(Range &range, const std::string &text, size_type &pos)
Definition: DetectorDescription/Identifier/src/Range.cxx:259
athena.value
value
Definition: athena.py:122
RangeParser::parse_field
bool parse_field(Range::field &field, const std::string &text, size_type &pos)
Definition: DetectorDescription/Identifier/src/Range.cxx:191
ReadOfcFromCool.field
field
Definition: ReadOfcFromCool.py:48
RangeParser::parse_number
bool parse_number(const std::string &text, size_type &pos, int &value)
Definition: DetectorDescription/Identifier/src/Range.cxx:78
RangeParser::size_type
Range::size_type size_type
Definition: DetectorDescription/Identifier/src/Range.cxx:45
RangeParser::parse_maximum
bool parse_maximum(Range::field &field, const std::string &text, size_type &pos)
Definition: DetectorDescription/Identifier/src/Range.cxx:101
RangeParser::skip_spaces
bool skip_spaces(const std::string &text, size_type &pos)
Definition: DetectorDescription/Identifier/src/Range.cxx:60
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
TrigJetMonitorAlgorithm.items
items
Definition: TrigJetMonitorAlgorithm.py:79
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
makeTransCanvas.text
text
Definition: makeTransCanvas.py:11
Range::field
This is the individual specification for the range of one ExpandedIdentifier field.
Definition: DetectorDescription/Identifier/Identifier/Range.h:37
RangeParser::test_token
bool test_token(const std::string &text, size_type &pos, char token)
Definition: DetectorDescription/Identifier/src/Range.cxx:67
python.compressB64.c
def c
Definition: compressB64.py:93
RangeParser::parse_list
bool parse_list(Range::field &field, const std::string &text, size_type &pos)
Definition: DetectorDescription/Identifier/src/Range.cxx:142