24 namespace ARICHTools {
37 std::array<uint8_t, 4>({{
'A',
'B',
'C',
'D'}});
54 static auto isValidSector(
const uint8_t sector) noexcept ->
bool
68 ModuleID_t(
const int8_t sector =
'0',
const int channel = 0) noexcept
84 return ModuleID_t::isValidSector(this->
getSector()) &&
127 rStream <<
id.getSector() <<
static_cast<int>(
id.getChannel());
137 return m_ID == rOther.m_ID;
146 return m_ID != rOther.m_ID;
155 return m_ID < rOther.m_ID;
164 return m_ID <= rOther.m_ID;
173 return m_ID > rOther.m_ID;
182 return m_ID >= rOther.m_ID;
225 namespace PrivateHelperClasses {
242 inline auto isValidChar(
const unsigned char character)
const noexcept
245 return std::isdigit(character);
256 inline auto operator()(
const std::string& rToken)
const ->
int
258 return std::stoi(rToken);
274 inline auto isValidChar(
const unsigned char character)
const noexcept
277 return std::isdigit(character) || (
static_cast<unsigned char>(
'.') == character);
288 inline auto operator()(
const std::string& rToken)
const ->
double
290 return std::stod(rToken);
303 inline auto isValidChar(
const unsigned char character)
const noexcept
306 return std::isdigit(character) || ModuleID_t::isValidSector(character);
320 std::find_if(rToken.begin(), rToken.end(),
321 [](
const char c) { return !std::isspace(c); });
322 const auto end = std::find_if(begin, rToken.end(),
323 [](
const char c) { return std::isspace(c); });
325 if ((begin + 1 == end) || !std::all_of(begin, end, [
this](
const char c) {
326 return this->isValidChar(c);
328 throw std::invalid_argument(
"Invalid argiment for module cast, got: '" +
331 const auto chID = std::stoi(std::string(begin + 1, end));
335 throw std::out_of_range(
"Module ID out of range. got: '" + rToken +
"' !");
364 template <
typename T>
365 static inline auto convert(
const std::string& rLine,
const char delim =
' ')
369 if (!std::all_of(rLine.begin(), rLine.end(),
370 [&cast, delim](
const unsigned char c)
372 return std::isdigit(c) || std::isspace(c) ||
373 (c == delim) || cast.isValidChar(c);
375 throw std::runtime_error(
"Detected invalid character in '" + rLine +
378 auto iss = std::istringstream(rLine);
379 auto retval = std::vector<T>();
380 auto token = std::string();
383 while (std::getline(iss, token, delim))
385 retval.emplace_back(cast(token));
386 }
catch (
const std::invalid_argument& rErr)
388 throw std::runtime_error(
"Invalid token, got:'" + token +
"'! " +
390 }
catch (
const std::out_of_range& rErr)
393 throw std::runtime_error(
"Conversion out of range, got: '" + token +
394 "'! " + rErr.what());
410 template <
typename T>
411 static inline auto parse(
const std::string& rLine,
const char delim =
' ')
413 auto out = std::stringstream();
414 auto iss = std::istringstream(rLine);
415 auto token = std::string();
417 if (!std::getline(iss, token, delim))
418 return std::string();
423 StringToVector::expand<T>(out, delim, token);
429 while (std::getline(iss, token, delim))
435 StringToVector::expand<T>(out, delim, token);
437 out << delim << token;
439 }
catch (
const std::invalid_argument& rErr)
441 throw std::runtime_error(
"Invalid token, got:'" + token +
"'! " +
443 }
catch (
const std::out_of_range& rErr)
446 throw std::runtime_error(
"Conversion out of range, got: '" + token +
447 "'! " + rErr.what());
462 template <
typename T>
463 static inline auto expand(std::ostream& rStream,
const char delim,
464 const std::string& rToken) -> std::ostream& {
465 auto itPos = std::search(rToken.begin(), rToken.end(),
468 auto lhs = cast(std::string(rToken.begin(), itPos));
470 auto rhs = cast(std::string(itPos, rToken.end()));
473 throw std::runtime_error(
474 "Invalid expansion! lhs ist greater then rhs, got: '" + rToken +
478 for (++lhs; lhs <= rhs; ++lhs)
479 rStream << delim << lhs;
494 auto getDeadCutList(
const char chipID,
const std::string& line)
495 -> std::vector<int> {
496 auto ids = StringToVector::convert<int>(line,
',');
497 for (
auto& rID : ids)
498 rID = ModuleID_t(chipID, rID).getNumbering();
514 std::string& remove_nondigit(std::string& s)
517 s.erase(remove_if(s.begin(), s.end(),
518 [](
const unsigned char& c) { return !std::isdigit(c); }),
530 std::string& remove_chars_if_not(std::string& s,
const std::string& allowed)
532 s.erase(remove_if(s.begin(), s.end(),
533 [&allowed](
const char& c) {
534 return allowed.find(c) == std::string::npos;
Abstract base class for different kinds of events.