Skip to content

Commit 3405ddd

Browse files
committed
0.1.1 - first public version
1 parent f43a58a commit 3405ddd

File tree

7 files changed

+754
-0
lines changed

7 files changed

+754
-0
lines changed

libraries/Troolean/Troolean.cpp

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
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

libraries/Troolean/Troolean.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
//
2+
// FILE: Troolean.h
3+
// AUTHOR: Rob Tillaart
4+
// VERSION: 0.1.1
5+
// PURPOSE: class for Troolean math
6+
// URL: https://en.wikipedia.org/wiki/Three-valued_logic
7+
// Kleene and Priest logics
8+
//
9+
// HISTORY:
10+
// see Troolean.cpp file
11+
//
12+
13+
#ifndef TROOLEAN_H
14+
#define TROOLEAN_H
15+
16+
#include "Arduino.h"
17+
#include "Printable.h"
18+
19+
#define TROOLEAN_LIB_VERSION (F("0.1.1"))
20+
21+
// TODO:rvdt enum values in a separate type....
22+
#define unknown -1
23+
24+
class Troolean: public Printable
25+
{
26+
public:
27+
Troolean();
28+
Troolean(const int8_t);
29+
Troolean(const Troolean&);
30+
31+
size_t printTo(Print&) const;
32+
33+
bool operator == (const Troolean&);
34+
bool operator == (const bool&);
35+
bool operator == (const int&);
36+
bool operator != (const Troolean&);
37+
bool operator != (const bool&);
38+
bool operator != (const int&);
39+
40+
operator bool() const;
41+
42+
Troolean operator ! (); // negation
43+
44+
Troolean operator && (const Troolean&);
45+
Troolean operator && (const bool&);
46+
Troolean operator || (const Troolean&);
47+
Troolean operator || (const bool&);
48+
49+
// faster than ==
50+
inline bool isTrue() { return _value == 1; };
51+
inline bool isFalse() { return _value == 0; };
52+
inline bool isUnknown() { return _value == -1; };
53+
54+
// ideas
55+
// bool toBool(); // returns random true/false if unknown....
56+
// Troolean operator &&=
57+
// Troolean operator ||=
58+
// extend with dontcare ? ==> four state logic ? Foolean?
59+
60+
private:
61+
int8_t _value;
62+
63+
};
64+
65+
#endif
66+
67+
// END OF FILE

0 commit comments

Comments
 (0)