inline SPROUT_NON_CONSTEXPR std::basic_istream<Elem, Traits>& operator>>(std::basic_istream<Elem, Traits>& lhs, sprout::math::quaternion<T>& rhs) { std::ctype<Elem> const& ct = std::use_facet<std::ctype<Elem> >(lhs.getloc()); T a = T(); T b = T(); T c = T(); T d = T(); sprout::complex<T> u = sprout::complex<T>(); sprout::complex<T> v = sprout::complex<T>(); Elem ch = Elem(); char cc; lhs >> ch; if (!lhs.good()) { goto finish; } cc = ct.narrow(ch, char()); if (cc == '(') { lhs >> ch; if (!lhs.good()) { goto finish; } cc = ct.narrow(ch, char()); if (cc == '(') { lhs.putback(ch); lhs >> u; a = u.real(); b = u.imag(); if (!lhs.good()) { goto finish; } lhs >> ch; if (!lhs.good()) { goto finish; } cc = ct.narrow(ch, char()); if (cc == ')') { rhs = sprout::math::quaternion<T>(a, b); } else if (cc == ',') { lhs >> v; c = v.real(); d = v.imag(); if (!lhs.good()) { goto finish; } lhs >> ch; if (!lhs.good()) { goto finish; } cc = ct.narrow(ch, char()); if (cc == ')') { rhs = sprout::math::quaternion<T>(a, b, c, d); } else { lhs.setstate(std::ios_base::failbit); } } else {
inline bool test( std::basic_istream< charT, traits >& is, charT const& should_be ){ charT in; if(is){ if(is >> in && in == should_be) return true; is.putback(in); } return false; }