@ -36,23 +36,41 @@ struct IF { typedef R type; };
template < class L , class R >
struct IF < true , L , R > { typedef L type ; } ;
# define LINEAR_AXIS_GANG(V...) GANG_N(LINEAR_AXES, V)
# define LINEAR_AXIS_CODE(V...) CODE_N(LINEAR_AXES, V)
# define LINEAR_AXIS_LIST(V...) LIST_N(LINEAR_AXES, V)
# define LINEAR_AXIS_ARRAY(V...) { LINEAR_AXIS_LIST(V) }
# define LINEAR_AXIS_ARGS(T...) LINEAR_AXIS_LIST(T x, T y, T z, T i, T j, T k)
# define LINEAR_AXIS_ELEM(O) LINEAR_AXIS_LIST(O.x, O.y, O.z, O.i, O.j, O.k)
# define LINEAR_AXIS_DEFS(T,V) LINEAR_AXIS_LIST(T x=V, T y=V, T z=V, T i=V, T j=V, T k=V)
# define LOGICAL_AXIS_GANG(E,V...) LINEAR_AXIS_GANG(V) GANG_ITEM_E(E)
# define LOGICAL_AXIS_CODE(E,V...) LINEAR_AXIS_CODE(V) CODE_ITEM_E(E)
# define LOGICAL_AXIS_LIST(E,V...) LINEAR_AXIS_LIST(V) LIST_ITEM_E(E)
# define NUM_AXIS_GANG(V...) GANG_N(NUM_AXES, V)
# define NUM_AXIS_CODE(V...) CODE_N(NUM_AXES, V)
# define NUM_AXIS_LIST(V...) LIST_N(NUM_AXES, V)
# define NUM_AXIS_LIST_1(V) LIST_N_1(NUM_AXES, V)
# define NUM_AXIS_ARRAY(V...) { NUM_AXIS_LIST(V) }
# define NUM_AXIS_ARRAY_1(V) { NUM_AXIS_LIST_1(V) }
# define NUM_AXIS_ARGS(T...) NUM_AXIS_LIST(T x, T y, T z, T i, T j, T k, T u, T v, T w)
# define NUM_AXIS_ELEM(O) NUM_AXIS_LIST(O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w)
# define NUM_AXIS_DEFS(T,V) NUM_AXIS_LIST(T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V)
# define MAIN_AXIS_NAMES NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W)
# define MAIN_AXIS_MAP(F) MAP(F, MAIN_AXIS_NAMES)
# define STR_AXES_MAIN NUM_AXIS_GANG("X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W)
# define LOGICAL_AXIS_GANG(E,V...) NUM_AXIS_GANG(V) GANG_ITEM_E(E)
# define LOGICAL_AXIS_CODE(E,V...) NUM_AXIS_CODE(V) CODE_ITEM_E(E)
# define LOGICAL_AXIS_LIST(E,V...) NUM_AXIS_LIST(V) LIST_ITEM_E(E)
# define LOGICAL_AXIS_LIST_1(V) NUM_AXIS_LIST_1(V) LIST_ITEM_E(V)
# define LOGICAL_AXIS_ARRAY(E,V...) { LOGICAL_AXIS_LIST(E,V) }
# define LOGICAL_AXIS_ARGS(T...) LOGICAL_AXIS_LIST(T e, T x, T y, T z, T i, T j, T k)
# define LOGICAL_AXIS_ELEM(O) LOGICAL_AXIS_LIST(O.e, O.x, O.y, O.z, O.i, O.j, O.k)
# define LOGICAL_AXIS_DECL(T,V) LOGICAL_AXIS_LIST(T e=V, T x=V, T y=V, T z=V, T i=V, T j=V, T k=V)
# define LOGICAL_AXES_STRING LOGICAL_AXIS_GANG("E", "X", "Y", "Z", STR_I, STR_J, STR_K)
# define LOGICAL_AXIS_ARRAY_1(V) { LOGICAL_AXIS_LIST_1(V) }
# define LOGICAL_AXIS_ARGS(T...) LOGICAL_AXIS_LIST(T e, T x, T y, T z, T i, T j, T k, T u, T v, T w)
# define LOGICAL_AXIS_ELEM(O) LOGICAL_AXIS_LIST(O.e, O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w)
# define LOGICAL_AXIS_DECL(T,V) LOGICAL_AXIS_LIST(T e=V, T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V)
# define LOGICAL_AXIS_NAMES LOGICAL_AXIS_LIST(E, X, Y, Z, I, J, K, U, V, W)
# define LOGICAL_AXIS_MAP(F) MAP(F, LOGICAL_AXIS_NAMES)
# define STR_AXES_LOGICAL LOGICAL_AXIS_GANG("E", "X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W)
# define XYZ_GANG(V...) GANG_N(PRIMARY_LINEAR_AXES, V)
# define XYZ_CODE(V...) CODE_N(PRIMARY_LINEAR_AXES, V)
# define SECONDARY_AXIS_GANG(V...) GANG_N(SECONDARY_AXES, V)
# define SECONDARY_AXIS_CODE(V...) CODE_N(SECONDARY_AXES, V)
# if HAS_ROTATIONAL_AXES
# define ROTATIONAL_AXIS_GANG(V...) GANG_N(ROTATIONAL_AXES, V)
# endif
# if HAS_EXTRUDERS
# define LIST_ITEM_E(N) , N
@ -64,7 +82,7 @@ struct IF<true, L, R> { typedef L type; };
# define GANG_ITEM_E(N)
# endif
# define AXIS_COLLISION(L) (AXIS4_NAME == L || AXIS5_NAME == L || AXIS6_NAME == L)
# define AXIS_COLLISION(L) (AXIS4_NAME == L || AXIS5_NAME == L || AXIS6_NAME == L || AXIS7_NAME == L || AXIS8_NAME == L || AXIS9_NAME == L )
// General Flags for some number of states
template < size_t N >
@ -81,9 +99,9 @@ struct Flags {
void set ( const int n ) { b | = ( bits_t ) _BV ( n ) ; }
void clear ( const int n ) { b & = ~ ( bits_t ) _BV ( n ) ; }
bool test ( const int n ) const { return TEST ( b , n ) ; }
bool operator [ ] ( const int n ) { return test ( n ) ; }
const bool operator [ ] ( const int n ) { return test ( n ) ; }
const bool operator [ ] ( const int n ) const { return test ( n ) ; }
const int size ( ) const { return sizeof ( b ) ; }
int size ( ) const { return sizeof ( b ) ; }
} ;
// Specialization for a single bool flag
@ -95,9 +113,9 @@ struct Flags<1> {
void set ( const int ) { b = true ; }
void clear ( const int ) { b = false ; }
bool test ( const int ) const { return b ; }
bool operator [ ] ( const int ) { return b ; }
const bool operator [ ] ( const int ) const { return b ; }
const int size ( ) const { return sizeof ( b ) ; }
bool & operator [ ] ( const int ) { return b ; }
bool operator [ ] ( const int ) const { return b ; }
int size ( ) const { return sizeof ( b ) ; }
} ;
typedef Flags < 8 > flags_8_t ;
@ -114,9 +132,9 @@ typedef struct AxisFlags {
void set ( const int n , const bool onoff ) { flags . set ( n , onoff ) ; }
void clear ( const int n ) { flags . clear ( n ) ; }
bool test ( const int n ) const { return flags . test ( n ) ; }
bool operator [ ] ( const int n ) { return flags [ n ] ; }
const bool operator [ ] ( const int n ) const { return flags [ n ] ; }
const int size ( ) const { return sizeof ( flags ) ; }
bool operator [ ] ( const int n ) { return flags [ n ] ; }
bool operator [ ] ( const int n ) const { return flags [ n ] ; }
int size ( ) const { return sizeof ( flags ) ; }
} axis_flags_t ;
//
@ -129,7 +147,7 @@ typedef struct AxisFlags {
enum AxisEnum : uint8_t {
// Linear axes may be controlled directly or indirectly
LINEAR _AXIS_LIST( X_AXIS , Y_AXIS , Z_AXIS , I_AXIS , J_AXIS , K_AXIS )
NUM _AXIS_LIST( X_AXIS , Y_AXIS , Z_AXIS , I_AXIS , J_AXIS , K_AXIS , U_AXIS , V_AXIS , W _AXIS )
// Extruder axes may be considered distinctly
# define _EN_ITEM(N) , E##N##_AXIS
@ -168,7 +186,7 @@ typedef IF<(NUM_AXIS_ENUMS > 8), uint16_t, uint8_t>::type axis_bits_t;
// Loop over axes
//
# define LOOP_ABC(VAR) LOOP_S_LE_N(VAR, A_AXIS, C_AXIS)
# define LOOP_LINEAR_AXES(VAR) LOOP_S_L_N(VAR, X_AXIS, LINEAR _AXES)
# define LOOP_NUM_AXES(VAR) LOOP_S_L_N(VAR, X_AXIS, NUM _AXES)
# define LOOP_LOGICAL_AXES(VAR) LOOP_S_L_N(VAR, X_AXIS, LOGICAL_AXES)
# define LOOP_DISTINCT_AXES(VAR) LOOP_S_L_N(VAR, X_AXIS, DISTINCT_AXES)
# define LOOP_DISTINCT_E(VAR) LOOP_L_N(VAR, DISTINCT_E)
@ -313,10 +331,10 @@ struct XYval {
FI void set ( const T px , const T py ) { x = px ; y = py ; }
FI void set ( const T ( & arr ) [ XY ] ) { x = arr [ 0 ] ; y = arr [ 1 ] ; }
# endif
# if LINEAR _AXES > XY
FI void set ( const T ( & arr ) [ LINEAR _AXES] ) { x = arr [ 0 ] ; y = arr [ 1 ] ; }
# if NUM _AXES > XY
FI void set ( const T ( & arr ) [ NUM _AXES] ) { x = arr [ 0 ] ; y = arr [ 1 ] ; }
# endif
# if LOGICAL_AXES > LINEAR _AXES
# if LOGICAL_AXES > NUM _AXES
FI void set ( const T ( & arr ) [ LOGICAL_AXES ] ) { x = arr [ 0 ] ; y = arr [ 1 ] ; }
# if DISTINCT_AXES > LOGICAL_AXES
FI void set ( const T ( & arr ) [ DISTINCT_AXES ] ) { x = arr [ 0 ] ; y = arr [ 1 ] ; }
@ -438,60 +456,69 @@ struct XYval {
template < typename T >
struct XYZval {
union {
struct { T LINEAR _AXIS_ARGS( ) ; } ;
struct { T LINEAR _AXIS_LIST( a , b , c , u , v , w ) ; } ;
T pos [ LINEAR _AXES] ;
struct { T NUM _AXIS_ARGS( ) ; } ;
struct { T NUM _AXIS_LIST( a , b , c , _i , _j , _k , _ u, _ v, _ w) ; } ;
T pos [ NUM _AXES] ;
} ;
// Set all to 0
FI void reset ( ) { LINEAR _AXIS_GANG( x = , y = , z = , i = , j = , k = ) 0 ; }
FI void reset ( ) { NUM _AXIS_GANG( x = , y = , z = , i = , j = , k = , u = , v = , w = ) 0 ; }
// Setters taking struct types and arrays
FI void set ( const T px ) { x = px ; }
FI void set ( const T px , const T py ) { x = px ; y = py ; }
FI void set ( const XYval < T > pxy ) { x = pxy . x ; y = pxy . y ; }
FI void set ( const XYval < T > pxy , const T pz ) { LINEAR _AXIS_CODE( x = pxy . x , y = pxy . y , z = pz , NOOP , NOOP , NOOP ) ; }
FI void set ( const XYval < T > pxy , const T pz ) { NUM _AXIS_CODE( x = pxy . x , y = pxy . y , z = pz , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; }
FI void set ( const T ( & arr ) [ XY ] ) { x = arr [ 0 ] ; y = arr [ 1 ] ; }
# if HAS_Z_AXIS
FI void set ( const T ( & arr ) [ LINEAR_AXES ] ) { LINEAR _AXIS_CODE( x = arr [ 0 ] , y = arr [ 1 ] , z = arr [ 2 ] , i = arr [ 3 ] , j = arr [ 4 ] , k = arr [ 5 ] ) ; }
FI void set ( LINEAR _AXIS_ARGS( const T ) ) { LINEAR _AXIS_CODE( a = x , b = y , c = z , u = i , v = j , w = k ) ; }
FI void set ( const T ( & arr ) [ NUM_AXES ] ) { NUM _AXIS_CODE( x = arr [ 0 ] , y = arr [ 1 ] , z = arr [ 2 ] , i = arr [ 3 ] , j = arr [ 4 ] , k = arr [ 5 ] , u = arr [ 6 ] , v = arr [ 7 ] , w = arr [ 8 ] ) ; }
FI void set ( NUM _AXIS_ARGS( const T ) ) { NUM _AXIS_CODE ( a = x , b = y , c = z , _i = i , _j = j , _k = k , _u = u , _v = v , _w = w ) ; }
# endif
# if LOGICAL_AXES > LINEAR _AXES
FI void set ( const T ( & arr ) [ LOGICAL_AXES ] ) { LINEAR _AXIS_CODE( x = arr [ 0 ] , y = arr [ 1 ] , z = arr [ 2 ] , i = arr [ 3 ] , j = arr [ 4 ] , k = arr [ 5 ] ) ; }
FI void set ( LOGICAL_AXIS_ARGS ( const T ) ) { LINEAR _AXIS_CODE( a = x , b = y , c = z , u = i , v = j , w = k ) ; }
# if LOGICAL_AXES > NUM _AXES
FI void set ( const T ( & arr ) [ LOGICAL_AXES ] ) { NUM _AXIS_CODE( x = arr [ 0 ] , y = arr [ 1 ] , z = arr [ 2 ] , i = arr [ 3 ] , j = arr [ 4 ] , k = arr [ 5 ] , u = arr [ 6 ] , v = arr [ 7 ] , w = arr [ 8 ] ) ; }
FI void set ( LOGICAL_AXIS_ARGS ( const T ) ) { NUM _AXIS_CODE( a = x , b = y , c = z , _i = i , _j = j , _k = k , _u = u , _v = v , _w = w ) ; }
# if DISTINCT_AXES > LOGICAL_AXES
FI void set ( const T ( & arr ) [ DISTINCT_AXES ] ) { LINEAR _AXIS_CODE( x = arr [ 0 ] , y = arr [ 1 ] , z = arr [ 2 ] , i = arr [ 3 ] , j = arr [ 4 ] , k = arr [ 5 ] ) ; }
FI void set ( const T ( & arr ) [ DISTINCT_AXES ] ) { NUM _AXIS_CODE( x = arr [ 0 ] , y = arr [ 1 ] , z = arr [ 2 ] , i = arr [ 3 ] , j = arr [ 4 ] , k = arr [ 5 ] , u = arr [ 6 ] , v = arr [ 7 ] , w = arr [ 8 ] ) ; }
# endif
# endif
# if HAS_I_AXIS
FI void set ( const T px , const T py , const T pz ) { x = px ; y = py ; z = pz ; }
FI void set ( const T px , const T py , const T pz ) { x = px ; y = py ; z = pz ; }
# endif
# if HAS_J_AXIS
FI void set ( const T px , const T py , const T pz , const T pi ) { x = px ; y = py ; z = pz ; i = pi ; }
FI void set ( const T px , const T py , const T pz , const T pi ) { x = px ; y = py ; z = pz ; i = pi ; }
# endif
# if HAS_K_AXIS
FI void set ( const T px , const T py , const T pz , const T pi , const T pj ) { x = px ; y = py ; z = pz ; i = pi ; j = pj ; }
# endif
# if HAS_U_AXIS
FI void set ( const T px , const T py , const T pz , const T pi , const T pj , const T pk ) { x = px ; y = py ; z = pz ; i = pi ; j = pj ; k = pk ; }
# endif
# if HAS_V_AXIS
FI void set ( const T px , const T py , const T pz , const T pi , const T pj , const T pk , const T pm ) { x = px ; y = py ; z = pz ; i = pi ; j = pj ; k = pk ; u = pu ; }
# endif
# if HAS_W_AXIS
FI void set ( const T px , const T py , const T pz , const T pi , const T pj , const T pk , const T pm , const T po ) { x = px ; y = py ; z = pz ; i = pi ; j = pj ; k = pk ; u = pu ; v = pv ; }
# endif
// Length reduced to one dimension
FI T magnitude ( ) const { return ( T ) sqrtf ( LINEAR_AXIS_GANG ( x * x , + y * y , + z * z , + i * i , + j * j , + k * k ) ) ; }
FI T magnitude ( ) const { return ( T ) sqrtf ( NUM _AXIS_GANG( x * x , + y * y , + z * z , + i * i , + j * j , + k * k , + u * u , + v * v , + w * w ) ) ; }
// Pointer to the data as a simple array
FI operator T * ( ) { return pos ; }
// If any element is true then it's true
FI operator bool ( ) { return LINEAR_AXIS_GANG ( x , | | y , | | z , | | i , | | j , | | k ) ; }
FI operator bool ( ) { return NUM _AXIS_GANG( x , | | y , | | z , | | i , | | j , | | k , | | u , | | v , | | w ) ; }
// Explicit copy and copies with conversion
FI XYZval < T > copy ( ) const { XYZval < T > o = * this ; return o ; }
FI XYZval < T > ABS ( ) const { return LINEAR _AXIS_ARRAY( T ( _ABS ( x ) ) , T ( _ABS ( y ) ) , T ( _ABS ( z ) ) , T ( _ABS ( i ) ) , T ( _ABS ( j ) ) , T ( _ABS ( k ) ) ) ; }
FI XYZval < int16_t > asInt ( ) { return LINEAR _AXIS_ARRAY( int16_t ( x ) , int16_t ( y ) , int16_t ( z ) , int16_t ( i ) , int16_t ( j ) , int16_t ( k ) ) ; }
FI XYZval < int16_t > asInt ( ) const { return LINEAR _AXIS_ARRAY( int16_t ( x ) , int16_t ( y ) , int16_t ( z ) , int16_t ( i ) , int16_t ( j ) , int16_t ( k ) ) ; }
FI XYZval < int32_t > asLong ( ) { return LINEAR _AXIS_ARRAY( int32_t ( x ) , int32_t ( y ) , int32_t ( z ) , int32_t ( i ) , int32_t ( j ) , int32_t ( k ) ) ; }
FI XYZval < int32_t > asLong ( ) const { return LINEAR _AXIS_ARRAY( int32_t ( x ) , int32_t ( y ) , int32_t ( z ) , int32_t ( i ) , int32_t ( j ) , int32_t ( k ) ) ; }
FI XYZval < int32_t > ROUNDL ( ) { return LINEAR _AXIS_ARRAY( int32_t ( LROUND ( x ) ) , int32_t ( LROUND ( y ) ) , int32_t ( LROUND ( z ) ) , int32_t ( LROUND ( i ) ) , int32_t ( LROUND ( j ) ) , int32_t ( LROUND ( k ) ) ) ; }
FI XYZval < int32_t > ROUNDL ( ) const { return LINEAR _AXIS_ARRAY( int32_t ( LROUND ( x ) ) , int32_t ( LROUND ( y ) ) , int32_t ( LROUND ( z ) ) , int32_t ( LROUND ( i ) ) , int32_t ( LROUND ( j ) ) , int32_t ( LROUND ( k ) ) ) ; }
FI XYZval < float > asFloat ( ) { return LINEAR _AXIS_ARRAY( static_cast < float > ( x ) , static_cast < float > ( y ) , static_cast < float > ( z ) , static_cast < float > ( i ) , static_cast < float > ( j ) , static_cast < float > ( k ) ) ; }
FI XYZval < float > asFloat ( ) const { return LINEAR _AXIS_ARRAY( static_cast < float > ( x ) , static_cast < float > ( y ) , static_cast < float > ( z ) , static_cast < float > ( i ) , static_cast < float > ( j ) , static_cast < float > ( k ) ) ; }
FI XYZval < float > reciprocal ( ) const { return LINEAR _AXIS_ARRAY( _RECIP ( x ) , _RECIP ( y ) , _RECIP ( z ) , _RECIP ( i ) , _RECIP ( j ) , _RECIP ( k ) ) ; }
FI XYZval < T > ABS ( ) const { return NUM _AXIS_ARRAY( T ( _ABS ( x ) ) , T ( _ABS ( y ) ) , T ( _ABS ( z ) ) , T ( _ABS ( i ) ) , T ( _ABS ( j ) ) , T ( _ABS ( k ) ) , T ( _ABS ( u ) ) , T ( _ABS ( v ) ) , T ( _ABS ( w ) ) ) ; }
FI XYZval < int16_t > asInt ( ) { return NUM _AXIS_ARRAY( int16_t ( x ) , int16_t ( y ) , int16_t ( z ) , int16_t ( i ) , int16_t ( j ) , int16_t ( k ) , int16_t ( u ) , int16_t ( v ) , int16_t ( w ) ) ; }
FI XYZval < int16_t > asInt ( ) const { return NUM _AXIS_ARRAY( int16_t ( x ) , int16_t ( y ) , int16_t ( z ) , int16_t ( i ) , int16_t ( j ) , int16_t ( k ) , int16_t ( u ) , int16_t ( v ) , int16_t ( w ) ) ; }
FI XYZval < int32_t > asLong ( ) { return NUM _AXIS_ARRAY( int32_t ( x ) , int32_t ( y ) , int32_t ( z ) , int32_t ( i ) , int32_t ( j ) , int32_t ( k ) , int32_t ( u ) , int32_t ( v ) , int32_t ( w ) ) ; }
FI XYZval < int32_t > asLong ( ) const { return NUM _AXIS_ARRAY( int32_t ( x ) , int32_t ( y ) , int32_t ( z ) , int32_t ( i ) , int32_t ( j ) , int32_t ( k ) , int32_t ( u ) , int32_t ( v ) , int32_t ( w ) ) ; }
FI XYZval < int32_t > ROUNDL ( ) { return NUM _AXIS_ARRAY( int32_t ( LROUND ( x ) ) , int32_t ( LROUND ( y ) ) , int32_t ( LROUND ( z ) ) , int32_t ( LROUND ( i ) ) , int32_t ( LROUND ( j ) ) , int32_t ( LROUND ( k ) ) , int32_t ( LROUND ( u ) ) , int32_t ( LROUND ( v ) ) , int32_t ( LROUND ( w ) ) ) ; }
FI XYZval < int32_t > ROUNDL ( ) const { return NUM _AXIS_ARRAY( int32_t ( LROUND ( x ) ) , int32_t ( LROUND ( y ) ) , int32_t ( LROUND ( z ) ) , int32_t ( LROUND ( i ) ) , int32_t ( LROUND ( j ) ) , int32_t ( LROUND ( k ) ) , int32_t ( LROUND ( u ) ) , int32_t ( LROUND ( v ) ) , int32_t ( LROUND ( w ) ) ) ; }
FI XYZval < float > asFloat ( ) { return NUM _AXIS_ARRAY( static_cast < float > ( x ) , static_cast < float > ( y ) , static_cast < float > ( z ) , static_cast < float > ( i ) , static_cast < float > ( j ) , static_cast < float > ( k ) , static_cast < float > ( u ) , static_cast < float > ( v ) , static_cast < float > ( w ) ) ; }
FI XYZval < float > asFloat ( ) const { return NUM _AXIS_ARRAY( static_cast < float > ( x ) , static_cast < float > ( y ) , static_cast < float > ( z ) , static_cast < float > ( i ) , static_cast < float > ( j ) , static_cast < float > ( k ) , static_cast < float > ( u ) , static_cast < float > ( v ) , static_cast < float > ( w ) ) ; }
FI XYZval < float > reciprocal ( ) const { return NUM _AXIS_ARRAY( _RECIP ( x ) , _RECIP ( y ) , _RECIP ( z ) , _RECIP ( i ) , _RECIP ( j ) , _RECIP ( k ) , _RECIP ( u ) , _RECIP ( v ) , _RECIP ( w ) ) ; }
// Marlin workspace shifting is done with G92 and M206
FI XYZval < float > asLogical ( ) const { XYZval < float > o = asFloat ( ) ; toLogical ( o ) ; return o ; }
@ -502,78 +529,78 @@ struct XYZval {
FI operator const XYval < T > & ( ) const { return * ( const XYval < T > * ) this ; }
// Cast to a type with more fields by making a new object
FI operator XYZEval < T > ( ) const { return LINEAR _AXIS_ARRAY( x , y , z , i , j , k ) ; }
FI operator XYZEval < T > ( ) const { return NUM _AXIS_ARRAY( x , y , z , i , j , k , u , v , w ) ; }
// Accessor via an AxisEnum (or any integer) [index]
FI T & operator [ ] ( const int n ) { return pos [ n ] ; }
FI const T & operator [ ] ( const int n ) const { return pos [ n ] ; }
// Assignment operator overrides do the expected thing
FI XYZval < T > & operator = ( const T v ) { set ( ARRAY_N_1 ( LINEAR _AXES, v ) ) ; return * this ; }
FI XYZval < T > & operator = ( const T v ) { set ( ARRAY_N_1 ( NUM _AXES, v ) ) ; return * this ; }
FI XYZval < T > & operator = ( const XYval < T > & rs ) { set ( rs . x , rs . y ) ; return * this ; }
FI XYZval < T > & operator = ( const XYZEval < T > & rs ) { set ( LINEAR _AXIS_ELEM( rs ) ) ; return * this ; }
FI XYZval < T > & operator = ( const XYZEval < T > & rs ) { set ( NUM _AXIS_ELEM( rs ) ) ; return * this ; }
// Override other operators to get intuitive behaviors
FI XYZval < T > operator + ( const XYval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator + ( const XYval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator - ( const XYval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator - ( const XYval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator * ( const XYval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator * ( const XYval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator / ( const XYval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator / ( const XYval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator + ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k ) ; return ls ; }
FI XYZval < T > operator + ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k ) ; return ls ; }
FI XYZval < T > operator - ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k ) ; return ls ; }
FI XYZval < T > operator - ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k ) ; return ls ; }
FI XYZval < T > operator * ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k ) ; return ls ; }
FI XYZval < T > operator * ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k ) ; return ls ; }
FI XYZval < T > operator / ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k ) ; return ls ; }
FI XYZval < T > operator / ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k ) ; return ls ; }
FI XYZval < T > operator + ( const XYZEval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k ) ; return ls ; }
FI XYZval < T > operator + ( const XYZEval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k ) ; return ls ; }
FI XYZval < T > operator - ( const XYZEval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k ) ; return ls ; }
FI XYZval < T > operator - ( const XYZEval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k ) ; return ls ; }
FI XYZval < T > operator * ( const XYZEval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k ) ; return ls ; }
FI XYZval < T > operator * ( const XYZEval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k ) ; return ls ; }
FI XYZval < T > operator / ( const XYZEval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k ) ; return ls ; }
FI XYZval < T > operator / ( const XYZEval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k ) ; return ls ; }
FI XYZval < T > operator * ( const float & v ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v ) ; return ls ; }
FI XYZval < T > operator * ( const float & v ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v ) ; return ls ; }
FI XYZval < T > operator * ( const int & v ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v ) ; return ls ; }
FI XYZval < T > operator * ( const int & v ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v ) ; return ls ; }
FI XYZval < T > operator / ( const float & v ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v ) ; return ls ; }
FI XYZval < T > operator / ( const float & v ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v ) ; return ls ; }
FI XYZval < T > operator / ( const int & v ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v ) ; return ls ; }
FI XYZval < T > operator / ( const int & v ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v ) ; return ls ; }
FI XYZval < T > operator > > ( const int & v ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( _RS ( ls . x ) , _RS ( ls . y ) , _RS ( ls . z ) , _RS ( ls . i ) , _RS ( ls . j ) , _RS ( ls . k ) ) ; return ls ; }
FI XYZval < T > operator > > ( const int & v ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( _RS ( ls . x ) , _RS ( ls . y ) , _RS ( ls . z ) , _RS ( ls . i ) , _RS ( ls . j ) , _RS ( ls . k ) ) ; return ls ; }
FI XYZval < T > operator < < ( const int & v ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( _LS ( ls . x ) , _LS ( ls . y ) , _LS ( ls . z ) , _LS ( ls . i ) , _LS ( ls . j ) , _LS ( ls . k ) ) ; return ls ; }
FI XYZval < T > operator < < ( const int & v ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( _LS ( ls . x ) , _LS ( ls . y ) , _LS ( ls . z ) , _LS ( ls . i ) , _LS ( ls . j ) , _LS ( ls . k ) ) ; return ls ; }
FI const XYZval < T > operator - ( ) const { XYZval < T > o = * this ; LINEAR _AXIS_CODE( o . x = - x , o . y = - y , o . z = - z , o . i = - i , o . j = - j , o . k = - k ) ; return o ; }
FI XYZval < T > operator - ( ) { XYZval < T > o = * this ; LINEAR _AXIS_CODE( o . x = - x , o . y = - y , o . z = - z , o . i = - i , o . j = - j , o . k = - k ) ; return o ; }
FI XYZval < T > operator + ( const XYval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator + ( const XYval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator - ( const XYval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator - ( const XYval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator * ( const XYval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator * ( const XYval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator / ( const XYval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator / ( const XYval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return ls ; }
FI XYZval < T > operator + ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k , ls . u + = rs . u , ls . v + = rs . v , ls . w + = rs . w ) ; return ls ; }
FI XYZval < T > operator + ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k , ls . u + = rs . u , ls . v + = rs . v , ls . w + = rs . w ) ; return ls ; }
FI XYZval < T > operator - ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k , ls . u - = rs . u , ls . v - = rs . v , ls . w - = rs . w ) ; return ls ; }
FI XYZval < T > operator - ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k , ls . u - = rs . u , ls . v - = rs . v , ls . w - = rs . w ) ; return ls ; }
FI XYZval < T > operator * ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k , ls . u * = rs . u , ls . v * = rs . v , ls . w * = rs . w ) ; return ls ; }
FI XYZval < T > operator * ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k , ls . u * = rs . u , ls . v * = rs . v , ls . w * = rs . w ) ; return ls ; }
FI XYZval < T > operator / ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k , ls . u / = rs . u , ls . v / = rs . v , ls . w / = rs . w ) ; return ls ; }
FI XYZval < T > operator / ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k , ls . u / = rs . u , ls . v / = rs . v , ls . w / = rs . w ) ; return ls ; }
FI XYZval < T > operator + ( const XYZEval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k , ls . u + = rs . u , ls . v + = rs . v , ls . w + = rs . w ) ; return ls ; }
FI XYZval < T > operator + ( const XYZEval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k , ls . u + = rs . u , ls . v + = rs . v , ls . w + = rs . w ) ; return ls ; }
FI XYZval < T > operator - ( const XYZEval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k , ls . u - = rs . u , ls . v - = rs . v , ls . w - = rs . w ) ; return ls ; }
FI XYZval < T > operator - ( const XYZEval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k , ls . u - = rs . u , ls . v - = rs . v , ls . w - = rs . w ) ; return ls ; }
FI XYZval < T > operator * ( const XYZEval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k , ls . u * = rs . u , ls . v * = rs . v , ls . w * = rs . w ) ; return ls ; }
FI XYZval < T > operator * ( const XYZEval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k , ls . u * = rs . u , ls . v * = rs . v , ls . w * = rs . w ) ; return ls ; }
FI XYZval < T > operator / ( const XYZEval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k , ls . u / = rs . u , ls . v / = rs . v , ls . w / = rs . w ) ; return ls ; }
FI XYZval < T > operator / ( const XYZEval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k , ls . u / = rs . u , ls . v / = rs . v , ls . w / = rs . w ) ; return ls ; }
FI XYZval < T > operator * ( const float & v ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v , ls . u * = v , ls . v * = v , ls . w * = v ) ; return ls ; }
FI XYZval < T > operator * ( const float & v ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v , ls . u * = v , ls . v * = v , ls . w * = v ) ; return ls ; }
FI XYZval < T > operator * ( const int & v ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v , ls . u * = v , ls . v * = v , ls . w * = v ) ; return ls ; }
FI XYZval < T > operator * ( const int & v ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v , ls . u * = v , ls . v * = v , ls . w * = v ) ; return ls ; }
FI XYZval < T > operator / ( const float & v ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v , ls . u / = v , ls . v / = v , ls . w / = v ) ; return ls ; }
FI XYZval < T > operator / ( const float & v ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v , ls . u / = v , ls . v / = v , ls . w / = v ) ; return ls ; }
FI XYZval < T > operator / ( const int & v ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v , ls . u / = v , ls . v / = v , ls . w / = v ) ; return ls ; }
FI XYZval < T > operator / ( const int & v ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v , ls . u / = v , ls . v / = v , ls . w / = v ) ; return ls ; }
FI XYZval < T > operator > > ( const int & v ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( _RS ( ls . x ) , _RS ( ls . y ) , _RS ( ls . z ) , _RS ( ls . i ) , _RS ( ls . j ) , _RS ( ls . k ) , _RS ( ls . u ) , _RS ( ls . v ) , _RS ( ls . w ) ) ; return ls ; }
FI XYZval < T > operator > > ( const int & v ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( _RS ( ls . x ) , _RS ( ls . y ) , _RS ( ls . z ) , _RS ( ls . i ) , _RS ( ls . j ) , _RS ( ls . k ) , _RS ( ls . u ) , _RS ( ls . v ) , _RS ( ls . w ) ) ; return ls ; }
FI XYZval < T > operator < < ( const int & v ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( _LS ( ls . x ) , _LS ( ls . y ) , _LS ( ls . z ) , _LS ( ls . i ) , _LS ( ls . j ) , _LS ( ls . k ) , _LS ( ls . u ) , _LS ( ls . v ) , _LS ( ls . w ) ) ; return ls ; }
FI XYZval < T > operator < < ( const int & v ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( _LS ( ls . x ) , _LS ( ls . y ) , _LS ( ls . z ) , _LS ( ls . i ) , _LS ( ls . j ) , _LS ( ls . k ) , _LS ( ls . u ) , _LS ( ls . v ) , _LS ( ls . w ) ) ; return ls ; }
FI const XYZval < T > operator - ( ) const { XYZval < T > o = * this ; NUM _AXIS_CODE( o . x = - x , o . y = - y , o . z = - z , o . i = - i , o . j = - j , o . k = - k , o . u = - u , o . v = - v , o . w = - w ) ; return o ; }
FI XYZval < T > operator - ( ) { XYZval < T > o = * this ; NUM _AXIS_CODE( o . x = - x , o . y = - y , o . z = - z , o . i = - i , o . j = - j , o . k = - k , o . u = - u , o . v = - v , o . w = - w ) ; return o ; }
// Modifier operators
FI XYZval < T > & operator + = ( const XYval < T > & rs ) { LINEAR _AXIS_CODE( x + = rs . x , y + = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return * this ; }
FI XYZval < T > & operator - = ( const XYval < T > & rs ) { LINEAR _AXIS_CODE( x - = rs . x , y - = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return * this ; }
FI XYZval < T > & operator * = ( const XYval < T > & rs ) { LINEAR _AXIS_CODE( x * = rs . x , y * = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return * this ; }
FI XYZval < T > & operator / = ( const XYval < T > & rs ) { LINEAR _AXIS_CODE( x / = rs . x , y / = rs . y , NOOP , NOOP , NOOP , NOOP ) ; return * this ; }
FI XYZval < T > & operator + = ( const XYZval < T > & rs ) { LINEAR _AXIS_CODE( x + = rs . x , y + = rs . y , z + = rs . z , i + = rs . i , j + = rs . j , k + = rs . k ) ; return * this ; }
FI XYZval < T > & operator - = ( const XYZval < T > & rs ) { LINEAR _AXIS_CODE( x - = rs . x , y - = rs . y , z - = rs . z , i - = rs . i , j - = rs . j , k - = rs . k ) ; return * this ; }
FI XYZval < T > & operator * = ( const XYZval < T > & rs ) { LINEAR _AXIS_CODE( x * = rs . x , y * = rs . y , z * = rs . z , i * = rs . i , j * = rs . j , k * = rs . k ) ; return * this ; }
FI XYZval < T > & operator / = ( const XYZval < T > & rs ) { LINEAR _AXIS_CODE( x / = rs . x , y / = rs . y , z / = rs . z , i / = rs . i , j / = rs . j , k / = rs . k ) ; return * this ; }
FI XYZval < T > & operator + = ( const XYZEval < T > & rs ) { LINEAR _AXIS_CODE( x + = rs . x , y + = rs . y , z + = rs . z , i + = rs . i , j + = rs . j , k + = rs . k ) ; return * this ; }
FI XYZval < T > & operator - = ( const XYZEval < T > & rs ) { LINEAR _AXIS_CODE( x - = rs . x , y - = rs . y , z - = rs . z , i - = rs . i , j - = rs . j , k - = rs . k ) ; return * this ; }
FI XYZval < T > & operator * = ( const XYZEval < T > & rs ) { LINEAR _AXIS_CODE( x * = rs . x , y * = rs . y , z * = rs . z , i * = rs . i , j * = rs . j , k * = rs . k ) ; return * this ; }
FI XYZval < T > & operator / = ( const XYZEval < T > & rs ) { LINEAR _AXIS_CODE( x / = rs . x , y / = rs . y , z / = rs . z , i / = rs . i , j / = rs . j , k / = rs . k ) ; return * this ; }
FI XYZval < T > & operator * = ( const float & v ) { LINEAR _AXIS_CODE( x * = v , y * = v , z * = v , i * = v , j * = v , k * = v ) ; return * this ; }
FI XYZval < T > & operator * = ( const int & v ) { LINEAR _AXIS_CODE( x * = v , y * = v , z * = v , i * = v , j * = v , k * = v ) ; return * this ; }
FI XYZval < T > & operator > > = ( const int & v ) { LINEAR _AXIS_CODE( _RS ( x ) , _RS ( y ) , _RS ( z ) , _RS ( i ) , _RS ( j ) , _RS ( k ) ) ; return * this ; }
FI XYZval < T > & operator < < = ( const int & v ) { LINEAR _AXIS_CODE( _LS ( x ) , _LS ( y ) , _LS ( z ) , _LS ( i ) , _LS ( j ) , _LS ( k ) ) ; return * this ; }
FI XYZval < T > & operator + = ( const XYval < T > & rs ) { NUM _AXIS_CODE( x + = rs . x , y + = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return * this ; }
FI XYZval < T > & operator - = ( const XYval < T > & rs ) { NUM _AXIS_CODE( x - = rs . x , y - = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return * this ; }
FI XYZval < T > & operator * = ( const XYval < T > & rs ) { NUM _AXIS_CODE( x * = rs . x , y * = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return * this ; }
FI XYZval < T > & operator / = ( const XYval < T > & rs ) { NUM _AXIS_CODE( x / = rs . x , y / = rs . y , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP , NOOP ) ; return * this ; }
FI XYZval < T > & operator + = ( const XYZval < T > & rs ) { NUM _AXIS_CODE( x + = rs . x , y + = rs . y , z + = rs . z , i + = rs . i , j + = rs . j , k + = rs . k , u + = rs . u , v + = rs . v , w + = rs . w ) ; return * this ; }
FI XYZval < T > & operator - = ( const XYZval < T > & rs ) { NUM _AXIS_CODE( x - = rs . x , y - = rs . y , z - = rs . z , i - = rs . i , j - = rs . j , k - = rs . k , u - = rs . u , v - = rs . v , w - = rs . w ) ; return * this ; }
FI XYZval < T > & operator * = ( const XYZval < T > & rs ) { NUM _AXIS_CODE( x * = rs . x , y * = rs . y , z * = rs . z , i * = rs . i , j * = rs . j , k * = rs . k , u * = rs . u , v * = rs . v , w * = rs . w ) ; return * this ; }
FI XYZval < T > & operator / = ( const XYZval < T > & rs ) { NUM _AXIS_CODE( x / = rs . x , y / = rs . y , z / = rs . z , i / = rs . i , j / = rs . j , k / = rs . k , u / = rs . u , v / = rs . v , w / = rs . w ) ; return * this ; }
FI XYZval < T > & operator + = ( const XYZEval < T > & rs ) { NUM _AXIS_CODE( x + = rs . x , y + = rs . y , z + = rs . z , i + = rs . i , j + = rs . j , k + = rs . k , u + = rs . u , v + = rs . v , w + = rs . w ) ; return * this ; }
FI XYZval < T > & operator - = ( const XYZEval < T > & rs ) { NUM _AXIS_CODE( x - = rs . x , y - = rs . y , z - = rs . z , i - = rs . i , j - = rs . j , k - = rs . k , u - = rs . u , v - = rs . v , w - = rs . w ) ; return * this ; }
FI XYZval < T > & operator * = ( const XYZEval < T > & rs ) { NUM _AXIS_CODE( x * = rs . x , y * = rs . y , z * = rs . z , i * = rs . i , j * = rs . j , k * = rs . k , u * = rs . u , v * = rs . v , w * = rs . w ) ; return * this ; }
FI XYZval < T > & operator / = ( const XYZEval < T > & rs ) { NUM _AXIS_CODE( x / = rs . x , y / = rs . y , z / = rs . z , i / = rs . i , j / = rs . j , k / = rs . k , u / = rs . u , v / = rs . v , w / = rs . w ) ; return * this ; }
FI XYZval < T > & operator * = ( const float & v ) { NUM _AXIS_CODE( x * = v , y * = v , z * = v , i * = v , j * = v , k * = v , u * = v , v * = v , w * = v ) ; return * this ; }
FI XYZval < T > & operator * = ( const int & v ) { NUM _AXIS_CODE( x * = v , y * = v , z * = v , i * = v , j * = v , k * = v , u * = v , v * = v , w * = v ) ; return * this ; }
FI XYZval < T > & operator > > = ( const int & v ) { NUM _AXIS_CODE( _RS ( x ) , _RS ( y ) , _RS ( z ) , _RS ( i ) , _RS ( j ) , _RS ( k ) , _RS ( u ) , _RS ( v ) , _RS ( w ) ) ; return * this ; }
FI XYZval < T > & operator < < = ( const int & v ) { NUM _AXIS_CODE( _LS ( x ) , _LS ( y ) , _LS ( z ) , _LS ( i ) , _LS ( j ) , _LS ( k ) , _LS ( u ) , _LS ( v ) , _LS ( w ) ) ; return * this ; }
// Exact comparisons. For floats a "NEAR" operation may be better.
FI bool operator = = ( const XYZEval < T > & rs ) { return true LINEAR _AXIS_GANG( & & x = = rs . x , & & y = = rs . y , & & z = = rs . z , & & i = = rs . i , & & j = = rs . j , & & k = = rs . k ) ; }
FI bool operator = = ( const XYZEval < T > & rs ) const { return true LINEAR _AXIS_GANG( & & x = = rs . x , & & y = = rs . y , & & z = = rs . z , & & i = = rs . i , & & j = = rs . j , & & k = = rs . k ) ; }
FI bool operator = = ( const XYZEval < T > & rs ) { return true NUM _AXIS_GANG( & & x = = rs . x , & & y = = rs . y , & & z = = rs . z , & & i = = rs . i , & & j = = rs . j , & & k = = rs . k , & & u = = rs . u , & & v = = rs . v , & & w = = rs . w ) ; }
FI bool operator = = ( const XYZEval < T > & rs ) const { return true NUM _AXIS_GANG( & & x = = rs . x , & & y = = rs . y , & & z = = rs . z , & & i = = rs . i , & & j = = rs . j , & & k = = rs . k , & & u = = rs . u , & & v = = rs . v , & & w = = rs . w ) ; }
FI bool operator ! = ( const XYZEval < T > & rs ) { return ! operator = = ( rs ) ; }
FI bool operator ! = ( const XYZEval < T > & rs ) const { return ! operator = = ( rs ) ; }
} ;
@ -585,56 +612,66 @@ template<typename T>
struct XYZEval {
union {
struct { T LOGICAL_AXIS_ARGS ( ) ; } ;
struct { T LOGICAL_AXIS_LIST ( _e , a , b , c , u , v , w ) ; } ;
struct { T LOGICAL_AXIS_LIST ( _e , a , b , c , _i , _j , _k , _ u, _ v, _ w) ; } ;
T pos [ LOGICAL_AXES ] ;
} ;
// Reset all to 0
FI void reset ( ) { LOGICAL_AXIS_GANG ( e = , x = , y = , z = , i = , j = , k = ) 0 ; }
FI void reset ( ) { LOGICAL_AXIS_GANG ( e = , x = , y = , z = , i = , j = , k = , u = , v = , w = ) 0 ; }
// Setters for some number of linear axes, not all
FI void set ( const T px ) { x = px ; }
FI void set ( const T px , const T py ) { x = px ; y = py ; }
FI void set ( const T px ) { x = px ; }
FI void set ( const T px , const T py ) { x = px ; y = py ; }
# if HAS_I_AXIS
FI void set ( const T px , const T py , const T pz ) { x = px ; y = py ; z = pz ; }
FI void set ( const T px , const T py , const T pz ) { x = px ; y = py ; z = pz ; }
# endif
# if HAS_J_AXIS
FI void set ( const T px , const T py , const T pz , const T pi ) { x = px ; y = py ; z = pz ; i = pi ; }
FI void set ( const T px , const T py , const T pz , const T pi ) { x = px ; y = py ; z = pz ; i = pi ; }
# endif
# if HAS_K_AXIS
FI void set ( const T px , const T py , const T pz , const T pi , const T pj ) { x = px ; y = py ; z = pz ; i = pi ; j = pj ; }
FI void set ( const T px , const T py , const T pz , const T pi , const T pj ) { x = px ; y = py ; z = pz ; i = pi ; j = pj ; }
# endif
# if HAS_U_AXIS
FI void set ( const T px , const T py , const T pz , const T pi , const T pj , const T pk ) { x = px ; y = py ; z = pz ; i = pi ; j = pj ; k = pk ; }
# endif
# if HAS_V_AXIS
FI void set ( const T px , const T py , const T pz , const T pi , const T pj , const T pk , const T pm ) { x = px ; y = py ; z = pz ; i = pi ; j = pj ; k = pk ; u = pu ; }
# endif
# if HAS_W_AXIS
FI void set ( const T px , const T py , const T pz , const T pi , const T pj , const T pk , const T pm , const T po ) { x = px ; y = py ; z = pz ; i = pi ; j = pj ; k = pk ; u = pm ; v = pv ; }
# endif
// Setters taking struct types and arrays
FI void set ( const XYval < T > pxy ) { x = pxy . x ; y = pxy . y ; }
FI void set ( const XYZval < T > pxyz ) { set ( LINEAR_AXIS_ELEM ( pxyz ) ) ; }
FI void set ( const XYval < T > pxy ) { x = pxy . x ; y = pxy . y ; }
FI void set ( const XYZval < T > pxyz ) { set ( NUM _AXIS_ELEM( pxyz ) ) ; }
# if HAS_Z_AXIS
FI void set ( LINEAR_AXIS_ARGS ( const T ) ) { LINEAR_AXIS_CODE ( a = x , b = y , c = z , u = i , v = j , w = k ) ; }
FI void set ( NUM _AXIS_ARGS( const T ) ) { NUM _AXIS_CODE ( a = x , b = y , c = z , _i = i , _j = j , _k = k , _ u = u , _v = v , _w = w ) ; }
# endif
FI void set ( const XYval < T > pxy , const T pz ) { set ( pxy ) ; TERN_ ( HAS_Z_AXIS , z = pz ) ; }
# if LOGICAL_AXES > LINEAR _AXES
FI void set ( const XYval < T > pxy , const T pz ) { set ( pxy ) ; TERN_ ( HAS_Z_AXIS , z = pz ) ; }
# if LOGICAL_AXES > NUM _AXES
FI void set ( const XYval < T > pxy , const T pz , const T pe ) { set ( pxy , pz ) ; e = pe ; }
FI void set ( const XYZval < T > pxyz , const T pe ) { set ( pxyz ) ; e = pe ; }
FI void set ( LOGICAL_AXIS_ARGS ( const T ) ) { LOGICAL_AXIS_CODE ( _e = e , a = x , b = y , c = z , u = i , v = j , w = k ) ; }
FI void set ( const XYZval < T > pxyz , const T pe ) { set ( pxyz ) ; e = pe ; }
FI void set ( LOGICAL_AXIS_ARGS ( const T ) ) { LOGICAL_AXIS_CODE ( _e = e , a = x , b = y , c = z , _i = i , _j = j , _k = k , _u = u , _v = v , _w = w ) ; }
# endif
// Length reduced to one dimension
FI T magnitude ( ) const { return ( T ) sqrtf ( LOGICAL_AXIS_GANG ( + e * e , + x * x , + y * y , + z * z , + i * i , + j * j , + k * k ) ) ; }
FI T magnitude ( ) const { return ( T ) sqrtf ( LOGICAL_AXIS_GANG ( + e * e , + x * x , + y * y , + z * z , + i * i , + j * j , + k * k , + u * u , + v * v , + w * w ) ) ; }
// Pointer to the data as a simple array
FI operator T * ( ) { return pos ; }
// If any element is true then it's true
FI operator bool ( ) { return 0 LOGICAL_AXIS_GANG ( | | e , | | x , | | y , | | z , | | i , | | j , | | k ) ; }
FI operator bool ( ) { return 0 LOGICAL_AXIS_GANG ( | | e , | | x , | | y , | | z , | | i , | | j , | | k , | | u , | | v , | | w ) ; }
// Explicit copy and copies with conversion
FI XYZEval < T > copy ( ) const { XYZEval < T > o = * this ; return o ; }
FI XYZEval < T > ABS ( ) const { return LOGICAL_AXIS_ARRAY ( T ( _ABS ( e ) ) , T ( _ABS ( x ) ) , T ( _ABS ( y ) ) , T ( _ABS ( z ) ) , T ( _ABS ( i ) ) , T ( _ABS ( j ) ) , T ( _ABS ( k ) ) ) ; }
FI XYZEval < int16_t > asInt ( ) { return LOGICAL_AXIS_ARRAY ( int16_t ( e ) , int16_t ( x ) , int16_t ( y ) , int16_t ( z ) , int16_t ( i ) , int16_t ( j ) , int16_t ( k ) ) ; }
FI XYZEval < int16_t > asInt ( ) const { return LOGICAL_AXIS_ARRAY ( int16_t ( e ) , int16_t ( x ) , int16_t ( y ) , int16_t ( z ) , int16_t ( i ) , int16_t ( j ) , int16_t ( k ) ) ; }
FI XYZEval < int32_t > asLong ( ) { return LOGICAL_AXIS_ARRAY ( int32_t ( e ) , int32_t ( x ) , int32_t ( y ) , int32_t ( z ) , int32_t ( i ) , int32_t ( j ) , int32_t ( k ) ) ; }
FI XYZEval < int32_t > asLong ( ) const { return LOGICAL_AXIS_ARRAY ( int32_t ( e ) , int32_t ( x ) , int32_t ( y ) , int32_t ( z ) , int32_t ( i ) , int32_t ( j ) , int32_t ( k ) ) ; }
FI XYZEval < int32_t > ROUNDL ( ) { return LOGICAL_AXIS_ARRAY ( int32_t ( LROUND ( e ) ) , int32_t ( LROUND ( x ) ) , int32_t ( LROUND ( y ) ) , int32_t ( LROUND ( z ) ) , int32_t ( LROUND ( i ) ) , int32_t ( LROUND ( j ) ) , int32_t ( LROUND ( k ) ) ) ; }
FI XYZEval < int32_t > ROUNDL ( ) const { return LOGICAL_AXIS_ARRAY ( int32_t ( LROUND ( e ) ) , int32_t ( LROUND ( x ) ) , int32_t ( LROUND ( y ) ) , int32_t ( LROUND ( z ) ) , int32_t ( LROUND ( i ) ) , int32_t ( LROUND ( j ) ) , int32_t ( LROUND ( k ) ) ) ; }
FI XYZEval < float > asFloat ( ) { return LOGICAL_AXIS_ARRAY ( static_cast < float > ( e ) , static_cast < float > ( x ) , static_cast < float > ( y ) , static_cast < float > ( z ) , static_cast < float > ( i ) , static_cast < float > ( j ) , static_cast < float > ( k ) ) ; }
FI XYZEval < float > asFloat ( ) const { return LOGICAL_AXIS_ARRAY ( static_cast < float > ( e ) , static_cast < float > ( x ) , static_cast < float > ( y ) , static_cast < float > ( z ) , static_cast < float > ( i ) , static_cast < float > ( j ) , static_cast < float > ( k ) ) ; }
FI XYZEval < float > reciprocal ( ) const { return LOGICAL_AXIS_ARRAY ( _RECIP ( e ) , _RECIP ( x ) , _RECIP ( y ) , _RECIP ( z ) , _RECIP ( i ) , _RECIP ( j ) , _RECIP ( k ) ) ; }
FI XYZEval < T > copy ( ) const { XYZEval < T > v = * this ; return v ; }
FI XYZEval < T > ABS ( ) const { return LOGICAL_AXIS_ARRAY ( T ( _ABS ( e ) ) , T ( _ABS ( x ) ) , T ( _ABS ( y ) ) , T ( _ABS ( z ) ) , T ( _ABS ( i ) ) , T ( _ABS ( j ) ) , T ( _ABS ( k ) ) , T ( _ABS ( u ) ) , T ( _ABS ( v ) ) , T ( _ABS ( w ) ) ) ; }
FI XYZEval < int16_t > asInt ( ) { return LOGICAL_AXIS_ARRAY ( int16_t ( e ) , int16_t ( x ) , int16_t ( y ) , int16_t ( z ) , int16_t ( i ) , int16_t ( j ) , int16_t ( k ) , int16_t ( u ) , int16_t ( v ) , int16_t ( w ) ) ; }
FI XYZEval < int16_t > asInt ( ) const { return LOGICAL_AXIS_ARRAY ( int16_t ( e ) , int16_t ( x ) , int16_t ( y ) , int16_t ( z ) , int16_t ( i ) , int16_t ( j ) , int16_t ( k ) , int16_t ( u ) , int16_t ( v ) , int16_t ( w ) ) ; }
FI XYZEval < int32_t > asLong ( ) { return LOGICAL_AXIS_ARRAY ( int32_t ( e ) , int32_t ( x ) , int32_t ( y ) , int32_t ( z ) , int32_t ( i ) , int32_t ( j ) , int32_t ( k ) , int32_t ( u ) , int32_t ( v ) , int32_t ( w ) ) ; }
FI XYZEval < int32_t > asLong ( ) const { return LOGICAL_AXIS_ARRAY ( int32_t ( e ) , int32_t ( x ) , int32_t ( y ) , int32_t ( z ) , int32_t ( i ) , int32_t ( j ) , int32_t ( k ) , int32_t ( u ) , int32_t ( v ) , int32_t ( w ) ) ; }
FI XYZEval < int32_t > ROUNDL ( ) { return LOGICAL_AXIS_ARRAY ( int32_t ( LROUND ( e ) ) , int32_t ( LROUND ( x ) ) , int32_t ( LROUND ( y ) ) , int32_t ( LROUND ( z ) ) , int32_t ( LROUND ( i ) ) , int32_t ( LROUND ( j ) ) , int32_t ( LROUND ( k ) ) , int32_t ( LROUND ( u ) ) , int32_t ( LROUND ( v ) ) , int32_t ( LROUND ( w ) ) ) ; }
FI XYZEval < int32_t > ROUNDL ( ) const { return LOGICAL_AXIS_ARRAY ( int32_t ( LROUND ( e ) ) , int32_t ( LROUND ( x ) ) , int32_t ( LROUND ( y ) ) , int32_t ( LROUND ( z ) ) , int32_t ( LROUND ( i ) ) , int32_t ( LROUND ( j ) ) , int32_t ( LROUND ( k ) ) , int32_t ( LROUND ( u ) ) , int32_t ( LROUND ( v ) ) , int32_t ( LROUND ( w ) ) ) ; }
FI XYZEval < float > asFloat ( ) { return LOGICAL_AXIS_ARRAY ( static_cast < float > ( e ) , static_cast < float > ( x ) , static_cast < float > ( y ) , static_cast < float > ( z ) , static_cast < float > ( i ) , static_cast < float > ( j ) , static_cast < float > ( k ) , static_cast < float > ( u ) , static_cast < float > ( v ) , static_cast < float > ( w ) ) ; }
FI XYZEval < float > asFloat ( ) const { return LOGICAL_AXIS_ARRAY ( static_cast < float > ( e ) , static_cast < float > ( x ) , static_cast < float > ( y ) , static_cast < float > ( z ) , static_cast < float > ( i ) , static_cast < float > ( j ) , static_cast < float > ( k ) , static_cast < float > ( u ) , static_cast < float > ( v ) , static_cast < float > ( w ) ) ; }
FI XYZEval < float > reciprocal ( ) const { return LOGICAL_AXIS_ARRAY ( _RECIP ( e ) , _RECIP ( x ) , _RECIP ( y ) , _RECIP ( z ) , _RECIP ( i ) , _RECIP ( j ) , _RECIP ( k ) , _RECIP ( u ) , _RECIP ( v ) , _RECIP ( w ) ) ; }
// Marlin workspace shifting is done with G92 and M206
FI XYZEval < float > asLogical ( ) const { XYZEval < float > o = asFloat ( ) ; toLogical ( o ) ; return o ; }
@ -651,9 +688,9 @@ struct XYZEval {
FI const T & operator [ ] ( const int n ) const { return pos [ n ] ; }
// Assignment operator overrides do the expected thing
FI XYZEval < T > & operator = ( const T v ) { set ( LIST_N_1 ( LINEAR _AXES, v ) ) ; return * this ; }
FI XYZEval < T > & operator = ( const T v ) { set ( LIST_N_1 ( NUM _AXES, v ) ) ; return * this ; }
FI XYZEval < T > & operator = ( const XYval < T > & rs ) { set ( rs . x , rs . y ) ; return * this ; }
FI XYZEval < T > & operator = ( const XYZval < T > & rs ) { set ( LINEAR _AXIS_ELEM( rs ) ) ; return * this ; }
FI XYZEval < T > & operator = ( const XYZval < T > & rs ) { set ( NUM _AXIS_ELEM( rs ) ) ; return * this ; }
// Override other operators to get intuitive behaviors
FI XYZEval < T > operator + ( const XYval < T > & rs ) const { XYZEval < T > ls = * this ; ls . x + = rs . x ; ls . y + = rs . y ; return ls ; }
@ -664,57 +701,57 @@ struct XYZEval {
FI XYZEval < T > operator * ( const XYval < T > & rs ) { XYZEval < T > ls = * this ; ls . x * = rs . x ; ls . y * = rs . y ; return ls ; }
FI XYZEval < T > operator / ( const XYval < T > & rs ) const { XYZEval < T > ls = * this ; ls . x / = rs . x ; ls . y / = rs . y ; return ls ; }
FI XYZEval < T > operator / ( const XYval < T > & rs ) { XYZEval < T > ls = * this ; ls . x / = rs . x ; ls . y / = rs . y ; return ls ; }
FI XYZEval < T > operator + ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k ) ; return ls ; }
FI XYZEval < T > operator + ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k ) ; return ls ; }
FI XYZEval < T > operator - ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k ) ; return ls ; }
FI XYZEval < T > operator - ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k ) ; return ls ; }
FI XYZEval < T > operator * ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k ) ; return ls ; }
FI XYZEval < T > operator * ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k ) ; return ls ; }
FI XYZEval < T > operator / ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k ) ; return ls ; }
FI XYZEval < T > operator / ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; LINEAR _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k ) ; return ls ; }
FI XYZEval < T > operator + ( const XYZEval < T > & rs ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e + = rs . e , ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k ) ; return ls ; }
FI XYZEval < T > operator + ( const XYZEval < T > & rs ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e + = rs . e , ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k ) ; return ls ; }
FI XYZEval < T > operator - ( const XYZEval < T > & rs ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e - = rs . e , ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k ) ; return ls ; }
FI XYZEval < T > operator - ( const XYZEval < T > & rs ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e - = rs . e , ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k ) ; return ls ; }
FI XYZEval < T > operator * ( const XYZEval < T > & rs ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = rs . e , ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k ) ; return ls ; }
FI XYZEval < T > operator * ( const XYZEval < T > & rs ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = rs . e , ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k ) ; return ls ; }
FI XYZEval < T > operator / ( const XYZEval < T > & rs ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = rs . e , ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k ) ; return ls ; }
FI XYZEval < T > operator / ( const XYZEval < T > & rs ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = rs . e , ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k ) ; return ls ; }
FI XYZEval < T > operator * ( const float & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = v , ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v ) ; return ls ; }
FI XYZEval < T > operator * ( const float & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = v , ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v ) ; return ls ; }
FI XYZEval < T > operator * ( const int & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = v , ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v ) ; return ls ; }
FI XYZEval < T > operator * ( const int & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = v , ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v ) ; return ls ; }
FI XYZEval < T > operator / ( const float & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = v , ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v ) ; return ls ; }
FI XYZEval < T > operator / ( const float & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = v , ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v ) ; return ls ; }
FI XYZEval < T > operator / ( const int & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = v , ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v ) ; return ls ; }
FI XYZEval < T > operator / ( const int & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = v , ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v ) ; return ls ; }
FI XYZEval < T > operator > > ( const int & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( _RS ( ls . e ) , _RS ( ls . x ) , _RS ( ls . y ) , _RS ( ls . z ) , _RS ( ls . i ) , _RS ( ls . j ) , _RS ( ls . k ) ) ; return ls ; }
FI XYZEval < T > operator > > ( const int & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( _RS ( ls . e ) , _RS ( ls . x ) , _RS ( ls . y ) , _RS ( ls . z ) , _RS ( ls . i ) , _RS ( ls . j ) , _RS ( ls . k ) ) ; return ls ; }
FI XYZEval < T > operator < < ( const int & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( _LS ( ls . e ) , _LS ( ls . x ) , _LS ( ls . y ) , _LS ( ls . z ) , _LS ( ls . i ) , _LS ( ls . j ) , _LS ( ls . k ) ) ; return ls ; }
FI XYZEval < T > operator < < ( const int & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( _LS ( ls . e ) , _LS ( ls . x ) , _LS ( ls . y ) , _LS ( ls . z ) , _LS ( ls . i ) , _LS ( ls . j ) , _LS ( ls . k ) ) ; return ls ; }
FI const XYZEval < T > operator - ( ) const { return LOGICAL_AXIS_ARRAY ( - e , - x , - y , - z , - i , - j , - k ) ; }
FI XYZEval < T > operator - ( ) { return LOGICAL_AXIS_ARRAY ( - e , - x , - y , - z , - i , - j , - k ) ; }
FI XYZEval < T > operator + ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k , ls . u + = rs . u , ls . v + = rs . v , ls . w + = rs . w ) ; return ls ; }
FI XYZEval < T > operator + ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k , ls . u + = rs . u , ls . v + = rs . v , ls . w + = rs . w ) ; return ls ; }
FI XYZEval < T > operator - ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k , ls . u - = rs . u , ls . v - = rs . v , ls . w - = rs . w ) ; return ls ; }
FI XYZEval < T > operator - ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k , ls . u - = rs . u , ls . v - = rs . v , ls . w - = rs . w ) ; return ls ; }
FI XYZEval < T > operator * ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k , ls . u * = rs . u , ls . v * = rs . v , ls . w * = rs . w ) ; return ls ; }
FI XYZEval < T > operator * ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k , ls . u * = rs . u , ls . v * = rs . v , ls . w * = rs . w ) ; return ls ; }
FI XYZEval < T > operator / ( const XYZval < T > & rs ) const { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k , ls . u / = rs . u , ls . v / = rs . v , ls . w / = rs . w ) ; return ls ; }
FI XYZEval < T > operator / ( const XYZval < T > & rs ) { XYZval < T > ls = * this ; NUM _AXIS_CODE( ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k , ls . u / = rs . u , ls . v / = rs . v , ls . w / = rs . w ) ; return ls ; }
FI XYZEval < T > operator + ( const XYZEval < T > & rs ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e + = rs . e , ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k , ls . u + = rs . u , ls . v + = rs . v , ls . w + = rs . w ) ; return ls ; }
FI XYZEval < T > operator + ( const XYZEval < T > & rs ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e + = rs . e , ls . x + = rs . x , ls . y + = rs . y , ls . z + = rs . z , ls . i + = rs . i , ls . j + = rs . j , ls . k + = rs . k , ls . u + = rs . u , ls . v + = rs . v , ls . w + = rs . w ) ; return ls ; }
FI XYZEval < T > operator - ( const XYZEval < T > & rs ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e - = rs . e , ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k , ls . u - = rs . u , ls . v - = rs . v , ls . w - = rs . w ) ; return ls ; }
FI XYZEval < T > operator - ( const XYZEval < T > & rs ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e - = rs . e , ls . x - = rs . x , ls . y - = rs . y , ls . z - = rs . z , ls . i - = rs . i , ls . j - = rs . j , ls . k - = rs . k , ls . u - = rs . u , ls . v - = rs . v , ls . w - = rs . w ) ; return ls ; }
FI XYZEval < T > operator * ( const XYZEval < T > & rs ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = rs . e , ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k , ls . u * = rs . u , ls . v * = rs . v , ls . w * = rs . w ) ; return ls ; }
FI XYZEval < T > operator * ( const XYZEval < T > & rs ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = rs . e , ls . x * = rs . x , ls . y * = rs . y , ls . z * = rs . z , ls . i * = rs . i , ls . j * = rs . j , ls . k * = rs . k , ls . u * = rs . u , ls . v * = rs . v , ls . w * = rs . w ) ; return ls ; }
FI XYZEval < T > operator / ( const XYZEval < T > & rs ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = rs . e , ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k , ls . u / = rs . u , ls . v / = rs . v , ls . w / = rs . w ) ; return ls ; }
FI XYZEval < T > operator / ( const XYZEval < T > & rs ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = rs . e , ls . x / = rs . x , ls . y / = rs . y , ls . z / = rs . z , ls . i / = rs . i , ls . j / = rs . j , ls . k / = rs . k , ls . u / = rs . u , ls . v / = rs . v , ls . w / = rs . w ) ; return ls ; }
FI XYZEval < T > operator * ( const float & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = v , ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v , ls . u * = v , ls . v * = v , ls . w * = v ) ; return ls ; }
FI XYZEval < T > operator * ( const float & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = v , ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v , ls . u * = v , ls . v * = v , ls . w * = v ) ; return ls ; }
FI XYZEval < T > operator * ( const int & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = v , ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v , ls . u * = v , ls . v * = v , ls . w * = v ) ; return ls ; }
FI XYZEval < T > operator * ( const int & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e * = v , ls . x * = v , ls . y * = v , ls . z * = v , ls . i * = v , ls . j * = v , ls . k * = v , ls . u * = v , ls . v * = v , ls . w * = v ) ; return ls ; }
FI XYZEval < T > operator / ( const float & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = v , ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v , ls . u / = v , ls . v / = v , ls . w / = v ) ; return ls ; }
FI XYZEval < T > operator / ( const float & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = v , ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v , ls . u / = v , ls . v / = v , ls . w / = v ) ; return ls ; }
FI XYZEval < T > operator / ( const int & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = v , ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v , ls . u / = v , ls . v / = v , ls . w / = v ) ; return ls ; }
FI XYZEval < T > operator / ( const int & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( ls . e / = v , ls . x / = v , ls . y / = v , ls . z / = v , ls . i / = v , ls . j / = v , ls . k / = v , ls . u / = v , ls . v / = v , ls . w / = v ) ; return ls ; }
FI XYZEval < T > operator > > ( const int & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( _RS ( ls . e ) , _RS ( ls . x ) , _RS ( ls . y ) , _RS ( ls . z ) , _RS ( ls . i ) , _RS ( ls . j ) , _RS ( ls . k ) , _RS ( ls . u ) , _RS ( ls . v ) , _RS ( ls . w ) ) ; return ls ; }
FI XYZEval < T > operator > > ( const int & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( _RS ( ls . e ) , _RS ( ls . x ) , _RS ( ls . y ) , _RS ( ls . z ) , _RS ( ls . i ) , _RS ( ls . j ) , _RS ( ls . k ) , _RS ( ls . u ) , _RS ( ls . v ) , _RS ( ls . w ) ) ; return ls ; }
FI XYZEval < T > operator < < ( const int & v ) const { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( _LS ( ls . e ) , _LS ( ls . x ) , _LS ( ls . y ) , _LS ( ls . z ) , _LS ( ls . i ) , _LS ( ls . j ) , _LS ( ls . k ) , _LS ( ls . u ) , _LS ( ls . v ) , _LS ( ls . w ) ) ; return ls ; }
FI XYZEval < T > operator < < ( const int & v ) { XYZEval < T > ls = * this ; LOGICAL_AXIS_CODE ( _LS ( ls . e ) , _LS ( ls . x ) , _LS ( ls . y ) , _LS ( ls . z ) , _LS ( ls . i ) , _LS ( ls . j ) , _LS ( ls . k ) , _LS ( ls . u ) , _LS ( ls . v ) , _LS ( ls . w ) ) ; return ls ; }
FI const XYZEval < T > operator - ( ) const { return LOGICAL_AXIS_ARRAY ( - e , - x , - y , - z , - i , - j , - k , - u , - v , - w ) ; }
FI XYZEval < T > operator - ( ) { return LOGICAL_AXIS_ARRAY ( - e , - x , - y , - z , - i , - j , - k , - u , - v , - w ) ; }
// Modifier operators
FI XYZEval < T > & operator + = ( const XYval < T > & rs ) { x + = rs . x ; y + = rs . y ; return * this ; }
FI XYZEval < T > & operator - = ( const XYval < T > & rs ) { x - = rs . x ; y - = rs . y ; return * this ; }
FI XYZEval < T > & operator * = ( const XYval < T > & rs ) { x * = rs . x ; y * = rs . y ; return * this ; }
FI XYZEval < T > & operator / = ( const XYval < T > & rs ) { x / = rs . x ; y / = rs . y ; return * this ; }
FI XYZEval < T > & operator + = ( const XYZval < T > & rs ) { LINEAR _AXIS_CODE( x + = rs . x , y + = rs . y , z + = rs . z , i + = rs . i , j + = rs . j , k + = rs . k ) ; return * this ; }
FI XYZEval < T > & operator - = ( const XYZval < T > & rs ) { LINEAR _AXIS_CODE( x - = rs . x , y - = rs . y , z - = rs . z , i - = rs . i , j - = rs . j , k - = rs . k ) ; return * this ; }
FI XYZEval < T > & operator * = ( const XYZval < T > & rs ) { LINEAR _AXIS_CODE( x * = rs . x , y * = rs . y , z * = rs . z , i * = rs . i , j * = rs . j , k * = rs . k ) ; return * this ; }
FI XYZEval < T > & operator / = ( const XYZval < T > & rs ) { LINEAR _AXIS_CODE( x / = rs . x , y / = rs . y , z / = rs . z , i / = rs . i , j / = rs . j , k / = rs . k ) ; return * this ; }
FI XYZEval < T > & operator + = ( const XYZEval < T > & rs ) { LOGICAL_AXIS_CODE ( e + = rs . e , x + = rs . x , y + = rs . y , z + = rs . z , i + = rs . i , j + = rs . j , k + = rs . k ) ; return * this ; }
FI XYZEval < T > & operator - = ( const XYZEval < T > & rs ) { LOGICAL_AXIS_CODE ( e - = rs . e , x - = rs . x , y - = rs . y , z - = rs . z , i - = rs . i , j - = rs . j , k - = rs . k ) ; return * this ; }
FI XYZEval < T > & operator * = ( const XYZEval < T > & rs ) { LOGICAL_AXIS_CODE ( e * = rs . e , x * = rs . x , y * = rs . y , z * = rs . z , i * = rs . i , j * = rs . j , k * = rs . k ) ; return * this ; }
FI XYZEval < T > & operator / = ( const XYZEval < T > & rs ) { LOGICAL_AXIS_CODE ( e / = rs . e , x / = rs . x , y / = rs . y , z / = rs . z , i / = rs . i , j / = rs . j , k / = rs . k ) ; return * this ; }
FI XYZEval < T > & operator * = ( const T & v ) { LOGICAL_AXIS_CODE ( e * = v , x * = v , y * = v , z * = v , i * = v , j * = v , k * = v ) ; return * this ; }
FI XYZEval < T > & operator > > = ( const int & v ) { LOGICAL_AXIS_CODE ( _RS ( e ) , _RS ( x ) , _RS ( y ) , _RS ( z ) , _RS ( i ) , _RS ( j ) , _RS ( k ) ) ; return * this ; }
FI XYZEval < T > & operator < < = ( const int & v ) { LOGICAL_AXIS_CODE ( _LS ( e ) , _LS ( x ) , _LS ( y ) , _LS ( z ) , _LS ( i ) , _LS ( j ) , _LS ( k ) ) ; return * this ; }
FI XYZEval < T > & operator + = ( const XYZval < T > & rs ) { NUM _AXIS_CODE( x + = rs . x , y + = rs . y , z + = rs . z , i + = rs . i , j + = rs . j , k + = rs . k , u + = rs . u , v + = rs . v , w + = rs . w ) ; return * this ; }
FI XYZEval < T > & operator - = ( const XYZval < T > & rs ) { NUM _AXIS_CODE( x - = rs . x , y - = rs . y , z - = rs . z , i - = rs . i , j - = rs . j , k - = rs . k , u - = rs . u , v - = rs . v , w - = rs . w ) ; return * this ; }
FI XYZEval < T > & operator * = ( const XYZval < T > & rs ) { NUM _AXIS_CODE( x * = rs . x , y * = rs . y , z * = rs . z , i * = rs . i , j * = rs . j , k * = rs . k , u * = rs . u , v * = rs . v , w * = rs . w ) ; return * this ; }
FI XYZEval < T > & operator / = ( const XYZval < T > & rs ) { NUM _AXIS_CODE( x / = rs . x , y / = rs . y , z / = rs . z , i / = rs . i , j / = rs . j , k / = rs . k , u / = rs . u , v / = rs . v , w / = rs . w ) ; return * this ; }
FI XYZEval < T > & operator + = ( const XYZEval < T > & rs ) { LOGICAL_AXIS_CODE ( e + = rs . e , x + = rs . x , y + = rs . y , z + = rs . z , i + = rs . i , j + = rs . j , k + = rs . k , u + = rs . u , v + = rs . v , w + = rs . w ) ; return * this ; }
FI XYZEval < T > & operator - = ( const XYZEval < T > & rs ) { LOGICAL_AXIS_CODE ( e - = rs . e , x - = rs . x , y - = rs . y , z - = rs . z , i - = rs . i , j - = rs . j , k - = rs . k , u - = rs . u , v - = rs . v , w - = rs . w ) ; return * this ; }
FI XYZEval < T > & operator * = ( const XYZEval < T > & rs ) { LOGICAL_AXIS_CODE ( e * = rs . e , x * = rs . x , y * = rs . y , z * = rs . z , i * = rs . i , j * = rs . j , k * = rs . k , u * = rs . u , v * = rs . v , w * = rs . w ) ; return * this ; }
FI XYZEval < T > & operator / = ( const XYZEval < T > & rs ) { LOGICAL_AXIS_CODE ( e / = rs . e , x / = rs . x , y / = rs . y , z / = rs . z , i / = rs . i , j / = rs . j , k / = rs . k , u / = rs . u , v / = rs . v , w / = rs . w ) ; return * this ; }
FI XYZEval < T > & operator * = ( const T & v ) { LOGICAL_AXIS_CODE ( e * = v , x * = v , y * = v , z * = v , i * = v , j * = v , k * = v , u * = v , v * = v , w * = v ) ; return * this ; }
FI XYZEval < T > & operator > > = ( const int & v ) { LOGICAL_AXIS_CODE ( _RS ( e ) , _RS ( x ) , _RS ( y ) , _RS ( z ) , _RS ( i ) , _RS ( j ) , _RS ( k ) , _RS ( u ) , _RS ( v ) , _RS ( w ) ) ; return * this ; }
FI XYZEval < T > & operator < < = ( const int & v ) { LOGICAL_AXIS_CODE ( _LS ( e ) , _LS ( x ) , _LS ( y ) , _LS ( z ) , _LS ( i ) , _LS ( j ) , _LS ( k ) , _LS ( u ) , _LS ( v ) , _LS ( w ) ) ; return * this ; }
// Exact comparisons. For floats a "NEAR" operation may be better.
FI bool operator = = ( const XYZval < T > & rs ) { return true LINEAR _AXIS_GANG( & & x = = rs . x , & & y = = rs . y , & & z = = rs . z , & & i = = rs . i , & & j = = rs . j , & & k = = rs . k ) ; }
FI bool operator = = ( const XYZval < T > & rs ) const { return true LINEAR _AXIS_GANG( & & x = = rs . x , & & y = = rs . y , & & z = = rs . z , & & i = = rs . i , & & j = = rs . j , & & k = = rs . k ) ; }
FI bool operator = = ( const XYZval < T > & rs ) { return true NUM _AXIS_GANG( & & x = = rs . x , & & y = = rs . y , & & z = = rs . z , & & i = = rs . i , & & j = = rs . j , & & k = = rs . k , & & u = = rs . u , & & v = = rs . v , & & w = = rs . w ) ; }
FI bool operator = = ( const XYZval < T > & rs ) const { return true NUM _AXIS_GANG( & & x = = rs . x , & & y = = rs . y , & & z = = rs . z , & & i = = rs . i , & & j = = rs . j , & & k = = rs . k , & & u = = rs . u , & & v = = rs . v , & & w = = rs . w ) ; }
FI bool operator ! = ( const XYZval < T > & rs ) { return ! operator = = ( rs ) ; }
FI bool operator ! = ( const XYZval < T > & rs ) const { return ! operator = = ( rs ) ; }
} ;