13#ifndef ML_STRING_SWITCH_H
14#define ML_STRING_SWITCH_H
50template<
typename T,
typename R = T>
68 && N-1 == _string.size()
69 && (std::memcmp(s, _string.c_str(), N-1) == 0))
79 if (!_result && s == _string)
92 && _string.size() >= N-1
93 && std::memcmp(s, _string.c_str() + _string.size() + 1 - N, N-1) == 0)
105 && _string.size() >= N-1
106 && std::memcmp(s, _string.c_str(), N-1) == 0)
114 template<
unsigned N0,
unsigned N1>
117 return Case(S0, Value).
Case(S1, Value);
120 template<
unsigned N0,
unsigned N1,
unsigned N2>
121 StringSwitch&
Cases(
const char (&S0)[N0],
const char (&S1)[N1],
const char (&S2)[N2],
const T& Value)
123 return Case(S0, Value).
Case(S1, Value).
Case(S2, Value);
126 template<
unsigned N0,
unsigned N1,
unsigned N2,
unsigned N3>
127 StringSwitch&
Cases(
const char (&S0)[N0],
const char (&S1)[N1],
const char (&S2)[N2],
const char (&S3)[N3],
const T& Value)
129 return Case(S0, Value).
Case(S1, Value).
Case(S2, Value).
Case(S3, Value);
132 template<
unsigned N0,
unsigned N1,
unsigned N2,
unsigned N3,
unsigned N4>
133 StringSwitch&
Cases(
const char (&S0)[N0],
const char (&S1)[N1],
const char (&S2)[N2],
const char (&S3)[N3],
const char (&S4)[N4],
const T& Value)
135 return Case(S0, Value).
Case(S1, Value).
Case(S2, Value).
Case(S3, Value).
Case(S4, Value);
147 template<
typename Ex,
typename ExP1>
157 template<
typename Ex,
typename ExP1,
typename ExP2>
158 R
Throw(
const ExP1& p1,
const ExP2& p2)
const
167 template<
typename Ex,
typename ExP1,
typename ExP2,
typename ExP3>
168 R
Throw(
const ExP1& p1,
const ExP2& p2,
const ExP3& p3)
const
174 throw Ex(p1, p2, p3);
181 throw std::domain_error(
"Fell off the end of the string switch");
187 const std::string _string;
StringSwitch & Cases(const char(&S0)[N0], const char(&S1)[N1], const char(&S2)[N2], const char(&S3)[N3], const char(&S4)[N4], const T &Value)
StringSwitch & Cases(const char(&S0)[N0], const char(&S1)[N1], const T &Value)
StringSwitch(const std::string &s)
StringSwitch(const char *s)
StringSwitch & StartsWith(const char(&s)[N], const T &Value)
StringSwitch & Cases(const char(&S0)[N0], const char(&S1)[N1], const char(&S2)[N2], const T &Value)
StringSwitch & EndsWith(const char(&s)[N], const T &Value)
StringSwitch & Case(const char(&s)[N], const T &Value)
R Throw(const ExP1 &p1, const ExP2 &p2) const
R Default(const T &Value) const
StringSwitch & Cases(const char(&S0)[N0], const char(&S1)[N1], const char(&S2)[N2], const char(&S3)[N3], const T &Value)
StringSwitch & Case(const std::string &s, const T &Value)
R Throw(const ExP1 &p1) const
R Throw(const ExP1 &p1, const ExP2 &p2, const ExP3 &p3) const