namespace vector { //////////////////// ARGUMENTS //////////////////// template< class ta_a > class vecarg { const ta_a& Argv; public: inline vecarg( const ta_a& A ) : Argv( A ) {} inline const float Evaluate( const int i ) const { return Argv.Evaluate( i ); } };
template<> class vecarg< const float > { const ta_a& Argv; public: inline vecarg( const ta_a& A ) : Argv( A ) {} inline const float Evaluate( const int i ) const { return Argv; } };
template<> class vecarg< const int > { const ta_a& Argv; public: inline vecarg( const ta_a& A ) : Argv( A ) {} inline const float Evaluate( const int i ) const { return (float)Argv; } };
//////////////////// EXPRESIONS //////////////////// template< class ta_a, class ta_b, class ta_eval > class vecexp_2 { const vecarg<ta_a> Arg1; const vecarg<ta_b> Arg2; public: inline vecexp_2( const ta_a& A1, const ta_b& A2 ) : Arg1( A1 ), Arg2( A2 ) {} inline const float Evaluate ( const int i ) const { return ta_eval::Evaluate( i, Arg1, Arg2 ); } };
template< class ta_a, class ta_eval > class vecexp_1 { const vecarg<ta_a> Arg1; public: inline vecexp_1( const ta_a& A1 ) : Arg1( A1 ) {} inline const float Evaluate( const int i ) const { return ta_eval::Evaluate( i, Arg1.Evaluate( i ) ); } };
//////////////////// BASE CLASS //////////////////// template< int ta_dimension, class T > struct base : public T { inline const float Evaluate( const int I ) const { return (*((T*)this))[i]; } //////////////////// ASSIGMENT //////////////////// template< class ta > inline const vector3d& operator = ( const ta& Exp ) { for( int I=0; I<ta_ dimension; I++ ) (*((T*)this))[I] = Exp.Evaluate( I ); } //////////////////// SUM //////////////////// struct sum { template< class ta_a, class ta_b > inline static const float Evaluate( const int i, const ta_a& A, const ta_b& B ) { return A.Evaluate(i) + B.Evaluate(i); } };
template< class ta_c1, class ta_c2 > inline const vecexp_2< const ta_c1, const ta_c2, sum > operator + ( const ta_c1& Pa, const ta_c2& Pb ) { return vecexp_2< const ta_c1, const ta_c2, sum >( Pa, Pb ); }
//////////////////// DATA //////////////////// struct desc_xyz { float X, Y, Z; inline float& operator[](const int i) { return ((float*)this)[i]; } };
struct desc_xy { float X, Y; inline float& operator[](const int i) { return ((float*)this)[i]; } }; struct desc_uv { float U, V; inline float& operator[](const int i) { return ((float*)this)[i]; } }; };
// Listing 6
|