#ifndef __SFJP_MYU__ROAST_multi_value_set_H__
#define __SFJP_MYU__ROAST_multi_value_set_H__

#include "roast_pp.h"

//	arith_value_set Class
template <typename T, int N>
class arith_value_set
{
private:
	typedef arith_value_set _THIS_T;
	typedef arith_value_set* _PTHIS_T;
	typedef const arith_value_set* _CPTHIS_T;
	typedef arith_value_set& _RTHIS_T;
	typedef const arith_value_set& _CRTHIS_T;
	typedef T VALT;

protected:
	//	Value set
	VALT m_values[N];
	
public:
	//	Constructors
	arith_value_set(){}
/*	arith_value_set(T v1){ m_values[0] = v1; }
	arith_value_set(T v1, T v2){ m_values[0] = v1; m_values[1] = v2; }
	arith_value_set(T v1, T v2, T v3){ m_values[0] = v1; m_values[1] = v2; m_values[2] = v3; }
	arith_value_set(T v1, T v2, T v3, T v4){ m_values[0] = v1; m_values[1] = v2; m_values[2] = v3; m_values[3] = v4; }
	arith_value_set(T v1, T v2, T v3, T v4, T v5){ m_values[0] = v1; m_values[1] = v2; m_values[2] = v3; m_values[3] = v4; m_values[4] = v5; }
	arith_value_set(T v1, T v2, T v3, T v4, T v5, T v6){ m_values[0] = v1; m_values[1] = v2; m_values[2] = v3; m_values[3] = v4; m_values[4] = v5; m_values[5] = v6; }
	arith_value_set(T v1, T v2, T v3, T v4, T v5, T v6, T v7){ arith_value_set(v1,v2,v3,v4,v5,v6); m_values[6] = v7; }
	arith_value_set(T v1, T v2, T v3, T v4, T v5, T v6, T v7, T v8){ arith_value_set(v1,v2,v3,v4,v5,v6,v7); m_values[7] = v8; }
	arith_value_set(T v1, T v2, T v3, T v4, T v5, T v6, T v7, T v8, T v9){ arith_value_set(v1,v2,v3,v4,v5,v6,v8); m_values[8] = v9; }
*/

#define _ROAST_arith_value_set_Constructor_PARAM__CALLBACK(N)		T v ## N
#define _ROAST_arith_value_set_Constructor_PROC__CALLBACK(N)		m_values[N - 1] = v ## N;
#define _ROAST_arith_value_set_Constructor_GENERATOR(N)		\
	arith_value_set(	\
		ROAST_PP_COMMA_REPEART_INC(N, _ROAST_arith_value_set_Constructor_PARAM__CALLBACK)	\
	)	\
	{ ROAST_PP_REPEART_INC(N, _ROAST_arith_value_set_Constructor_PROC__CALLBACK) }


	_ROAST_arith_value_set_Constructor_GENERATOR(1)
	_ROAST_arith_value_set_Constructor_GENERATOR(2)
	_ROAST_arith_value_set_Constructor_GENERATOR(3)
	_ROAST_arith_value_set_Constructor_GENERATOR(4)
	_ROAST_arith_value_set_Constructor_GENERATOR(5)
	_ROAST_arith_value_set_Constructor_GENERATOR(6)
	_ROAST_arith_value_set_Constructor_GENERATOR(7)
	_ROAST_arith_value_set_Constructor_GENERATOR(8)
	_ROAST_arith_value_set_Constructor_GENERATOR(9)

	//	Destructor
	virtual ~arith_value_set(){}



