X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fstrings%2Flexicalcast.cpp;h=5e9159ce97af5e42db1ad9ba63ee1669a21c2a93;hb=672dd8d4178716824bf21a76685d91fc82a0a4af;hp=1c1f72010cc49c6b55c9013b4fc5bd4fbd662d75;hpb=641a71730a0135fe647f6a230e9704d8b677f2c5;p=libs%2Fcore.git diff --git a/source/strings/lexicalcast.cpp b/source/strings/lexicalcast.cpp index 1c1f720..5e9159c 100644 --- a/source/strings/lexicalcast.cpp +++ b/source/strings/lexicalcast.cpp @@ -1,6 +1,6 @@ #include +#include #include -#include #include "format.h" #include "lexicalcast.h" @@ -19,6 +19,14 @@ template struct IsNegative { static bool eval(T) { return false; } }; +template::value> +struct Negate +{ static T eval(T v) { return -v; } }; + +template +struct Negate +{ 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::value> @@ -170,7 +178,7 @@ T str_to_int(const string &s, const Fmt &f) } if(neg) - result = -result; + result = Negate::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(p), c.get_fmt())); } +{ c.result(int_to_str(reinterpret_cast(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(c.get(), c.get_fmt()); } -#ifdef __GNUC__ void operator>>(const LexicalConverter &c, long long &v) { v = str_to_int(c.get(), c.get_fmt()); } void operator>>(const LexicalConverter &c, unsigned long long &v) { v = str_to_int(c.get(), c.get_fmt()); } -#endif void operator>>(const LexicalConverter &c, bool &v) { v = str_to_bool(c.get()); }