#include "IpGeometry.h"

namespace cosi {
namespace quantity {
namespace onchipcommunication {

IpGeometry::IpGeometry() {

}

IpGeometry::~IpGeometry() {

}

IpGeometry IpGeometry::Get() {
	return (*this);
}

void IpGeometry::Set(IpGeometry pP) {
	IsBot(false);
	(*this) = pP ;
}

void IpGeometry::SetXl(RealQuantity Xl) {
	mXl = Xl ;
	IsBot(false);
}
void IpGeometry::SetXr(RealQuantity Xr) {
	mXr = Xr ;
	IsBot(false);
}
void IpGeometry::SetYt(RealQuantity Yt) {
	mYt = Yt ;
	IsBot(false);
}
void IpGeometry::SetYb(RealQuantity Yb) {
	mYb = Yb ;
	IsBot(false);
}
void IpGeometry::SetArea(RealQuantity Area) {
	mArea = Area ;
	IsBot(false);
}

RealQuantity IpGeometry::GetXl() const {
	return mXl ;
}
RealQuantity IpGeometry::GetXr() const {
	return mXr ;
}
RealQuantity IpGeometry::GetYt() const {
	return mYt ;
}
RealQuantity IpGeometry::GetYb() const {
	return mYb ;
}
RealQuantity IpGeometry::GetArea() const {
	return mArea ;
}

bool IpGeometry::operator==(const IpGeometry &pP) const {
	if ( (IsBot() && pP.IsBot()) || (IsAny() && pP.IsAny()) )
		return true ;
	return ( GetXl().GetValue() == pP.GetXl().GetValue() && GetXr().GetValue()== pP.GetXr().GetValue() && GetYb().GetValue() == pP.GetYb().GetValue() && GetYt().GetValue() == pP.GetYt().GetValue() );
}

bool IpGeometry::operator<(const IpGeometry &pP) const {
	if (IsBot() && ! pP.IsBot() )
		return true ;
	if (pP.IsAny() && ! IsAny())
		return true ;

	if ( GetXl().GetValue() > pP.GetXl().GetValue() && GetXr().GetValue()< pP.GetXr().GetValue() && GetYb().GetValue() > pP.GetYb().GetValue() && GetYt().GetValue() < pP.GetYt().GetValue() ) {
		return true ;
	}
	return false ;
}

IpGeometry IpGeometry::operator+(IpGeometry pT) {
	if ( (*this) < pT)
		return pT ;
	else
		return (*this) ;
}

IpGeometry IpGeometry::operator-(IpGeometry pT) {
	if ( (*this) < pT)
		return (*this) ;
	else
		return pT ;
}

std::ostream& operator <<(std::ostream &pOs, const IpGeometry &pP) {
	pOs << "Lower-left (" << pP.GetXl() << "," << pP.GetYb() << ")  top-right (" << pP.GetXr() << "," << pP.GetYt() << ")" << std::endl;
	return pOs;
}

std::string IpGeometry::sQuantityType="Rectangle";
std::string IpGeometry::sQuantityName="IpGeometry";

}
}
}
