00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013
00014
00015 #ifndef _GENERICARITHMETICI_H_
00016 #define _GENERICARITHMETICI_H_
00017
00018 #include "BaseNamespaceHeader.H"
00019
00020
00021
00022
00023
00024 template<typename ScalarT, typename SelfT> bool
00025 GenericArithmeticable<ScalarT,SelfT>::operator<( const SelfT& rhs ) const
00026 {
00027 return m_child->operatorCompare( rhs, std::less<ScalarT>() );
00028 }
00029
00030 template<typename ScalarT, typename SelfT> bool
00031 GenericArithmeticable<ScalarT,SelfT>::operator>( const SelfT& rhs ) const
00032 {
00033 return m_child->operatorCompare( rhs, std::greater<ScalarT>() );
00034 }
00035
00036 template<typename ScalarT, typename SelfT> bool
00037 GenericArithmeticable<ScalarT,SelfT>::operator<=( const SelfT& rhs ) const
00038 {
00039 return m_child->operatorCompare( rhs, std::less_equal<ScalarT>() );
00040 }
00041
00042 template<typename ScalarT, typename SelfT> bool
00043 GenericArithmeticable<ScalarT,SelfT>::operator>=( const SelfT& rhs ) const
00044 {
00045 return m_child->operatorCompare( rhs, std::greater_equal<ScalarT>() );
00046 }
00047
00048
00049
00050
00051 template<typename ScalarT, typename SelfT> SelfT&
00052 GenericArithmeticable<ScalarT,SelfT>::operator+=(const SelfT& rhs)
00053 {
00054 return m_child->operatorOpEquals( rhs, std::plus<ScalarT>() );
00055 }
00056
00057 template<typename ScalarT, typename SelfT> SelfT&
00058 GenericArithmeticable<ScalarT,SelfT>::operator+=(const ScalarT& a)
00059 {
00060 return m_child->operatorOpEquals( a, std::plus<ScalarT>() );
00061 }
00062
00063 template<typename ScalarT, typename SelfT> SelfT&
00064 GenericArithmeticable<ScalarT,SelfT>::operator-=(const SelfT& rhs)
00065 {
00066 return m_child->operatorOpEquals( rhs, std::minus<ScalarT>() );
00067 }
00068
00069 template<typename ScalarT, typename SelfT> SelfT&
00070 GenericArithmeticable<ScalarT,SelfT>::operator-=(const ScalarT& a)
00071 {
00072 return m_child->operatorOpEquals( a, std::minus<ScalarT>() );
00073 }
00074
00075 template<typename ScalarT, typename SelfT> SelfT&
00076 GenericArithmeticable<ScalarT,SelfT>::operator*=(const SelfT& rhs)
00077 {
00078 return m_child->operatorOpEquals( rhs, std::multiplies<ScalarT>() );
00079 }
00080
00081 template<typename ScalarT, typename SelfT> SelfT&
00082 GenericArithmeticable<ScalarT,SelfT>::operator*=(const ScalarT& a)
00083 {
00084 return m_child->operatorOpEquals( a, std::multiplies<ScalarT>() );
00085 }
00086
00087 template<typename ScalarT, typename SelfT> SelfT&
00088 GenericArithmeticable<ScalarT,SelfT>::operator/=(const SelfT& rhs)
00089 {
00090 return m_child->operatorOpEquals( rhs, std::divides<ScalarT>() );
00091 }
00092
00093 template<typename ScalarT, typename SelfT> SelfT&
00094 GenericArithmeticable<ScalarT,SelfT>::operator/=(const ScalarT& a)
00095 {
00096 return m_child->operatorOpEquals( a, std::divides<ScalarT>() );
00097 }
00098
00099
00100
00101 template< class C >
00102 C operatorOp( const C& c1, const C& c2, C& (C::*op)(const C&) )
00103 {
00104 C result( c1 );
00105 (result.*op)( c2 );
00106 return result;
00107 }
00108
00109
00110 template< class C >
00111 C operatorOpScalar( const C& c1, const typename C::scalar_type& x,
00112 C& (C::*op)(const typename C::scalar_type&) )
00113 {
00114 C result( c1 );
00115 (result.*op)( x );
00116 return result;
00117 }
00118
00119
00120
00121
00122
00123 template<class C> typename C::self_type operator+( const C& c1, const C& c2 )
00124 {
00125 return operatorOp< C >( c1, c2, &C::operator+= );
00126 }
00127 template<class C> typename C::self_type operator-( const C& c1, const C& c2 )
00128 {
00129 return operatorOp< C >( c1, c2, &C::operator-= );
00130 }
00131 template<class C> typename C::self_type operator*( const C& c1, const C& c2 )
00132 {
00133 return operatorOp< C >( c1, c2, &C::operator*= );
00134 }
00135 template<class C> typename C::self_type operator/( const C& c1, const C& c2 )
00136 {
00137 return operatorOp< C >( c1, c2, &C::operator/= );
00138 }
00139
00140
00141
00142
00143
00144 template<class C> typename C::self_type operator+( const C& c, const typename C::scalar_type& x )
00145 {
00146 return operatorOpScalar<C>( c, x, &C::operator+= );
00147 }
00148 template<class C> typename C::self_type operator+( const typename C::scalar_type& x, const C& c )
00149 {
00150 return c + x;
00151 }
00152
00153 template<class C> typename C::self_type operator*( const C& c, const typename C::scalar_type& x )
00154 {
00155 return operatorOpScalar<C>( c, x, &C::operator*= );
00156 }
00157 template<class C> typename C::self_type operator*( const typename C::scalar_type& x, const C& c )
00158 {
00159 return c * x;
00160 }
00161
00162 template<class C> typename C::self_type operator-( const C& c, const typename C::scalar_type& x )
00163 {
00164 return operatorOpScalar<C>( c, x, &C::operator-= );
00165 }
00166 template<class C> typename C::self_type operator-( const typename C::scalar_type& x, const C& c )
00167 {
00168 C temp( c );
00169 return (-temp) + x;
00170 }
00171
00172 template<class C> typename C::self_type operator/( const C& c, const typename C::scalar_type& x )
00173 {
00174 return operatorOpScalar<C>( c, x, &C::operator/= );
00175 }
00176 template<class C> typename C::self_type operator/( const typename C::scalar_type& x, const C& c )
00177 {
00178 C temp( c );
00179 return temp.reciprocal() * x;
00180
00181
00182 }
00183
00184 #include "BaseNamespaceFooter.H"
00185
00186 #endif // include guard