#pragma once

//! @file Mix/Point.h
//! @brief ポイントクラスインクルードファイル

namespace Mix
{
	class Vector2;

	//! @class Point
	//! @brief ポイントクラス
	class _MIX_DLL_API Point
	{
	public:
		union
		{
			struct
			{
				Int32 x;	//!< X
				Int32 y;	//!< Y
			};

			Int32 data[2];	//!< データ
		};

	public:
		//! @brief コンストラクタ
		Point( void );
		//! @brief コンストラクタ
		//! @param[in] px X座標
		//! @param[in] py Y座標
		Point( Int32 px, Int32 py );
		//! @brief コピーコンストラクタ
		//! @param[in] pp コピー元ポイント
		Point( const Point& pp );
		//! @brief コピーコンストラクタ
		//! @param[in] pp コピー元ポイント
		Point( const Vector2& pp );

	public:
		//! @brief 等価比較
		//! @param[in] pp 比較するポイント
		//! @return 値が等しい場合は True を返します
		Boolean operator == ( const Point& pp ) const;
		//! @brief 等価比較
		//! @param[in] pp 比較するポイント
		//! @return 値が等しくない場合は True を返します
		Boolean operator != ( const Point& pp ) const;

		//! @brief 代入
		//! @param[in] pp 代入する値
		//! @return 結果
		Point& operator = ( const Point& pp );
		//! @brief 代入
		//! @param[in] pp 代入する値
		//! @return 結果
		Point& operator = ( const Vector2& pp );
		//! @brief 代入加算
		//! @param[in] pp 加算する値
		//! @return 結果
		Point& operator += ( const Point& pp );
		//! @brief 代入減算
		//! @param[in] pp 減算する値
		//! @return 結果
		Point& operator -= ( const Point& pp );
		//! @brief 代入乗算
		//! @param[in] pp 乗算する値
		//! @return 結果
		Point& operator *= ( const Point& pp );
		//! @brief 代入除算
		//! @param[in] pp 除算する値
		//! @return 結果
		Point& operator /= ( const Point& pp );

		//! @brief 加算
		//! @param[in] pp 加算する値
		//! @return 結果
		Point operator + ( const Point& pp ) const;
		//! @brief 減算
		//! @param[in] pp 減算する値
		//! @return 結果
		Point operator - ( const Point& pp ) const;
		//! @brief 乗算
		//! @param[in] pp 乗算する値
		//! @return 結果
		Point operator * ( const Point& pp ) const;
		//! @brief 除算
		//! @param[in] pp 除算する値
		//! @return 結果
		Point operator / ( const Point& pp ) const;

		//! @brief 符号を反転します
		//! @return 結果
		Point operator -( void ) const;

		//! @brief 代入乗算
		//! @param[in] s 乗算する値
		//! @return 結果
		Point& operator *= ( Int32 s );
		//! @brief 代入除算
		//! @param[in] s 除算する値
		//! @return 結果
		Point& operator /= ( Int32 s );

		//! @brief 乗算
		//! @param[in] s 乗算する値
		//! @return 結果
		Point operator * ( Int32 s ) const;
		//! @brief 除算
		//! @param[in] s 除算する値
		//! @return 結果
		Point operator / ( Int32 s ) const;

		//! @brief ポイントを設定します
		//! @param[in] px X座標
		//! @param[in] py Y座標
		void Set( Int32 px, Int32 py );

		//! @brief 二つのポイントの最小値を取得します
		//! @param[in] p0 比較する値を表す Mix::Point クラス
		//! @param[in] p1 比較する値を表す Mix::Point クラス
		//! @return ポイントの最小値を表す Mix::Point クラスを返します
		static Point Min( const Point& p0, const Point& p1 );

		//! @brief 二つのポイントの最大値を取得します
		//! @param[in] p0 比較する値を表す Mix::Point クラス
		//! @param[in] p1 比較する値を表す Mix::Point クラス
		//! @return ポイントの最大値を表す Mix::Point クラスを返します
		static Point Max( const Point& p0, const Point& p1 );

	public:
		//! @brief 初期値( 0, 0 )を取得します
		//! @return 初期値を表す Mix::Point クラスを返します
		static const Mix::Point& Zero( void )
		{
			static const Mix::Point zero( 0, 0 );

			return zero;
		}
	};
};
