#ifndef _COMMON_POINT_HPP_
#define _COMMON_POINT_HPP_
#ifndef _COMMON_WINDOWS_HPP_
#include <common/windows.hpp>
#endif
#ifndef _COMMON_STRING_HPP_
#include <common/string.hpp>
#endif
#ifndef _COMMON_STDIO_HPP_
#include <common/stdio.hpp>
#endif

#if defined(_MSC_VER)
#pragma warning(disable:4244)
#endif

typedef struct COMMONPOINT
{
	short x;
	short y; 
}CommonPoint;

class Point : public COMMONPOINT
{
public:
	 Point(void);
	 Point(short x,short y);
	 Point(const Point &somePoint);
	 ~Point();
	 short x(void)const;
	 void x(short newx);
	 short y(void)const;
	 void y(short newy);
	 void setPoint(short x,short y);
	 BOOL operator==(const Point &somePoint)const;
	 BOOL operator<(const Point &somePoint)const;
	 BOOL operator>(const Point &somePoint)const;
   Point operator+(const Point &somePoint)const;
	 Point &operator=(const Point &somePoint);
	 Point &operator-=(const Point &somePoint);
	 Point &operator+=(const Point &somePoint);
	 Point &operator++(void);
	 Point operator++(int prefixDummy);
	 Point &operator--(void);
	 Point operator--(int prefixDummy);
	 Point midPoint(const Point &somePoint)const;
   DWORD dsqr(const Point &somePoint)const;
	 operator POINT(void)const;
	 String toString(void)const;
private:
};

inline
Point::Point(void)
{
	COMMONPOINT::x=0;
	COMMONPOINT::y=0;
}

inline
Point::Point(short x,short y)
{
	COMMONPOINT::x=x;
	COMMONPOINT::y=y;
}

inline
Point::Point(const Point &somePoint)
{
	COMMONPOINT::x=((COMMONPOINT&)somePoint).x;
	COMMONPOINT::y=((COMMONPOINT&)somePoint).y;
}

inline
Point::~Point()
{
}

inline
short Point::x(void)const
{
	return COMMONPOINT::x;
}

inline
void Point::x(short newx)
{
	COMMONPOINT::x=newx;
}

inline
short Point::y(void)const
{
	return COMMONPOINT::y;
}

inline
void Point::y(short newy)
{
	COMMONPOINT::y=newy;
}

inline
BOOL Point::operator==(const Point &somePoint)const
{
	return (COMMONPOINT::x==((COMMONPOINT&)somePoint).x&&COMMONPOINT::y==((COMMONPOINT&)somePoint).y);
}

inline
BOOL Point::operator<(const Point &somePoint)const
{
  return (int(x())*int(x())+int(y())*int(y()))<(int(somePoint.x())*int(somePoint.x())+int(somePoint.y())*int(somePoint.y()));
}

inline
BOOL Point::operator>(const Point &somePoint)const
{
  return (int(x())*int(x())+int(y())*int(y()))>(int(somePoint.x())*int(somePoint.x())+int(somePoint.y())*int(somePoint.y()));
}

inline
Point &Point::operator=(const Point &somePoint)
{
	COMMONPOINT::x=((COMMONPOINT&)somePoint).x;
	COMMONPOINT::y=((COMMONPOINT&)somePoint).y;
	return *this;
}

inline
Point &Point::operator-=(const Point &somePoint)
{
	COMMONPOINT::x-=((COMMONPOINT&)somePoint).x;
	COMMONPOINT::y-=((COMMONPOINT&)somePoint).y;
	return *this;
}

inline
Point &Point::operator+=(const Point &somePoint)
{
	COMMONPOINT::x+=((COMMONPOINT&)somePoint).x;
	COMMONPOINT::y+=((COMMONPOINT&)somePoint).y;
	return *this;
}

inline
Point &Point::operator++(void)
{
	COMMONPOINT::x++;
	COMMONPOINT::y++;
	return *this;
}

inline
Point::operator POINT(void)const
{
	POINT somePoint;

	somePoint.x=COMMONPOINT::x;
	somePoint.y=COMMONPOINT::y;
	return somePoint;
}

inline
Point Point::midPoint(const Point &somePoint)const
{
	return Point((((float)x()+(float)somePoint.x())/2.00)+.50,(((float)y()+(float)somePoint.y())/2.00)+.50);
}

inline
void Point::setPoint(short x,short y)
{
	COMMONPOINT::x=x;
	COMMONPOINT::y=y;
}

inline
DWORD Point::dsqr(const Point &somePoint)const
{
	int xDiff(somePoint.x()-x());
  int yDiff(somePoint.y()-y());
  return (xDiff*xDiff)+(yDiff*yDiff);
}

inline
String Point::toString(void)const
{
  String strPoint;
	::sprintf(strPoint.str(),"(%d,%d)",x(),y());
	return strPoint;
}
#endif
