//////////////////////////////////////////////////////////////////////////////////////////////// // lex_cast.hpp // $Id: lex_cast.hpp,v 1.2 2005/06/20 13:20:04 my Exp $ // // Copyright (C) 2005 mamba.ru // #ifndef LEX_CAST_HPP #define LEX_CAST_HPP #include #include #include "cpp-util/str_ref.hpp" //////////////////////////////////////////////////////////////////////////////////////////////// namespace util { //////////////////////////////////////////////////////////////////////////////////////////////// struct bad_lex_cast : std::bad_cast {}; //////////////////////////////////////////////////////////////////////////////////////////////// namespace detail { template struct lex_caster; struct to_long { static long cast(char const* f, char** p) { return ::strtol(f, p, 0); } }; struct to_ulong { static unsigned long cast(char const* f, char** p) { return ::strtoul(f, p, 0); } }; template struct to_integral; template struct to_integral : to_long {}; template struct to_integral : to_ulong {}; struct to_double { static double cast(char const* f, char** p) { return ::strtod(f, p); } }; template struct to_fundamental; template struct to_fundamental : to_integral {}; template<> struct to_fundamental : to_double {}; template struct fundamental_caster { static To cast(str_ref src) { char const* const f = src.begin(); char const* const e = f + src.size(); char* p; To t = static_cast(to_fundamental::cast(f, &p)); if(e != p) throw bad_lex_cast(); return t; } }; template<> struct lex_caster : fundamental_caster {}; template<> struct lex_caster : fundamental_caster {}; template<> struct lex_caster : fundamental_caster {}; template<> struct lex_caster : fundamental_caster {}; template<> struct lex_caster : fundamental_caster {}; template<> struct lex_caster : fundamental_caster {}; template<> struct lex_caster : fundamental_caster {}; template<> struct lex_caster : fundamental_caster {}; } //////////////////////////////////////////////////////////////////////////////////////////////// template inline To lex_cast(str_ref str) { return detail::lex_caster::cast(str); } template inline To lex_cast(char const* f, char const* l) { return lex_cast(ref(f, l)); } template inline To lex_cast(char const* f) { return lex_cast(ref(f)); } template inline To lex_cast(std::string const& str) { return lex_cast(ref(str)); } //////////////////////////////////////////////////////////////////////////////////////////////// } // namespace util { //////////////////////////////////////////////////////////////////////////////////////////////// #endif // LEX_CAST_HPP