diff --git a/include/chaiscript/dispatchkit/boxed_number.hpp b/include/chaiscript/dispatchkit/boxed_number.hpp index 7a7c875..68b2f0b 100644 --- a/include/chaiscript/dispatchkit/boxed_number.hpp +++ b/include/chaiscript/dispatchkit/boxed_number.hpp @@ -585,6 +585,59 @@ namespace chaiscript } + template + static void check_type() + { + if (sizeof(Source) != sizeof(Target) + || std::is_signed() != std::is_signed() + || std::is_floating_point() != std::is_floating_point()) + { + throw chaiscript::detail::exception::bad_any_cast(); + } + } + + template Target get_as_checked() const + { + switch (get_common_type(bv)) { + case Common_Types::t_int32: + check_type(); + return get_as_aux(bv); + case Common_Types::t_uint8: + check_type(); + return get_as_aux(bv); + case Common_Types::t_int8: + check_type(); + return get_as_aux(bv); + case Common_Types::t_uint16: + check_type(); + return get_as_aux(bv); + case Common_Types::t_int16: + check_type(); + return get_as_aux(bv); + case Common_Types::t_uint32: + check_type(); + return get_as_aux(bv); + case Common_Types::t_uint64: + check_type(); + return get_as_aux(bv); + case Common_Types::t_int64: + check_type(); + return get_as_aux(bv); + case Common_Types::t_double: + check_type(); + return get_as_aux(bv); + case Common_Types::t_float: + check_type(); + return get_as_aux(bv); + case Common_Types::t_long_double: + check_type(); + return get_as_aux(bv); + } + + throw chaiscript::detail::exception::bad_any_cast(); + } + + template Target get_as() const { switch (get_common_type(bv)) { diff --git a/unittests/integer_literal_test.cpp b/unittests/integer_literal_test.cpp index 4c20f28..9ac8808 100644 --- a/unittests/integer_literal_test.cpp +++ b/unittests/integer_literal_test.cpp @@ -19,7 +19,7 @@ bool test_literal(T val, const std::string &str, bool use_boxed_number = false) if (!use_boxed_number) { return chai.eval(str); } else { - return chai.eval(str).get_as(); + return chai.eval(str).get_as_checked(); } }(); @@ -126,66 +126,66 @@ int main() && test_literal(0x7FFFFFFFFFFFFFFF, "0b111111111111111111111111111111111111111111111111111111111111111") - && TEST_LITERAL(-0xF) - && TEST_LITERAL(-0xFF) - && TEST_LITERAL(-0xFFF) - && TEST_LITERAL(-0xFFFF) - && TEST_LITERAL(-0xFFFFF) - && TEST_LITERAL(-0xFFFFFF) - && TEST_LITERAL(-0xFFFFFFF) - && TEST_LITERAL(-0xFFFFFFFF) - && TEST_LITERAL(-0xFFFFFFFFF) - && TEST_LITERAL(-0xFFFFFFFFFF) - && TEST_LITERAL(-0xFFFFFFFFFFF) - && TEST_LITERAL(-0xFFFFFFFFFFFF) - && TEST_LITERAL(-0xFFFFFFFFFFFFF) - && TEST_LITERAL(-0xFFFFFFFFFFFFFF) - && TEST_LITERAL(-0xFFFFFFFFFFFFFFF) - && TEST_LITERAL(-0xFFFFFFFFFFFFFFFF) + && TEST_LITERAL_SIGNED(-0xF) + && TEST_LITERAL_SIGNED(-0xFF) + && TEST_LITERAL_SIGNED(-0xFFF) + && TEST_LITERAL_SIGNED(-0xFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFFFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFFFFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFFFFFF) + && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFFFFFFF) - && TEST_LITERAL(-01) - && TEST_LITERAL(-017) - && TEST_LITERAL(-0177) - && TEST_LITERAL(-01777) - && TEST_LITERAL(-017777) - && TEST_LITERAL(-0177777) - && TEST_LITERAL(-01777777) - && TEST_LITERAL(-017777777) - && TEST_LITERAL(-0177777777) - && TEST_LITERAL(-01777777777) - && TEST_LITERAL(-017777777777) - && TEST_LITERAL(-0177777777777) - && TEST_LITERAL(-01777777777777) - && TEST_LITERAL(-017777777777777) - && TEST_LITERAL(-0177777777777777) - && TEST_LITERAL(-01777777777777777) - && TEST_LITERAL(-017777777777777777) - && TEST_LITERAL(-0177777777777777777) - && TEST_LITERAL(-01777777777777777777) - && TEST_LITERAL(-017777777777777777777) - && TEST_LITERAL(-0177777777777777777777) - && TEST_LITERAL(-01777777777777777777777) + && TEST_LITERAL_SIGNED(-01) + && TEST_LITERAL_SIGNED(-017) + && TEST_LITERAL_SIGNED(-0177) + && TEST_LITERAL_SIGNED(-01777) + && TEST_LITERAL_SIGNED(-017777) + && TEST_LITERAL_SIGNED(-0177777) + && TEST_LITERAL_SIGNED(-01777777) + && TEST_LITERAL_SIGNED(-017777777) + && TEST_LITERAL_SIGNED(-0177777777) + && TEST_LITERAL_SIGNED(-01777777777) + && TEST_LITERAL_SIGNED(-017777777777) + && TEST_LITERAL_SIGNED(-0177777777777) + && TEST_LITERAL_SIGNED(-01777777777777) + && TEST_LITERAL_SIGNED(-017777777777777) + && TEST_LITERAL_SIGNED(-0177777777777777) + && TEST_LITERAL_SIGNED(-01777777777777777) + && TEST_LITERAL_SIGNED(-017777777777777777) + && TEST_LITERAL_SIGNED(-0177777777777777777) + && TEST_LITERAL_SIGNED(-01777777777777777777) + && TEST_LITERAL_SIGNED(-017777777777777777777) + && TEST_LITERAL_SIGNED(-0177777777777777777777) + && TEST_LITERAL_SIGNED(-01777777777777777777777) - && TEST_LITERAL(-1) - && TEST_LITERAL(-17) - && TEST_LITERAL(-177) - && TEST_LITERAL(-1777) - && TEST_LITERAL(-17777) - && TEST_LITERAL(-177777) - && TEST_LITERAL(-1777777) - && TEST_LITERAL(-17777777) - && TEST_LITERAL(-177777777) - && TEST_LITERAL(-1777777777) - && TEST_LITERAL(-17777777777) - && TEST_LITERAL(-177777777777) - && TEST_LITERAL(-1777777777777) - && TEST_LITERAL(-17777777777777) - && TEST_LITERAL(-177777777777777) - && TEST_LITERAL(-1777777777777777) - && TEST_LITERAL(-17777777777777777) - && TEST_LITERAL(-177777777777777777) - && TEST_LITERAL(-1777777777777777777) + && TEST_LITERAL_SIGNED(-1) + && TEST_LITERAL_SIGNED(-17) + && TEST_LITERAL_SIGNED(-177) + && TEST_LITERAL_SIGNED(-1777) + && TEST_LITERAL_SIGNED(-17777) + && TEST_LITERAL_SIGNED(-177777) + && TEST_LITERAL_SIGNED(-1777777) + && TEST_LITERAL_SIGNED(-17777777) + && TEST_LITERAL_SIGNED(-177777777) + && TEST_LITERAL_SIGNED(-1777777777) + && TEST_LITERAL_SIGNED(-17777777777) + && TEST_LITERAL_SIGNED(-177777777777) + && TEST_LITERAL_SIGNED(-1777777777777) + && TEST_LITERAL_SIGNED(-17777777777777) + && TEST_LITERAL_SIGNED(-177777777777777) + && TEST_LITERAL_SIGNED(-1777777777777777) + && TEST_LITERAL_SIGNED(-17777777777777777) + && TEST_LITERAL_SIGNED(-177777777777777777) + && TEST_LITERAL_SIGNED(-1777777777777777777) // Test 8/16/24/32 bit boundaries for various types @@ -194,10 +194,10 @@ int main() && TEST_LITERAL(16777215) && TEST_LITERAL(4294967295) - && TEST_LITERAL(-255) - && TEST_LITERAL(-65535) - && TEST_LITERAL(-16777215) - && TEST_LITERAL(-4294967295) + && TEST_LITERAL_SIGNED(-255) + && TEST_LITERAL_SIGNED(-65535) + && TEST_LITERAL_SIGNED(-16777215) + && TEST_LITERAL_SIGNED(-4294967295) && TEST_LITERAL(255u) && TEST_LITERAL(65535u)