#include "ternary.hh"

Ternary::Ternary(unsigned short state) : theState(state) {}
Ternary::~Ternary(){}

Ternary Ternary::operator =(const Ternary& that)
{
	theState = that.theState;
}

bool Ternary::operator ==(const Ternary& that)
{
	return theState == that.theState;
}

bool Ternary::operator !=(const Ternary& that)
{
	return theState != that.theState;
}

Ternary Ternary::operator &&(const Ternary& that) const
{
	//everything false is involved yields false again
	if((theState==TY_FALSE)||(that.theState==TY_FALSE))
		return TY_FALSE;
	//true/true and unknown/unknown
	else if(theState==that.theState)
		return theState;
	//true/unkown and unknown/true
	else
		return TY_UNKNOWN;
}

Ternary Ternary::operator ||(const Ternary& that) const
{
	//everything true is involved yields true again
	if((theState==TY_TRUE) || (that.theState==TY_TRUE))
		return TY_TRUE;
	//false/false and unknown/unknown
	else if(theState==that.theState)
		return theState;
	//only unknown/false and false/unknown remain
	else 
		return TY_UNKNOWN;
}

Ternary Ternary::operator !() const
{
	if(theState==TY_TRUE)
		return TY_FALSE;
	else if(theState==TY_FALSE)
		return TY_TRUE;
	else
		return TY_UNKNOWN;
}

unsigned short Ternary::getState() const
{
	return theState;
}

std::ostream& operator<<(std::ostream& ostream, const Ternary& ternary)
{
	if(ternary.getState()==Ternary::TY_TRUE)
		ostream << "true";
	else if(ternary.getState()==Ternary::TY_FALSE)
		ostream << "false";
	else
		ostream << "unknown";

	return ostream;
}
