38 typedef signed char repr_t;
39 enum value_t : repr_t { no_value = -1, maybe_value = 0, yes_value = 1 };
48 constexpr trival(
bool v)
49 : val_(v ? yes_value : no_value)
55 val_ =
static_cast<value_t
>(v);
58 constexpr trival(value_t v)
63 static constexpr trival maybe()
71 return val_ != maybe_value;
74 constexpr
bool is_maybe()
const
76 return val_ == maybe_value;
79 constexpr
bool is_true()
const
81 return val_ == yes_value;
84 constexpr
bool is_false()
const
86 return val_ == no_value;
89 constexpr
bool operator==(trival o)
const
91 return val_ == o.val_;
94 constexpr
bool operator!=(trival o)
const
96 return val_ != o.val_;
99 constexpr value_t val()
const
108 explicit operator bool()
const
110 return val_ == yes_value;
113 constexpr trival operator!()
const
115 return trival((val_ == yes_value) ? no_value :
116 (val_ == no_value) ? yes_value :
121 constexpr
bool operator==(
bool a, trival b)
123 return b == trival(a);
126 constexpr
bool operator!=(
bool a, trival b)
128 return b != trival(a);
131 constexpr trival operator&&(trival a, trival b)
134 (a.val() == trival::no_value || b.val() == trival::no_value)
136 : (a.val() == trival::maybe_value || b.val() == trival::maybe_value)
141 constexpr trival operator&&(
bool a, trival b)
143 return trival(a) && b;
146 constexpr trival operator&&(trival a,
bool b)
148 return a && trival(b);
151 constexpr trival operator||(trival a, trival b)
154 (a.val() == trival::yes_value || b.val() == trival::yes_value)
156 : (a.val() == trival::maybe_value || b.val() == trival::maybe_value)
161 constexpr trival operator||(
bool a, trival b)
163 return trival(a) || b;
166 constexpr trival operator||(trival a,
bool b)
168 return a || trival(b);
171 inline std::ostream& operator<<(std::ostream& os, trival v)
173 return os << ((v.val() == trival::no_value) ?
"no"
174 : (v.val() == trival::maybe_value) ?
"maybe"
constexpr bool is_known() const
Is true or false, but not maybe.
Definition: trival.hh:69
A class implementing Kleene's three-valued logic.
Definition: trival.hh:33