Use SFINAE to clean up divide by zero protection
This commit is contained in:
parent
9b3bb493e9
commit
31ef683ced
@ -49,32 +49,20 @@ namespace chaiscript
|
|||||||
class Boxed_Number
|
class Boxed_Number
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
#ifndef CHAISCRIPT_NO_PROTECT_DIVIDEBYZERO
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static void check_divide_by_zero(T t)
|
static void check_divide_by_zero(T t, typename std::enable_if<std::is_integral<T>::value>::type* = 0)
|
||||||
{
|
{
|
||||||
|
#ifndef CHAISCRIPT_NO_PROTECT_DIVIDEBYZERO
|
||||||
#ifdef CHAISCRIPT_MSVC
|
if (t == 0) {
|
||||||
// MSVC complains that this expression is both constant and the value t is unused
|
|
||||||
// in the cases of integral expressions. Seems a bit overzealous to me, the parameter
|
|
||||||
// is only unreferenced because they are eliminating the dead code.
|
|
||||||
#pragma warning(push)
|
|
||||||
#pragma warning(disable : 4100 4127)
|
|
||||||
#endif
|
|
||||||
if(std::is_integral<T>::value && std::is_arithmetic<T>::value && t==0) {
|
|
||||||
throw chaiscript::exception::arithmetic_error("divide by zero");
|
throw chaiscript::exception::arithmetic_error("divide by zero");
|
||||||
}
|
}
|
||||||
#ifdef CHAISCRIPT_MSVC
|
|
||||||
#pragma warning(pop)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static void check_divide_by_zero(T)
|
static void check_divide_by_zero(T, typename std::enable_if<std::is_floating_point<T>::value>::type* = 0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
struct boolean
|
struct boolean
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
var func = fun(){
|
var func = fun(){
|
||||||
var ret = 0;
|
var ret = 0;
|
||||||
for (var i = 0; i < 1000000; ++i) {
|
for (var i = 0; i < 50000; ++i) {
|
||||||
ret += i;
|
ret += i;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -9,9 +9,7 @@ var func = fun(){
|
|||||||
|
|
||||||
var fut1 := async(func);
|
var fut1 := async(func);
|
||||||
var fut2 := async(func);
|
var fut2 := async(func);
|
||||||
var fut3 := async(func);
|
|
||||||
var fut4 := async(func);
|
|
||||||
|
|
||||||
// simply executing without crashing is good enough for this test
|
// simply executing without crashing is good enough for this test
|
||||||
|
|
||||||
print(" ${fut1.get()} ${fut2.get()} ${fut3.get()} ${fut4.get()}")
|
print(" ${fut1.get()} ${fut2.get()} ")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user