X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FString.ct;h=3491a2ed08b7db95a5fe60bbfaa36fa4cd56c0ba;hb=6927c87144ca23845065e3c23e37c75f5f059cf3;hp=8e27ac4868b37cfa96823370d82f37ee06673ef6;hpb=24ccc14a000ffeceb9e5b6d02f54d2e971a3aee8;p=senf.git diff --git a/Utils/String.ct b/Utils/String.ct index 8e27ac4..3491a2e 100644 --- a/Utils/String.ct +++ b/Utils/String.ct @@ -28,6 +28,8 @@ // Custom includes #include #include +#include +#include #define prefix_ ///////////////////////////////ct.p//////////////////////////////////////// @@ -50,6 +52,93 @@ prefix_ std::string senf::stringJoin(ForwardReadableRange const & range, std::st return ss.str(); } +// Copied from boost/lexical_cast.hpp +namespace senf { +namespace detail { + template + class lexical_stream + { + private: + typedef char char_type; + + public: + lexical_stream() + { + stream.unsetf(std::ios::skipws); + if(std::numeric_limits::is_specialized) + stream.precision(std::numeric_limits::digits10 + 1); + } + template + bool operator<<(const Source &input) + { + if(std::numeric_limits::is_specialized) + stream.precision(std::numeric_limits::digits10 + 1); + return !(stream << input).fail(); + } + template + bool operator>>(InputStreamable &output) + { + return !boost::is_pointer::value && + stream >> output && + stream.get() == std::char_traits::eof(); + } + bool operator>>(std::string &output) + { + output = stream.str(); + return true; + } + bool operator>>(std::wstring &output) + { + output = stream.str(); + return true; + } + private: + std::basic_stringstream stream; + }; + + template + class lexical_caster + { + public: + lexical_caster() : interpreter_ (new senf::detail::lexical_stream()) {} + template + Target operator()(Source const & arg) const + { + Target result; + if(!((*interpreter_) << arg && (*interpreter_) >> result)) + boost::throw_exception(boost::bad_lexical_cast(typeid(Source), typeid(Target))); + return result; + } + + template + lexical_caster const & operator[](Mod mod) const + { + (*interpreter_) << mod; + return *this; + } + + private: + boost::shared_ptr< senf::detail::lexical_stream > interpreter_; + }; +}} + +template +prefix_ Target senf::lexical_cast(Source const & arg) +{ + senf::detail::lexical_stream interpreter; + Target result; + + if(!(interpreter << arg && interpreter >> result)) + boost::throw_exception(boost::bad_lexical_cast(typeid(Source), typeid(Target))); + return result; +} + +template +prefix_ senf::detail::lexical_caster senf::lexical_cast() +{ + return detail::lexical_caster(); +} + ///////////////////////////////ct.e//////////////////////////////////////// #undef prefix_