knowL: Knowledge Libraries
Loading...
Searching...
No Matches
Numeric_p.h
1#include <tuple>
2
3#include "Global.h"
4#include "ReturnValue.h"
5
6namespace knowCore
7{
8 inline std::tuple<bool, quint64> mul_overflow(quint64 _a, quint64 _b)
9 {
10#if __KNOWCORE_HAS_BUILTIN(__builtin_mul_overflow)
11 quint64 result;
12 if(__builtin_mul_overflow(_a, _b, &result))
13 {
14 return {true, NAN};
15 } else {
16 return {false, result};
17 }
18#else
19 quint64 result = _a * _b;
20 if(_a != 0 and _b != result / _a)
21 {
22 return {true, NAN};
23 }
24 return {false, result};
25#endif
26 }
27 std::tuple<bool, quint64> add_overflow(quint64 _a, quint64 _b)
28 {
29#if __KNOWCORE_HAS_BUILTIN(__builtin_add_overflow)
30 quint64 result;
31 if(__builtin_add_overflow(_a, _b, &result))
32 {
33 return {true, NAN};
34 } else {
35 return {false, result};
36 }
37#else
38 quint64 result = _a + _b;
39 if(result < _a)
40 {
41 return {true, NAN};
42 }
43 return {false, result};
44#endif
45 }
46}