00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013
00014 #ifndef _GENERICARITHMETICI_H_
00015 #define _GENERICARITHMETICI_H_
00016
00017 #include <functional>
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 template< class C >
00100 C operatorOp( const C& c1, const C& c2, C& (C::*op)(const C&) )
00101 {
00102 C result( c1 );
00103 (result.*op)( c2 );
00104 return result;
00105 }
00106
00107
00108 template< class C >
00109 C operatorOpScalar( const C& c1, const typename C::scalar_type& x,
00110 C& (C::*op)(const typename C::scalar_type&) )
00111 {
00112 C result( c1 );
00113 (result.*op)( x );
00114 return result;
00115 }
00116
00117
00118
00119
00120 template<class C> typename C::self_type operator+( const C& c1, const C& c2 )
00121 {
00122 return operatorOp< C >( c1, c2, &C::operator+= );
00123 }
00124 template<class C> typename C::self_type operator-( const C& c1, const C& c2 )
00125 {
00126 return operatorOp< C >( c1, c2, &C::operator-= );
00127 }
00128 template<class C> typename C::self_type operator*( const C& c1, const C& c2 )
00129 {
00130 return operatorOp< C >( c1, c2, &C::operator*= );
00131 }
00132 template<class C> typename C::self_type operator/( const C& c1, const C& c2 )
00133 {
00134 return operatorOp< C >( c1, c2, &C::operator/= );
00135 }
00136
00137
00138
00139
00140 template<class C> typename C::self_type operator+( const C& c, const typename C::scalar_type& x )
00141 {
00142 return operatorOpScalar<C>( c, x, &C::operator+= );
00143 }
00144 template<class C> typename C::self_type operator+( const typename C::scalar_type& x, const C& c )
00145 {
00146 return c + x;
00147 }
00148
00149 template<class C> typename C::self_type operator*( const C& c, const typename C::scalar_type& x )
00150 {
00151 return operatorOpScalar<C>( c, x, &C::operator*= );
00152 }
00153 template<class C> typename C::self_type operator*( const typename C::scalar_type& x, const C& c )
00154 {
00155 return c * x;
00156 }
00157
00158 template<class C> typename C::self_type operator-( const C& c, const typename C::scalar_type& x )
00159 {
00160 return operatorOpScalar<C>( c, x, &C::operator-= );
00161 }
00162 template<class C> typename C::self_type operator-( const typename C::scalar_type& x, const C& c )
00163 {
00164 C temp( c );
00165 return (-temp) + x;
00166 }
00167
00168 template<class C> typename C::self_type operator/( const C& c, const typename C::scalar_type& x )
00169 {
00170 return operatorOpScalar<C>( c, x, &C::operator/= );
00171 }
00172 template<class C> typename C::self_type operator/( const typename C::scalar_type& x, const C& c )
00173 {
00174 C temp( c );
00175 return temp.reciprocal() * x;
00176
00177
00178 }
00179
00180 #include "BaseNamespaceFooter.H"
00181
00182 #endif // include guard