#include <iostream>
class FBool
{
public:
FBool(bool Value)
{
this->Value = Value;
}
private:
bool Value;
friend std::ostream& operator<<(
std::ostream&,
const FBool);
friend FBool Nand(
const FBool,
const FBool
);
};
std::ostream& operator<<(
std::ostream& Stream,
const FBool Object)
{
Stream << Object.Value;
return Stream;
}
FBool Nand(
const FBool X,
const FBool Y)
{
if (X.Value && Y.Value)
{
return FBool(false);
}
else
{
return FBool(true);
}
}
using FUnaryOperator = FBool (*)(
const FBool);
using FBinaryOperator = FBool (*)(
const FBool,
const FBool);
void Examine(FUnaryOperator Operator)
{
FBool False = FBool(false);
FBool True = FBool(true);
std::cout << Operator(False) << ", ";
std::cout << Operator(True) << "\n";
}
void Examine(FBinaryOperator Operator)
{
FBool False = FBool(false);
FBool True = FBool(true);
std::cout << Operator(False, False) << ", ";
std::cout << Operator(False, True) << ", ";
std::cout << Operator(True, False) << ", ";
std::cout << Operator(True, True) << "\n";
}
FBool Not(const FBool X)
{
return Nand(X, X);
}
FBool And(
const FBool X,
const FBool Y)
{
return Not(Nand(X, Y));
}
FBool Or(
const FBool X,
const FBool Y)
{
return Nand(
Not(X),
Not(Y));
}
int main()
{
Examine(Not);
Examine(And);
Examine(Or);
}