// file : xsd/cxx/tree/parsing/float.hxx // copyright : Copyright (c) 2005-2017 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #ifndef XSD_CXX_TREE_PARSING_FLOAT_HXX #define XSD_CXX_TREE_PARSING_FLOAT_HXX #include #include #include #include #include // xml::transcode #include // text_content #include namespace xsd { namespace cxx { namespace tree { template struct traits { typedef float type; static type create (const xercesc::DOMElement& e, flags f, container* c); static type create (const xercesc::DOMAttr& a, flags f, container* c); static type create (const std::basic_string& s, const xercesc::DOMElement*, flags, container*); }; template float traits:: create (const xercesc::DOMElement& e, flags f, container* c) { return create (tree::text_content (e), 0, f, c); } template float traits:: create (const xercesc::DOMAttr& a, flags f, container* c) { return create (xml::transcode (a.getValue ()), 0, f, c); } template float traits:: create (const std::basic_string& s, const xercesc::DOMElement*, flags, container*) { // This type cannot have whitespaces in its values. As result we // don't need to waste time collapsing whitespaces. All we need to // do is trim the string representation which can be done without // copying. // ro_string tmp (s); trim (tmp); if (tmp == bits::positive_inf ()) return std::numeric_limits::infinity (); if (tmp == bits::negative_inf ()) return -std::numeric_limits::infinity (); if (tmp == bits::nan ()) return std::numeric_limits::quiet_NaN (); zc_istream is (tmp); is.imbue (std::locale::classic ()); type t; is >> t; return t; } } } } #endif // XSD_CXX_TREE_PARSING_FLOAT_HXX