	// operator overload /////////////////////////////////



#define _arith_value_set__OPERATOR_GEN_THIST__VALCP_1(OP)		m_values[0] OP val.m_values[0]
#define _arith_value_set__OPERATOR_GEN_THIST__VALCP_2(OP)		_arith_value_set__OPERATOR_GEN_THIST__VALCP_1(OP);		m_values[1] OP val.m_values[1]
#define _arith_value_set__OPERATOR_GEN_THIST__VALCP_3(OP)		_arith_value_set__OPERATOR_GEN_THIST__VALCP_2(OP);		m_values[2] OP val.m_values[2]
#define _arith_value_set__OPERATOR_GEN_THIST__VALCP_4(OP)		_arith_value_set__OPERATOR_GEN_THIST__VALCP_3(OP);		m_values[3] OP val.m_values[3]
#define _arith_value_set__OPERATOR_GEN_THIST__VALCP_5(OP)		_arith_value_set__OPERATOR_GEN_THIST__VALCP_4(OP);		m_values[4] OP val.m_values[4]
#define _arith_value_set__OPERATOR_GEN_THIST__VALCP_6(OP)		_arith_value_set__OPERATOR_GEN_THIST__VALCP_5(OP);		m_values[5] OP val.m_values[5]
#define _arith_value_set__OPERATOR_GEN_THIST__VALCP_7(OP)		_arith_value_set__OPERATOR_GEN_THIST__VALCP_6(OP);		m_values[6] OP val.m_values[6]
#define _arith_value_set__OPERATOR_GEN_THIST__VALCP_8(OP)		_arith_value_set__OPERATOR_GEN_THIST__VALCP_7(OP);		m_values[7] OP val.m_values[7]
#define _arith_value_set__OPERATOR_GEN_THIST__VALCP_9(OP)		_arith_value_set__OPERATOR_GEN_THIST__VALCP_8(OP);		m_values[8] OP val.m_values[8]

#define _arith_value_set__OPERATOR_GEN_VALT__VALCP_1(OP)		m_values[0] OP val
#define _arith_value_set__OPERATOR_GEN_VALT__VALCP_2(OP)		_arith_value_set__OPERATOR_GEN_VALT__VALCP_1(OP);		m_values[1] OP val
#define _arith_value_set__OPERATOR_GEN_VALT__VALCP_3(OP)		_arith_value_set__OPERATOR_GEN_VALT__VALCP_2(OP);		m_values[2] OP val
#define _arith_value_set__OPERATOR_GEN_VALT__VALCP_4(OP)		_arith_value_set__OPERATOR_GEN_VALT__VALCP_3(OP);		m_values[3] OP val
#define _arith_value_set__OPERATOR_GEN_VALT__VALCP_5(OP)		_arith_value_set__OPERATOR_GEN_VALT__VALCP_4(OP);		m_values[4] OP val
#define _arith_value_set__OPERATOR_GEN_VALT__VALCP_6(OP)		_arith_value_set__OPERATOR_GEN_VALT__VALCP_5(OP);		m_values[5] OP val
#define _arith_value_set__OPERATOR_GEN_VALT__VALCP_7(OP)		_arith_value_set__OPERATOR_GEN_VALT__VALCP_6(OP);		m_values[6] OP val
#define _arith_value_set__OPERATOR_GEN_VALT__VALCP_8(OP)		_arith_value_set__OPERATOR_GEN_VALT__VALCP_7(OP);		m_values[7] OP val
#define _arith_value_set__OPERATOR_GEN_VALT__VALCP_9(OP)		_arith_value_set__OPERATOR_GEN_VALT__VALCP_8(OP);		m_values[8] OP val


#define _arith_value_set__OPERATOR_GEN_THIST(OP)		\
	_THIS_T& operator OP (_CRTHIS_T val){					\
		if ( N < 0 ){	\
		}	\
		else if ( N == 1 ){	\
			_arith_value_set__OPERATOR_GEN_THIST__VALCP_1(OP);	\
		}	\
		else if ( N == 2 ){	\
			_arith_value_set__OPERATOR_GEN_THIST__VALCP_2(OP);	\
		}	\
		else if ( N == 3 ){	\
			_arith_value_set__OPERATOR_GEN_THIST__VALCP_3(OP);	\
		}	\
		else if ( N == 4 ){	\
			_arith_value_set__OPERATOR_GEN_THIST__VALCP_4(OP);	\
		}	\
		else if ( N == 5 ){	\
			_arith_value_set__OPERATOR_GEN_THIST__VALCP_5(OP);	\
		}	\
		else if ( N == 6 ){	\
			_arith_value_set__OPERATOR_GEN_THIST__VALCP_6(OP);	\
		}	\
		else if ( N == 7 ){	\
			_arith_value_set__OPERATOR_GEN_THIST__VALCP_7(OP);	\
		}	\
		else if ( N == 8 ){	\
			_arith_value_set__OPERATOR_GEN_THIST__VALCP_8(OP);	\
		}	\
		else {	\
			/*	あんまり大きいと今度インライン展開でバイナリサイズがでかくなりすぎるｗ	*/	\
			for(int i=0; i<N; i++){	\
				m_values[i] OP val.m_values[i];	\
			}	\
		}	\
		return *this;	\
	}


#define _arith_value_set__OPERATOR_GEN_VALT(OP)	\
	_THIS_T& operator OP (const T val){	\
		if ( N < 0 ){	\
		}	\
		else if ( N == 1 ){	\
			_arith_value_set__OPERATOR_GEN_VALT__VALCP_1(OP);	\
		}	\
		else if ( N == 2 ){	\
			_arith_value_set__OPERATOR_GEN_VALT__VALCP_2(OP);	\
		}	\
		else if ( N == 3 ){	\
			_arith_value_set__OPERATOR_GEN_VALT__VALCP_3(OP);	\
		}	\
		else if ( N == 4 ){	\
			_arith_value_set__OPERATOR_GEN_VALT__VALCP_4(OP);	\
		}	\
		else if ( N == 5 ){	\
			_arith_value_set__OPERATOR_GEN_VALT__VALCP_5(OP);	\
		}	\
		else if ( N == 6 ){	\
			_arith_value_set__OPERATOR_GEN_VALT__VALCP_6(OP);	\
		}	\
		else if ( N == 7 ){	\
			_arith_value_set__OPERATOR_GEN_VALT__VALCP_7(OP);	\
		}	\
		else if ( N == 8 ){	\
			_arith_value_set__OPERATOR_GEN_VALT__VALCP_8(OP);	\
		}	\
		else {	\
			/*	あんまり大きいと今度インライン展開でバイナリサイズがでかくなりすぎるｗ	*/	\
			for(int i=0; i<N; i++){	\
				m_values[i] OP val;	\
			}	\
		}	\
		return *this;	\
	}

/*
#define _ROAST_arith_value_set__OPERATOR_CALLBACK(OP)
		else if ( N == 1 ){
			m_values[0] += add;
		}

#define _ROAST_arith_value_set__OPERATOR_GENERATOR_N(OP,N)		ROAST_PP_REPEART_INC_2(N
#define _ROAST_arith_value_set__OPERATOR_GENERATOR(OP)	\
	_ROAST_arith_value_set__OPERATOR_GENERATOR_N(1)		\
	_ROAST_arith_value_set__OPERATOR_GENERATOR_N(2)		\
	_ROAST_arith_value_set__OPERATOR_GENERATOR_N(3)		\
	_ROAST_arith_value_set__OPERATOR_GENERATOR_N(4)		\
	_ROAST_arith_value_set__OPERATOR_GENERATOR_N(5)		\
	_ROAST_arith_value_set__OPERATOR_GENERATOR_N(6)		\
	_ROAST_arith_value_set__OPERATOR_GENERATOR_N(7)		\
	_ROAST_arith_value_set__OPERATOR_GENERATOR_N(8)		\
	_ROAST_arith_value_set__OPERATOR_GENERATOR_N(9)
*/


	_arith_value_set__OPERATOR_GEN_THIST( += )
	_arith_value_set__OPERATOR_GEN_VALT( += )
	_arith_value_set__OPERATOR_GEN_THIST( -= )
	_arith_value_set__OPERATOR_GEN_VALT( -= )
	_arith_value_set__OPERATOR_GEN_THIST( *= )
	_arith_value_set__OPERATOR_GEN_VALT( *= )
	_arith_value_set__OPERATOR_GEN_THIST( /= )
	_arith_value_set__OPERATOR_GEN_VALT( /= )


	T operator [] (unsigned int index){
		return m_values[index];
	}
};


#endif//__SFJP_MYU__ROAST_multi_value_set_H__
