1+ //
2+ // FILE: Troolean.cpp
3+ // AUTHOR: Rob Tillaart
4+ // VERSION: 0.1.1
5+ // PURPOSE: class for troolean math (true false unknown)
6+ // URL:
7+ //
8+ // HISTORY:
9+ // 0.1.0 initial version
10+ // 0.1.1 adjust (in)equality so that unknown == unknown
11+ // although there could be arguments that unknown != unknown
12+ // added isTrue(), isFalse(), isUnknown()
13+ // first public release
14+ //
15+
16+ #include " Troolean.h"
17+
18+
19+ // ///////////////////////////////////////////////////
20+ //
21+ // PUBLIC
22+ //
23+ Troolean::Troolean ()
24+ {
25+ _value = -1 ;
26+ }
27+
28+ Troolean::Troolean (const int8_t val)
29+ {
30+ if (val == 0 ) _value = 0 ;
31+ else if (val == -1 ) _value = -1 ;
32+ else _value = 1 ;
33+ }
34+
35+ Troolean::Troolean (const Troolean &t)
36+ {
37+ _value = t._value ;
38+ }
39+
40+
41+ // PRINTING
42+ size_t Troolean::printTo (Print& p) const
43+ {
44+ size_t n = 0 ;
45+ if (_value == 0 ) n += p.print (" false" );
46+ else if (_value == -1 ) n += p.print (" unknown" );
47+ else n += p.print (" true" );
48+ return n;
49+ };
50+
51+ // EQUALITIES
52+ // t == t
53+ // f == f
54+ // u == u
55+ bool Troolean::operator == (const Troolean &t)
56+ {
57+ return (_value == t._value );
58+ }
59+
60+ bool Troolean::operator == (const bool &b)
61+ {
62+ if (_value == 0 && !b) return true ;
63+ if (_value == 1 && b) return true ;
64+ return false ;
65+ }
66+
67+ bool Troolean::operator == (const int &i)
68+ {
69+ if (_value == 0 && i == 0 ) return true ;
70+ if (_value == -1 && i == -1 ) return true ;
71+ if (_value == 1 && i != 0 && i != -1 ) return true ;
72+ return false ;
73+ }
74+
75+ bool Troolean::operator != (const Troolean &t)
76+ {
77+ return (_value != t._value );
78+ }
79+
80+ bool Troolean::operator != (const bool &b)
81+ {
82+ if (_value == 0 && !b) return false ;
83+ if (_value == 1 && b) return false ;
84+ return true ;
85+ }
86+
87+ bool Troolean::operator != (const int &i)
88+ {
89+ if (_value == 0 && i != 0 ) return true ;
90+ if (_value == -1 && i != -1 ) return true ;
91+ if (_value == 1 && (i == 0 || i == -1 )) return true ;
92+ return false ;
93+ }
94+
95+ Troolean::operator bool () const
96+ {
97+ if (_value == 1 ) return true ;
98+ if (_value == 0 ) return false ;
99+ return false ;
100+ }
101+
102+
103+ // NEGATE
104+ // t -> f
105+ // f -> t
106+ // u -> u
107+ Troolean Troolean::operator ! ()
108+ {
109+ if (_value == -1 ) return Troolean (-1 ); // random 0 1 :)
110+ if (_value == 1 ) return Troolean (0 );
111+ return Troolean (1 );
112+ }
113+
114+ // LOGICAL OPERATORS
115+ Troolean Troolean::operator && (const Troolean &t)
116+ {
117+ if (_value == 0 || t._value == 0 ) return Troolean (0 );
118+ if (_value == 1 && t._value == 1 ) return Troolean (1 );
119+ return Troolean (-1 );
120+ }
121+
122+ Troolean Troolean::operator && (const bool &b)
123+ {
124+ if (_value == 0 || !b) return Troolean (0 );
125+ if (_value == 1 && b) return Troolean (1 );
126+ return Troolean (-1 );
127+
128+ }
129+
130+ Troolean Troolean::operator || (const Troolean &t)
131+ {
132+ if (_value == 1 || t._value == 1 ) return Troolean (1 );
133+ if (_value == 0 && t._value == 0 ) return Troolean (0 );
134+ return Troolean (-1 );
135+ }
136+
137+ Troolean Troolean::operator || (const bool &b)
138+ {
139+ if (_value == 1 || b) return Troolean (0 );
140+ if (_value == 0 && !b) return Troolean (1 );
141+ return Troolean (-1 );
142+ }
143+
144+
145+
146+
147+ // END OF FILE
0 commit comments