X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fstrings%2Flexicalcast.cpp;h=2c867b2ce0572b7489a7fb6c9e74013efb6b7804;hp=1c1f72010cc49c6b55c9013b4fc5bd4fbd662d75;hb=31cc8f0c6e874e2417e76eda50af34fd17bcd90c;hpb=31ab69904294bcbc0f38e4d401fcca620f7c6f61 diff --git a/source/strings/lexicalcast.cpp b/source/strings/lexicalcast.cpp index 1c1f720..2c867b2 100644 --- a/source/strings/lexicalcast.cpp +++ b/source/strings/lexicalcast.cpp @@ -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; }