Vaucanson 1.4
element_ops.hh
Go to the documentation of this file.
00001 // element_ops.hh: this file is part of the Vaucanson project.
00002 //
00003 // Vaucanson, a generic library for finite state machines.
00004 //
00005 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 The Vaucanson Group.
00006 //
00007 // This program is free software; you can redistribute it and/or
00008 // modify it under the terms of the GNU General Public License
00009 // as published by the Free Software Foundation; either version 2
00010 // of the License, or (at your option) any later version.
00011 //
00012 // The complete GNU General Public Licence Notice can be found as the
00013 // `COPYING' file in the root directory.
00014 //
00015 // The Vaucanson Group consists of people listed in the `AUTHORS' file.
00016 //
00017 #ifndef VCSN_DESIGN_PATTERN_ELEMENT_OPS_HH
00018 # define VCSN_DESIGN_PATTERN_ELEMENT_OPS_HH
00019 
00029 # include <vaucanson/design_pattern/element_op_traits.hh>
00030 
00031 namespace vcsn {
00032 
00036   /*-------------------.
00037   | Ordered comparison |
00038   `-------------------*/
00039 
00041   template<typename S1, typename T1, typename S2, typename T2>
00042   static
00043   bool operator<(const vcsn::Element<S1, T1>& e1,
00044                  const vcsn::Element<S2, T2>& e2);
00045 
00047   template<typename S1, typename T1, typename S2, typename T2>
00048   static
00049   bool operator>(const vcsn::Element<S1, T1>& e1,
00050                  const vcsn::Element<S2, T2>& e2);
00051 
00053   template<typename S1, typename T1, typename S2, typename T2>
00054   static
00055   bool operator<=(const vcsn::Element<S1, T1>& e1,
00056                   const vcsn::Element<S2, T2>& e2);
00057 
00059   template<typename S1, typename T1, typename S2, typename T2>
00060   static
00061   bool operator>=(const vcsn::Element<S1, T1>& e1,
00062                   const vcsn::Element<S2, T2>& e2);
00063 
00065   template<typename S, typename T, typename U>
00066   static
00067   bool operator <(const vcsn::Element<S, T>& e,
00068                   const U& v);
00069 
00071   template<typename S, typename T, typename U>
00072   static
00073   bool operator >(const vcsn::Element<S, T>& e,
00074                   const U& v);
00075 
00077   template<typename S, typename T, typename U>
00078   static
00079   bool operator >=(const vcsn::Element<S, T>& e,
00080                    const U& v);
00081 
00083   template<typename S, typename T, typename U>
00084   static
00085   bool operator <=(const vcsn::Element<S, T>& e,
00086                    const U& v);
00087 
00089   template<typename U, typename S, typename T>
00090   static
00091   bool operator <(const U& v,
00092                   const vcsn::Element<S, T>& e);
00093 
00095   template<typename U, typename S, typename T>
00096   static
00097   bool operator >(const U& v,
00098                   const vcsn::Element<S, T>& e);
00099 
00101   template<typename U, typename S, typename T>
00102   static
00103   bool operator >=(const U& v,
00104                    const vcsn::Element<S, T>& e);
00105 
00107   template<typename U, typename S, typename T>
00108   static
00109   bool operator <=(const U& v,
00110                    const vcsn::Element<S, T>& e);
00111 
00112   /*---------.
00113   | Equality |
00114   `---------*/
00115 
00117   template<typename S1, typename T1, typename S2, typename T2>
00118   static
00119   bool operator ==(const vcsn::Element<S1, T1>& e1,
00120                   const vcsn::Element<S2, T2>& e2);
00121 
00123   template<typename S, typename T, typename U>
00124   static
00125   bool operator ==(const vcsn::Element<S, T>& e,
00126                    const U& v);
00127 
00129   template<typename U, typename S, typename T>
00130   static
00131   bool operator ==(const U& v,
00132                    const vcsn::Element<S, T>& e);
00133 
00134   /*-----------.
00135   | Difference |
00136   `-----------*/
00137 
00139   template<typename S1, typename T1, typename S2, typename T2>
00140   static
00141   bool operator !=(const vcsn::Element<S1, T1>& e1,
00142                   const vcsn::Element<S2, T2>& e2);
00143 
00145   template<typename S, typename T, typename U>
00146   static
00147   bool operator !=(const vcsn::Element<S, T>& e,
00148                    const U& v);
00149 
00151   template<typename U, typename S, typename T>
00152   static
00153   bool operator !=(const U& v,
00154                    const vcsn::Element<S, T>& e);
00155 
00156   /*---------.
00157   | Addition |
00158   `---------*/
00159 
00161   template<typename S1, typename T1, typename S2, typename T2>
00162   static
00163   typename vcsn::op_add_traits<S1, S2, T1, T2>::ret_t
00164   operator+(const vcsn::Element<S1, T1>& e1,
00165             const vcsn::Element<S2, T2>& e2);
00166 
00168   template<typename S, typename T, typename U>
00169   static vcsn::Element<S, T>
00170   operator +(const vcsn::Element<S, T>& e,
00171              const U& v);
00172 
00174   template<typename U, typename S, typename T>
00175   static vcsn::Element<S, T>
00176   operator +(const U& v,
00177              const vcsn::Element<S, T>& e);
00178 
00179   /*-------------.
00180   | Substraction |
00181   `-------------*/
00182 
00184   template<typename S1, typename T1, typename S2, typename T2>
00185   static
00186   typename vcsn::op_sub_traits<S1, S2, T1, T2>::ret_t
00187   operator-(const vcsn::Element<S1, T1>& e1,
00188             const vcsn::Element<S2, T2>& e2);
00189 
00191   template<typename S, typename T, typename U>
00192   static vcsn::Element<S, T>
00193   operator-(const vcsn::Element<S, T>& e,
00194             const U& v);
00195 
00197   template<typename U, typename S, typename T>
00198   static vcsn::Element<S, T>
00199   operator-(const U& v,
00200             const vcsn::Element<S, T>& e);
00201 
00202   /*---------------.
00203   | Multiplication |
00204   `---------------*/
00205 
00207   template<typename S1, typename T1, typename S2, typename T2>
00208   static
00209   typename vcsn::op_mul_traits<S1, S2, T1, T2>::ret_t
00210   operator*(const vcsn::Element<S1, T1>& e1,
00211             const vcsn::Element<S2, T2>& e2);
00212 
00214   template<typename S, typename T, typename U>
00215   static vcsn::Element<S, T>
00216   operator*(const vcsn::Element<S, T>& e,
00217             const U& v);
00218 
00220   template<typename U, typename S, typename T>
00221   static vcsn::Element<S, T>
00222   operator*(const U& v,
00223             const vcsn::Element<S, T>& e);
00224 
00225   /*---------.
00226   | Division |
00227   `---------*/
00228 
00230   template<typename S1, typename T1, typename S2, typename T2>
00231   static
00232   typename vcsn::op_div_traits<S1, S2, T1, T2>::ret_t
00233   operator/(const vcsn::Element<S1, T1>& e1,
00234             const vcsn::Element<S2, T2>& e2);
00235 
00237   template<typename S, typename T, typename U>
00238   static vcsn::Element<S, T>
00239   operator/(const vcsn::Element<S, T>& e,
00240             const U& v);
00241 
00243   template<typename U, typename S, typename T>
00244   static vcsn::Element<S, T>
00245   operator/(const U& v,
00246             const vcsn::Element<S, T>& e);
00247 
00248   /*--------.
00249   | Modulus |
00250   `--------*/
00251 
00253   template<typename S1, typename T1, typename S2, typename T2>
00254   static
00255   typename vcsn::op_mod_traits<S1, S2, T1, T2>::ret_t
00256   operator%(const vcsn::Element<S1, T1>& e1,
00257             const vcsn::Element<S2, T2>& e2);
00258 
00260   template<typename S, typename T, typename U>
00261   static vcsn::Element<S, T>
00262   operator%(const vcsn::Element<S, T>& e,
00263             const U& v);
00264 
00266   template<typename U, typename S, typename T>
00267   static vcsn::Element<S, T>
00268   operator%(const U& v,
00269             const vcsn::Element<S, T>& e);
00270 
00271   /*---------------.
00272   | Unary negation |
00273   `---------------*/
00274 
00276   template<typename S, typename T>
00277   static vcsn::Element<S, T>
00278   operator -(const vcsn::Element<S, T>&);
00279 
00280   /*-----------------.
00281   | Input and Output |
00282   `-----------------*/
00283 
00285   template<typename St, typename S, typename T>
00286   static St&
00287   operator <<(St& s, const vcsn::Element<S, T>& e);
00288 
00290   template<typename St, typename S, typename T>
00291   static St&
00292   operator >>(St& s, const vcsn::Element<S, T>& e);
00293 
00294   // This operator does not exist.
00295 
00296 //   template<typename S1, typename T1, typename S2, typename T2>
00297 //   static void /* do not use or specialize */
00298 //   operator <<(const vcsn::Element<S1, T1>& e1,
00299 //            const vcsn::Element<S2, T2>& e2);
00300 
00301 
00305 } // vcsn
00306 
00307 namespace std {
00308 
00312   /*-----.
00313   | Swap |
00314   `-----*/
00315 
00320   template<typename S, typename T1, typename T2>
00321   void swap(vcsn::Element<S, T1>& e1,
00322             vcsn::Element<S, T2>& e2);
00323 
00325   template<typename S, typename T>
00326   void swap(vcsn::Element<S, T>& e1, T& v2);
00327 
00329   template<typename T, typename S>
00330   void swap(T& v1, vcsn::Element<S, T>& e2);
00331 
00335 } // std
00336 
00337 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00338 #  include <vaucanson/design_pattern/element_ops.hxx>
00339 # endif // VCSN_USE_INTERFACE_ONLY
00340 
00341 #endif // ! VCSN_DESIGN_PATTERN_ELEMENT_OPS_HH