From 636c55493c796fe671b69185d0166e80ecbea0fe Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Tue, 1 Dec 2009 03:52:57 +0000 Subject: [PATCH] Smartly size the integer returned from a Boxed_POD_Value operation to return an "int" if the resulting value is small enough --- .../chaiscript/dispatchkit/boxed_value.hpp | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/include/chaiscript/dispatchkit/boxed_value.hpp b/include/chaiscript/dispatchkit/boxed_value.hpp index 28b5a57..45f2ca0 100644 --- a/include/chaiscript/dispatchkit/boxed_value.hpp +++ b/include/chaiscript/dispatchkit/boxed_value.hpp @@ -711,7 +711,7 @@ namespace chaiscript { if (!m_isfloat && !r.m_isfloat) { - return Boxed_Value(i + r.i); + return smart_size(i + r.i); } return Boxed_Value(((m_isfloat)?d:i) + ((r.m_isfloat)?r.d:r.i)); @@ -721,7 +721,7 @@ namespace chaiscript { if (!m_isfloat && !r.m_isfloat) { - return Boxed_Value(i - r.i); + return smart_size(i - r.i); } return Boxed_Value(((m_isfloat)?d:i) - ((r.m_isfloat)?r.d:r.i)); @@ -761,7 +761,7 @@ namespace chaiscript { if (!m_isfloat && !r.m_isfloat) { - return Boxed_Value(i / r.i); + return smart_size(i / r.i); } return Boxed_Value(((m_isfloat)?d:i) / ((r.m_isfloat)?r.d:r.i)); @@ -771,7 +771,7 @@ namespace chaiscript { if (!m_isfloat && !r.m_isfloat) { - return Boxed_Value(i << r.i); + return smart_size(i << r.i); } throw bad_boxed_cast("<< only valid for integer types"); @@ -782,7 +782,7 @@ namespace chaiscript { if (!m_isfloat && !r.m_isfloat) { - return Boxed_Value(i * r.i); + return smart_size(i * r.i); } return Boxed_Value(((m_isfloat)?d:i) * ((r.m_isfloat)?r.d:r.i)); @@ -793,7 +793,7 @@ namespace chaiscript { if (!m_isfloat && !r.m_isfloat) { - return Boxed_Value(i % r.i); + return smart_size(i % r.i); } throw bad_boxed_cast("% only valid for integer types"); @@ -803,12 +803,23 @@ namespace chaiscript { if (!m_isfloat && !r.m_isfloat) { - return Boxed_Value(i >> r.i); + return smart_size(i >> r.i); } throw bad_boxed_cast(">> only valid for integer types"); } + Boxed_Value smart_size(boost::int64_t i) const + { + if (i < std::numeric_limits::min() + || i > std::numeric_limits::max()) + { + return Boxed_Value(i); + } else { + return Boxed_Value(static_cast(i)); + } + } + double d;