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