1 #ifndef SYMENGINE_TRIBOOL_H
2 #define SYMENGINE_TRIBOOL_H
7 enum class tribool { indeterminate = -1, trifalse = 0, tritrue = 1 };
9 inline bool is_true(tribool x)
11 return x == tribool::tritrue;
14 inline bool is_false(tribool x)
16 return x == tribool::trifalse;
19 inline bool is_indeterminate(tribool x)
21 return x == tribool::indeterminate;
24 inline tribool tribool_from_bool(
bool x)
26 return static_cast<tribool
>(x);
29 inline tribool and_tribool(tribool a, tribool b)
31 if (!(
static_cast<unsigned>(a) &
static_cast<unsigned>(b))) {
32 return tribool::trifalse;
34 return static_cast<tribool
>(
static_cast<unsigned>(a)
35 |
static_cast<unsigned>(b));
39 inline tribool or_tribool(tribool a, tribool b)
41 if (is_true(a) || is_true(b)) {
42 return tribool::tritrue;
43 }
else if (is_indeterminate(a) || is_indeterminate(b)) {
44 return tribool::indeterminate;
46 return tribool::trifalse;
50 inline tribool not_tribool(tribool a)
52 if (is_indeterminate(a)) {
55 return static_cast<tribool
>(!
static_cast<unsigned>(a));
61 inline tribool andwk_tribool(tribool a, tribool b)
63 if (is_indeterminate(a) || is_indeterminate(b)) {
64 return tribool::indeterminate;
66 return static_cast<tribool
>(
static_cast<unsigned>(a)
67 &&
static_cast<unsigned>(b));
73 inline tribool orwk_tribool(tribool a, tribool b)
75 if (is_indeterminate(a) || is_indeterminate(b)) {
76 return tribool::indeterminate;
78 return static_cast<tribool
>(
static_cast<unsigned>(a)
79 ||
static_cast<unsigned>(b));
Main namespace for SymEngine package.