ribi::Chess::Castling ribi::Chess::StrToCastling(const std::string& s)
{
  assert(CanStrToCastling(s));
  if (s.substr(0,3) == "O-O"   || s.substr(0,3) == "0-0"  ) return Castling::kingside;
  if (s.substr(0,5) == "O-O-O" || s.substr(0,5) == "0-0-0") return Castling::queenside;
  #ifndef NDEBUG
  TRACE(s);
  #endif
  assert(!"Cannot convert std::string to Castling");
  throw std::logic_error("Cannot convert std::string to Castling");
}
bool ribi::Chess::Move::ParseIsCastling(const std::string& s)
{
  return CanStrToCastling(s);

  //return s == "0-0" || s == "O-O" || s == "O-O+" || s == "0-0-0" || s == "O-O-O"|| s == "O-O-O+";
}
bool ribi::Chess::Move::IsCastling() const
{
  assert(!m_is_castling || CanStrToCastling(m_str));
  return m_is_castling;
}