00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _GENERICARITHMETIC_H_
00025 #define _GENERICARITHMETIC_H_
00026
00027 #include "BaseNamespaceHeader.H"
00028
00051 template<typename ScalarT, typename SelfT>
00052 struct GenericArithmeticable
00053 {
00054 virtual ~GenericArithmeticable() {}
00055 typedef ScalarT scalar_type;
00056 typedef SelfT self_type;
00057
00058 public:
00059 GenericArithmeticable( SelfT * s ) : m_child( s ) { }
00060
00061 bool operator<(const SelfT&) const;
00062 bool operator>(const SelfT&) const;
00063 bool operator<=(const SelfT&) const;
00064 bool operator>=(const SelfT&) const;
00065
00066 SelfT& operator+=(const SelfT&);
00067 SelfT& operator+=(const ScalarT&);
00068 SelfT& operator-=(const SelfT&);
00069 SelfT& operator-=(const ScalarT&);
00070 SelfT& operator*=(const SelfT&);
00071 SelfT& operator*=(const ScalarT&);
00072 SelfT& operator/=(const SelfT&);
00073 SelfT& operator/=(const ScalarT&);
00074
00075 private:
00076 SelfT * m_child;
00077 };
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 template<class C> typename C::self_type operator+( const C&, const C& );
00088 template<class C> typename C::self_type operator+( const C&, const typename C::scalar_type& );
00089 template<class C> typename C::self_type operator+( const typename C::scalar_type&, const C& );
00090
00091 template<class C> typename C::self_type operator*( const C&, const C& );
00092 template<class C> typename C::self_type operator*( const C&, const typename C::scalar_type& );
00093 template<class C> typename C::self_type operator*( const typename C::scalar_type&, const C& );
00094
00095 template<class C> typename C::self_type operator-( const C&, const C& );
00096 template<class C> typename C::self_type operator-( const C&, const typename C::scalar_type& );
00097 template<class C> typename C::self_type operator-( const typename C::scalar_type&, const C& );
00098
00099 template<class C> typename C::self_type operator/( const C&, const C& );
00100 template<class C> typename C::self_type operator/( const C&, const typename C::scalar_type& );
00101 template<class C> typename C::self_type operator/( const typename C::scalar_type&, const C& );
00102
00103 #include "BaseNamespaceFooter.H"
00104
00105 #include "GenericArithmeticI.H"
00106
00107 #endif // include guard