X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fstrings%2Flexicalcast.cpp;h=2b84d9bbbcdaa4e93af36d15d6bb5063807f7ef6;hp=2fc4be35c182f2d3dde801212580b2329df7a4b1;hb=b116e161e377da0e4e52f07745ecb2d22f962ae9;hpb=f24e7b96e76b63c9b9b8a6bce4c7a9db64276ea8 diff --git a/source/strings/lexicalcast.cpp b/source/strings/lexicalcast.cpp index 2fc4be3..2b84d9b 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" @@ -10,12 +10,8 @@ namespace { using namespace Msp; -template -struct IsSigned -{ enum { result = !(static_cast(-1)>0) }; }; - /* Helper to avoid warnings about an unsigned type never being < 0 */ -template::result> +template::value> struct IsNegative { static bool eval(T v) { return v<0; } }; @@ -23,9 +19,17 @@ 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::result> +template::value> struct Absolute { static T eval(T v) { return v<0 ? -v : v; } }; @@ -119,7 +123,7 @@ T str_to_int(const string &s, const Fmt &f) bool neg = false; if(*i=='-') { - if(!IsSigned::result) + if(is_unsigned::value) throw lexical_error(format("conversion of '%s' to unsigned integer", s)); neg = true; ++i; @@ -174,7 +178,7 @@ T str_to_int(const string &s, const Fmt &f) } if(neg) - result = -result; + result = Negate::eval(result); return result; } @@ -553,7 +557,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>> ***/