]> git.tdb.fi Git - libs/core.git/blobdiff - source/strings/lexicalcast.cpp
Add move semantics to Variant
[libs/core.git] / source / strings / lexicalcast.cpp
index 1c1f72010cc49c6b55c9013b4fc5bd4fbd662d75..5e9159ce97af5e42db1ad9ba63ee1669a21c2a93 100644 (file)
@@ -1,6 +1,6 @@
 #include <cmath>
+#include <cstdint>
 #include <limits>
-#include <msp/core/inttypes.h>
 #include "format.h"
 #include "lexicalcast.h"
 
@@ -19,6 +19,14 @@ template<typename T>
 struct IsNegative<T, false>
 { static bool eval(T) { return false; } };
 
+template<typename T, bool f = is_signed<T>::value>
+struct Negate
+{ static T eval(T v) { return -v; } };
+
+template<typename T>
+struct Negate<T, false>
+{ static T eval(T v) { return (~v)+1; } };
+
 /* Helper to avoid errors about ambiguous function calls since there are no
 overloads of abs for unsigned types */
 template<typename T, bool f = is_signed<T>::value>
@@ -170,7 +178,7 @@ T str_to_int(const string &s, const Fmt &f)
        }
 
        if(neg)
-               result = -result;
+               result = Negate<T>::eval(result);
 
        return result;
 }
@@ -522,13 +530,11 @@ void operator<<(LexicalConverter &c, unsigned v)
 void operator<<(LexicalConverter &c, unsigned long v)
 { c.result(int_to_str(v, c.get_fmt())); }
 
-#ifdef __GNUC__
 void operator<<(LexicalConverter &c, long long v)
 { c.result(int_to_str(v, c.get_fmt())); }
 
 void operator<<(LexicalConverter &c, unsigned long long v)
 { c.result(int_to_str(v, c.get_fmt())); }
-#endif
 
 void operator<<(LexicalConverter &c, bool v)
 { c.result(bool_to_str(v, c.get_fmt())); }
@@ -549,7 +555,7 @@ void operator<<(LexicalConverter &c, const char *s)
 { c.result(str_to_str(s, c.get_fmt())); }
 
 void operator<<(LexicalConverter &c, const void *p)
-{ c.result(int_to_str(reinterpret_cast<IntPtr>(p), c.get_fmt())); }
+{ c.result(int_to_str(reinterpret_cast<intptr_t>(p), c.get_fmt())); }
 
 
 /*** operator>> ***/
@@ -593,13 +599,11 @@ void operator>>(const LexicalConverter &c, unsigned int &v)
 void operator>>(const LexicalConverter &c, unsigned long &v)
 { v = str_to_int<unsigned long>(c.get(), c.get_fmt()); }
 
-#ifdef __GNUC__
 void operator>>(const LexicalConverter &c, long long &v)
 { v = str_to_int<long long>(c.get(), c.get_fmt()); }
 
 void operator>>(const LexicalConverter &c, unsigned long long &v)
 { v = str_to_int<unsigned long long>(c.get(), c.get_fmt()); }
-#endif
 
 void operator>>(const LexicalConverter &c, bool &v)
 { v = str_to_bool(c.get()); }