// Copyright Carsten Graeser 2012

#include <dune/common/exceptions.hh>
#include <dune/common/typetraits.hh>

template <class Enum> struct StringToEnum : public Dune::NotImplemented {};

template <class Enum>
typename Dune::enable_if<
    !Dune::IsBaseOf<Dune::NotImplemented, StringToEnum<Enum>>::value,
    std::istream &>::type
operator>>(std::istream &lhs, Enum &e) {
  std::string s;
  lhs >> s;

  try {
    e = StringToEnum<Enum>::convert(s);
  }
  catch (typename Dune::Exception) {
    lhs.setstate(std::ios_base::failbit);
  }
  return lhs;
}