ATLAS Offline Software
dbline.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include <type_traits>
8 
10 #include "GaudiKernel/MsgStream.h"
11 
12 #include <charconv>
13 #include <iostream>
14 #include <string_view>
15 
19 
20 void DBline::reset_data(void) {
21  m_data.clear();
22  m_pos = 0;
23  m_backup.clear();
24 }
27  m_empty = false;
28 }
29 void DBline::reset(void) {
30  reset_data();
31  reset_status();
32 }
33 
37 
41  if (!m_backup.empty()) {
42  m_data = std::move(m_backup);
43  m_backup.clear();
44  }
45 }
46 
50 
52  const size_t pos = m_data.find('#');
53  if (pos != std::string::npos) m_data.erase(pos);
54 }
55 
56 void DBline::GetToken(size_t pos, std::string_view token) {
58  m_data.erase(pos, token.length());
59  m_pos = pos;
60 }
61 
62 void DBline::GetLine(std::istream& input) {
63  if (!check_data()) {
64  MsgStream log(Athena::getMessageSvc(true), "DBline");
65  log << MSG::WARNING << "line " << std::setw(4) << m_line << " -|" << m_data.c_str() << " .. not understood!" << endmsg;
66  }
67  reset();
68  if (input.eof()) {
69  m_fail = true;
70  return;
71  }
72  m_line++;
73  std::getline(input, m_data);
74  erase_comment();
75  check_data();
76  if (input.eof()) m_fail = true;
77 }
78 
82 
83 template <class type> void DBline::GetValue(type& value) {
84  if (!m_extraction || m_fail) return;
85  const size_t start = m_data.find_first_not_of(' ', m_pos);
86  if (start == std::string::npos) {
87  BadExtraction();
88  return;
89  }
90  size_t stop = m_data.find_first_of(' ', start + 1);
91  if (stop == std::string::npos) stop = m_data.size();
92 
93  if constexpr(std::is_unsigned_v<type>) {
94  unsigned long temp = std::stoul(m_data.substr(start, stop - start), nullptr, m_base);
95  value = temp;
96  } else {
97  int temp = std::stoi(m_data.substr(start, stop - start), nullptr, m_base);
98  value = temp;
99  }
100  m_data.erase(m_pos, stop - m_pos);
101  check_data();
102 }
103 
104 void DBline::GetValue(std::string& value) {
105  if (!m_extraction || m_fail) return;
106  const size_t start = m_data.find_first_not_of(' ', m_pos);
107  if (start == std::string::npos) {
108  BadExtraction();
109  return;
110  }
111  size_t stop = m_data.find_first_of(' ', start + 1);
112  if (stop == std::string::npos) stop = m_data.size();
113 
114  value = m_data.substr(start, stop - start);
115 
116  m_data.erase(m_pos, stop - m_pos);
117  check_data();
118 }
119 
120 void DBline::GetStr(std::string& str) {
121  GetValue(str);
123  if (pos == no_quote) { return; }
124  if (pos == begin_quote) {
125  const size_t pos = m_data.find('"', m_pos);
126  if (pos == std::string::npos) {
127  str.clear();
128  BadExtraction();
129  return;
130  }
131  str.append(m_data, m_pos, pos);
132  m_data.erase(m_pos, (pos - m_pos) + 1);
133  } else {
134  str.clear();
135  BadExtraction();
136  }
137 }
138 
139 DBline::quote DBline::check_quote(std::string& str) const {
140  const size_t pos = str.find('"');
141  if (pos == std::string::npos)
142  return no_quote;
143  else if (pos == 0) {
144  str.erase(0, 1);
145  return begin_quote;
146  } else if (pos == str.length() - 1) {
147  str.erase(pos, 1);
148  return end_quote;
149  }
150  return error;
151 }
152 
156 
157 void DBline::connect(std::ifstream& file) {
158  if ((&file) != m_file) {
159  m_line = 0;
160  m_fail = 0;
161  m_stream = nullptr;
162  m_file = &file;
163  }
164 }
165 
166 void DBline::connect(std::istream& stream) {
167  if ((&stream) != m_stream) {
168  m_line = 0;
169  m_fail = 0;
170  m_file = nullptr;
171  m_stream = &stream;
172  }
173 }
174 
178 
179 DBline& DBline::token(std::string_view token) {
181  if (check_data()) {
182  BadExtraction();
183  return *this;
184  }
185  const size_t pos = m_data.find(token);
186 
187  if (pos != std::string::npos) {
188  const size_t finalpos = pos + token.length();
189  char prev = (pos) ? m_data[pos - 1] : ' ';
190  char foll = (finalpos < m_data.length()) ? m_data[finalpos] : ' ';
191  if (prev == ' ' && foll == ' ')
192  GetToken(pos, token);
193  else
194  BadExtraction();
195  } else
196  BadExtraction();
197  return *this;
198 }
199 
200 template <class type> DBline& DBline::token(std::string_view str, type t) {
201  const size_t pos = str.find('#');
202  if (pos != std::string::npos) {
203  const std::string rep = std::to_string(t);
204 
205  std::string new_token{str};
206  new_token.replace(pos, rep.length(), rep);
207  token(new_token);
208  } else
209  token(str);
210 
211  return *this;
212 }
213 
214 template <class type> DBline& DBline::token(std::string_view str, type t, int /*size*/) {
215  const size_t pos = str.find('#');
216  if (pos != std::string::npos) {
217  std::ostringstream rep;
218  rep << std::setw(2) << std::setfill('0') << t;
219 
220  std::string new_token{str};
221  new_token.replace(pos, rep.str().length(), rep.str());
222  token(new_token);
223  } else
224  token(str);
225 
226  return *this;
227 }
228 
229 void DBline::go_until(std::string_view token) {
230  if (m_file) do
231  GetLine(*m_file);
232  while (m_data.find(token) == std::string::npos);
233  if (m_stream) do
234  GetLine(*m_stream);
235  while (m_data.find(token) == std::string::npos);
236 }
237 
242  m_base = 10;
243  flags(m_default);
244  return *this;
245 }
246 
250 
251 DBline& DBline::operator>>(std::string& str) {
252  GetStr(str);
253  return *this;
254 }
256  GetValue(i);
257  return *this;
258 }
260  GetValue(i8);
261  return *this;
262 }
264  GetValue(i16);
265  return *this;
266 }
268  GetValue(i32);
269  return *this;
270 }
272  GetValue(i64);
273  return *this;
274 }
275 
279 
281  flags(f.flags());
282  const std::ios_base::fmtflags fmt = f.flags() & std::ios_base::basefield;
283  switch (fmt) {
284  case std::ios::hex: m_base = 16; break;
285  case std::ios::oct: m_base = 8; break;
286  default: m_base = 10;
287  }
288  return *this;
289 }
290 
294 
295 DBline& DBline::operator>>(std::string_view token) {
296  if (!m_extraction || check_data() || m_fail) return *this;
297  const size_t pos = m_data.find(token, m_pos);
298  if (pos != std::string::npos)
299  GetToken(pos, token);
300  else
301  BadExtraction();
302  return *this;
303 }
304 
308 
310  if (m_file) GetLine(*m_file);
311  if (m_stream) GetLine(*m_stream);
312  return *this;
313 }
314 
316  for (int j = -1; j < i; j++) {
317  if (m_file) GetLine(*m_file);
318  if (m_stream) GetLine(*m_stream);
319  }
320  return *this;
321 }
322 
324  for (int j = 0; j < i; j++) {
325  if (m_file) GetLine(*m_file);
326  if (m_stream) GetLine(*m_stream);
327  }
328  return *this;
329 }
330 
334 
335 DBline::operator bool() { return !(m_fail | !static_cast<bool>(m_extraction)); }
336 bool DBline::operator!() { return m_fail | !static_cast<bool>(m_extraction); }
337 DBline::operator DBstatus() { return m_extraction; }
338 
342 
343 DBline& DBline::operator()(std::string_view str) {
344  token(str);
345  return *this;
346 }
347 
348 DBline& DBline::operator()(std::string_view str, int n) {
349  token(str, n);
350  return *this;
351 }
352 
353 DBline& DBline::operator()(std::string_view str, int n, int s) {
354  token(str, n, s);
355  return *this;
356 }
357 
359 
361  this->unsetf(std::ios::skipws | std::ios::left | std::ios::right | std::ios::internal | std::ios::oct | std::ios::hex |
362  std::ios::showbase | std::ios::showpoint | std::ios::uppercase | std::ios::scientific | std::ios::fixed |
363  std::ios::showpos | std::ios::boolalpha);
364  m_default = flags();
365  m_dbfmt_hex.setf(std::ios::hex, std::ios::basefield);
366  m_dbfmt_oct.setf(std::ios::oct, std::ios::basefield);
367  m_dbfmt_dec.setf(std::ios::dec, std::ios::basefield);
368 }
369 
370 DBline::DBline(std::ifstream& file) :
371  DBline() {
372  m_file = &file;
373 }
374 
375 DBline::DBline(std::istream& stream) :
376  DBline() {
377  m_stream = &stream;
378 }
379 
380 DBline& DBline::operator<<(std::ifstream& file) {
381  connect(file);
382  GetLine(file);
383  return *this;
384 }
385 
386 DBline& DBline::operator<<(std::istream& input) {
387  connect(input);
388  GetLine(input);
389  return *this;
390 }
391 
395 
396 std::ifstream& operator>>(std::ifstream& file, DBline& db) {
397  db.connect(file);
398  db.GetLine(file);
399  return file;
400 }
401 
402 std::istream& operator>>(std::istream& stream, DBline& db) {
403  db.connect(stream);
404  db.GetLine(stream);
405  return stream;
406 }
407 
408 std::ostream& operator<<(std::ostream& stream, DBline& db) {
409  stream << db.m_data;
410  return stream;
411 }
412 
414  if (s1 || s2) return extracted;
415  return not_extracted;
416 }
417 
419  if (s1 && s2) return extracted;
420  return not_extracted;
421 }
422 
424  this->setf(std::ios::unitbuf | std::ios::dec);
425  this->unsetf(std::ios::skipws | std::ios::left | std::ios::right | std::ios::internal | std::ios::oct | std::ios::hex |
426  std::ios::showbase | std::ios::showpoint | std::ios::uppercase | std::ios::scientific | std::ios::fixed |
427  std::ios::showpos | std::ios::boolalpha);
428 }
ReadCellNoiseFromCoolCompare.s1
s1
Definition: ReadCellNoiseFromCoolCompare.py:378
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
DBline::m_stream
std::istream * m_stream
Definition: dbline.h:261
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
DBline::end_quote
@ end_quote
Definition: dbline.h:257
DBline::m_base
int m_base
Definition: dbline.h:268
getMessageSvc.h
singleton-like access to IMessageSvc via open function and helper
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
DBline::m_line
int m_line
Definition: dbline.h:264
DBline::check_quote
quote check_quote(std::string &) const
Definition: dbline.cxx:139
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
DBline::m_backup
std::string m_backup
Definition: dbline.h:262
AthenaPoolTestRead.flags
flags
Definition: AthenaPoolTestRead.py:8
make_hlt_rep.rep
rep
Definition: make_hlt_rep.py:32
DBfmt
Definition: dbline.h:250
CaloCondBlobAlgs_fillNoiseFromASCII.db
db
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:43
DBline::operator<<
DBline & operator<<(std::istream &input)
Definition: dbline.cxx:386
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:14
DBline::GetValue
void GetValue(type &value)
Definition: dbline.cxx:83
athena.value
value
Definition: athena.py:122
operator&
DBstatus operator&(DBstatus s1, DBstatus s2)
Definition: dbline.cxx:418
PixelModuleFeMask_create_db.stop
int stop
Definition: PixelModuleFeMask_create_db.py:76
DBline::m_data
std::string m_data
Definition: dbline.h:262
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
DBline::check_data
bool check_data(void)
Definition: dbline.h:364
DBline::m_fail
bool m_fail
Definition: dbline.h:265
DBline::m_dbfmt_dec
DBfmt m_dbfmt_dec
Definition: dbline.h:296
DBline::operator()
DBline & operator()(std::string_view)
Definition: dbline.cxx:343
DBline::reset_status
void reset_status(void)
Definition: dbline.cxx:25
AthenaPoolTestWrite.stream
string stream
Definition: AthenaPoolTestWrite.py:12
DBline::m_default
std::ios::fmtflags m_default
Definition: dbline.h:259
DBline::token
DBline & token(std::string_view)
Definition: dbline.cxx:179
Athena::getMessageSvc
IMessageSvc * getMessageSvc(bool quiet=false)
Definition: getMessageSvc.cxx:20
not_extracted
@ not_extracted
Definition: dbline.h:248
DBline::reset_data
void reset_data(void)
Definition: dbline.cxx:20
DBline::DBline
DBline()
Definition: dbline.cxx:360
DBline::quote
enum DBline::exist_quote quote
extracted
@ extracted
Definition: dbline.h:248
DBline::reset
void reset(void)
Definition: dbline.cxx:29
DBline::operator++
DBline & operator++()
Definition: dbline.cxx:309
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
DBline::m_empty
bool m_empty
Definition: dbline.h:266
lumiFormat.i
int i
Definition: lumiFormat.py:92
beamspotman.n
n
Definition: beamspotman.py:731
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
DBline::BadExtraction
void BadExtraction(void)
Definition: dbline.cxx:39
DBline::no_quote
@ no_quote
Definition: dbline.h:257
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
file
TFile * file
Definition: tile_monitor.h:29
DBline::GetToken
void GetToken(size_t pos, std::string_view token)
Definition: dbline.cxx:56
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
DBline::m_pos
unsigned long int m_pos
Definition: dbline.h:263
DBline::GetLine
void GetLine(std::istream &input)
Definition: dbline.cxx:62
DBline::operator!
bool operator!()
Definition: dbline.cxx:336
DBline::m_dbfmt_hex
DBfmt m_dbfmt_hex
Definition: dbline.h:294
DBline::m_dbfmt_oct
DBfmt m_dbfmt_oct
Definition: dbline.h:295
DBline::GoodExtraction
void GoodExtraction(void)
Definition: dbline.cxx:38
DBline::m_file
std::ifstream * m_file
Definition: dbline.h:260
DBline::begin_quote
@ begin_quote
Definition: dbline.h:257
operator<<
std::ostream & operator<<(std::ostream &stream, DBline &db)
Definition: dbline.cxx:408
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
DBline::reset_fmt
DBline & reset_fmt(void)
Definition: dbline.cxx:241
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
DBline::m_extraction
DBstatus m_extraction
Definition: dbline.h:267
fmt
DBline
Definition: dbline.h:255
DBline::erase_comment
void erase_comment(void)
Definition: dbline.cxx:51
DBline::connect
void connect(std::ifstream &file)
Definition: dbline.cxx:157
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DBline::go_until
void go_until(std::string_view token)
Definition: dbline.cxx:229
DBline::error
@ error
Definition: dbline.h:257
ReadCellNoiseFromCoolCompare.s2
s2
Definition: ReadCellNoiseFromCoolCompare.py:379
dbline.h
DBfmt::DBfmt
DBfmt()
Definition: dbline.cxx:423
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
DBline::operator+
DBline & operator+(int i)
Definition: dbline.cxx:323
str
Definition: BTagTrackIpAccessor.cxx:11
operator|
DBstatus operator|(DBstatus s1, DBstatus s2)
Definition: dbline.cxx:413
DBstatus
enum result_extraction DBstatus
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
DBline::GetStr
void GetStr(std::string &)
Definition: dbline.cxx:120
operator>>
std::ifstream & operator>>(std::ifstream &file, DBline &db)
Definition: dbline.cxx:396
DBline::operator>>
DBline & operator>>(std::string &str)
Definition: dbline.cxx:251
python.CaloEstimatedGainTool_test.i32
def i32(x)
Definition: CaloEstimatedGainTool_test.py:16