//------------------------------------------------------------------------------
// Author:		Gero Mueller <gero.mueller@cloo.de>
// Copyright:	(c) 2006 Gero Mueller
// License:		MIT License
//------------------------------------------------------------------------------

#ifndef BLUECORE_RECTANGLE_H
#define BLUECORE_RECTANGLE_H

#include "Point.h"

namespace BlueCore
{
	template<typename type>
	struct Rectangle2DTemplate
	{
		type _x, _y, _width, _height;
		
		Rectangle2DTemplate() :
			_x(0),
			_y(0),
			_width(0),
			_height(0)
		{
		} 

		Rectangle2DTemplate( int x, int y, int width, int height ) :
			_x(x),
			_y(y),
			_width(width),
			_height(height) 
		{
		}

		Rectangle2DTemplate( const Point2DTemplate<type> &topLeft, const Point2DTemplate<type> &bottomRight ) :
			_x(topLeft._x),
			_y(topLeft._y),
			_width(bottomRight._x - topLeft._x),
			_height(bottomRight._y - topLeft._y)
		{
		} 
		
		Rectangle2DTemplate &operator=(const Rectangle2DTemplate<type> &rect)
		{
			_x = rect._x;
			_y = rect._y;
			_width = rect._width;
			_height = rect._height;
			
			return *this;
		}
		
		bool overlaps( const Rectangle2DTemplate<type> &rect )
		{
			if( (rect._x + rect._width) < _x )
				return false; 

			if( rect._x > (_x + _width) )
				return false;

			if( rect._y < (_y - _height) )
				return false; 

			if( (rect._y - rect._height) > _y )
				return false;
			
			return true;				
		}
		
		bool contains( const Point2DTemplate<type> &point ) const
		{
			if( point._x < _x )
				return false;
	
			if( point._y < _y )
				return false;
	
			if( point._x > (_x + _width) )
				return false;
	
			if( point._y > (_y + _height) )
				return false;
				
			return true;
		}		
	};
	
	typedef Rectangle2DTemplate<int> Rectangle2D;
}
	
#endif
