]> git.tdb.fi Git - libs/core.git/blobdiff - source/strings/lexicalcast.cpp
Deprecate various meta-programming constructs in favor of std ones
[libs/core.git] / source / strings / lexicalcast.cpp
index ab83b110b432ba408f8bdfa3bd2fb53d3e848c8f..1c1f72010cc49c6b55c9013b4fc5bd4fbd662d75 100644 (file)
@@ -10,12 +10,8 @@ namespace {
 
 using namespace Msp;
 
-template<typename T>
-struct IsSigned
-{ enum { result = !(static_cast<T>(-1)>0) }; };
-
 /* Helper to avoid warnings about an unsigned type never being < 0 */
-template<typename T, bool f = IsSigned<T>::result>
+template<typename T, bool f = is_signed<T>::value>
 struct IsNegative
 { static bool eval(T v) { return v<0; } };
 
@@ -25,7 +21,7 @@ struct IsNegative<T, false>
 
 /* Helper to avoid errors about ambiguous function calls since there are no
 overloads of abs for unsigned types */
-template<typename T, bool f = IsSigned<T>::result>
+template<typename T, bool f = is_signed<T>::value>
 struct Absolute
 { static T eval(T v) { return v<0 ? -v : v; } };
 
@@ -59,7 +55,7 @@ char *int_to_str(T v, const Fmt &f, char *end)
        const char *digits = (f.get_uppercase() ? udigits : ldigits);
        if(v)
        {
-               typename MatchingInt<T>::UnsignedType w = Absolute<T>::eval(v);
+               typename std::make_unsigned<T>::type w = Absolute<T>::eval(v);
                while(w)
                {
                        *--ptr = digits[w%base];
@@ -108,18 +104,18 @@ string int_to_str(T v, const Fmt &f)
 }
 
 template<typename T>
-T str_to_int(const std::string &s, const Fmt &f)
+T str_to_int(const string &s, const Fmt &f)
 {
        if(s.empty())
                throw lexical_error("conversion of '' to integer");
 
-       std::string::const_iterator i = s.begin();
+       auto i = s.begin();
 
        // See if the input starts with a sign
        bool neg = false;
        if(*i=='-')
        {
-               if(!IsSigned<T>::result)
+               if(is_unsigned<T>::value)
                        throw lexical_error(format("conversion of '%s' to unsigned integer", s));
                neg = true;
                ++i;
@@ -389,7 +385,7 @@ T str_to_flt(const string &s, const Fmt &)
        if(s.empty())
                throw lexical_error("conversion of '' to floating-point");
 
-       std::string::const_iterator i = s.begin();
+       auto i = s.begin();
 
        // See if the input starts with a sign
        bool neg = false;
@@ -471,6 +467,7 @@ namespace Msp {
 
 void LexicalConverter::result(const string &s)
 {
+       filled = true;
        if(s.size()<fmt.get_width())
        {
                if(fmt.get_align()==Fmt::RIGHT)
@@ -482,6 +479,13 @@ void LexicalConverter::result(const string &s)
                buf = s;
 }
 
+const string &LexicalConverter::get() const
+{
+       if(!filled)
+               throw lexical_error("conversion not performed");
+       return buf;
+}
+
 
 /*** operator<< ***/
 
@@ -556,7 +560,7 @@ void operator>>(const LexicalConverter &c, char &v)
                v = str_to_int<char>(c.get(), c.get_fmt());
        else
        {
-               const std::string &s = c.get();
+               const string &s = c.get();
                if(s.empty())
                        throw lexical_error("conversion of '' to character");
                if(s.size()>1)