00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 #ifndef MLN_TOPO_N_FACES_SET_HH
00027 # define MLN_TOPO_N_FACES_SET_HH
00028 
00031 
00032 #include <vector>
00033 
00034 #include <mln/core/contract.hh>
00035 #include <mln/topo/algebraic_n_face.hh>
00036 
00037 
00038 
00039 
00040 namespace mln
00041 {
00042 
00043   namespace topo
00044   {
00045 
00046     
00047     template <unsigned D> class complex;
00048 
00049 
00050     
00051 
00052 
00053 
00055     template <unsigned N, unsigned D>
00056     class n_faces_set
00057     {
00058     public:
00060       void add(const algebraic_n_face<N, D>& f);
00061 
00067       void reserve(size_t n);
00068 
00070       typedef std::vector< algebraic_n_face<N, D> > faces_type;
00071 
00076       const faces_type& faces() const;
00078 
00079     private:
00080       friend class complex<D>;
00081 
00083       faces_type faces_;
00084     };
00085 
00086 
00087     
00088 
00089 
00090 
00091     
00092 
00093 
00096     template <unsigned N, unsigned D>
00097     n_faces_set<N, D>
00098     operator+(const algebraic_n_face<N, D>& f1,
00099               const algebraic_n_face<N, D>& f2);
00100 
00101     template <unsigned N, unsigned D>
00102     n_faces_set<N, D>
00103     operator+(const algebraic_n_face<N, D>& f1, const n_face<N, D>& f2);
00104 
00105     template <unsigned N, unsigned D>
00106     n_faces_set<N, D>
00107     operator+(const n_face<N, D>& f1, const algebraic_n_face<N, D>& f2);
00108 
00109     template <unsigned N, unsigned D>
00110     n_faces_set<N, D>
00111     operator+(const n_face<N, D>& f1, const n_face<N, D>& f2);
00112 
00113 
00114     template <unsigned N, unsigned D>
00115     n_faces_set<N, D>
00116     operator+(const n_faces_set<N, D>& fs, const algebraic_n_face<N, D>& f);
00117 
00118     template <unsigned N, unsigned D>
00119     n_faces_set<N, D>
00120     operator+(const n_faces_set<N, D>& fs, const n_face<N, D>& f);
00121 
00122     template <unsigned N, unsigned D>
00123     n_faces_set<N, D>&
00124     operator+=(n_faces_set<N, D>& fs, const algebraic_n_face<N, D>& f);
00126 
00129     template <unsigned N, unsigned D>
00130     n_faces_set<N, D>
00131     operator-(const algebraic_n_face<N, D>& f1,
00132               const algebraic_n_face<N, D>& f2);
00133 
00134     template <unsigned N, unsigned D>
00135     n_faces_set<N, D>
00136     operator-(const algebraic_n_face<N, D>& f1, const n_face<N, D>& f2);
00137 
00138     template <unsigned N, unsigned D>
00139     n_faces_set<N, D>
00140     operator-(const n_face<N, D>& f1, const algebraic_n_face<N, D>& f2);
00141 
00142     template <unsigned N, unsigned D>
00143     n_faces_set<N, D>
00144     operator-(const n_face<N, D>& f1, const n_face<N, D>& f2);
00145 
00146 
00147     template <unsigned N, unsigned D>
00148     n_faces_set<N, D>
00149     operator-(const n_faces_set<N, D>& fs, const algebraic_n_face<N, D>& f);
00150 
00151     template <unsigned N, unsigned D>
00152     n_faces_set<N, D>
00153     operator-(const n_faces_set<N, D>& fs, const n_face<N, D>& f);
00154 
00155     template <unsigned N, unsigned D>
00156     n_faces_set<N, D>&
00157     operator-=(n_faces_set<N, D>& fs, const algebraic_n_face<N, D>& f);
00159 
00160 
00161 
00162 # ifndef MLN_INCLUDE_ONLY
00163 
00164     
00165 
00166 
00167 
00168     template <unsigned N, unsigned D>
00169     inline
00170     void
00171     n_faces_set<N, D>::add(const algebraic_n_face<N, D>& f)
00172     {
00173       
00174       if (!faces_.empty())
00175         mln_precondition(faces_.front().cplx() == f.cplx());
00176       faces_.push_back(f);
00177     }
00178 
00179     template <unsigned N, unsigned D>
00180     inline
00181     void
00182     n_faces_set<N, D>::reserve(size_t n)
00183     {
00184       faces_.reserve(n);
00185     }
00186 
00187     template <unsigned N, unsigned D>
00188     inline
00189     const std::vector< algebraic_n_face<N, D> >&
00190     n_faces_set<N, D>::faces() const
00191     {
00192       return faces_;
00193     }
00194 
00195     
00196 
00197 
00198 
00199     
00200     
00201     
00202 
00203     template <unsigned N, unsigned D>
00204     inline
00205     n_faces_set<N, D>
00206     operator+(const algebraic_n_face<N, D>& f1,
00207               const algebraic_n_face<N, D>& f2)
00208     {
00209       n_faces_set<N, D> fs;
00210       fs.add(f1);
00211       fs.add(f2);
00212       return fs;
00213     }
00214 
00215     template <unsigned N, unsigned D>
00216     inline
00217     n_faces_set<N, D>
00218     operator+(const algebraic_n_face<N, D>& f1, const n_face<N, D>& f2)
00219     {
00220       n_faces_set<N, D> fs;
00221       fs.add(f1);
00222       fs.add(make_algebraic_n_face(f2, true));
00223       return fs;
00224     }
00225 
00226     template <unsigned N, unsigned D>
00227     inline
00228     n_faces_set<N, D>
00229     operator+(const n_face<N, D>& f1, const algebraic_n_face<N, D>& f2)
00230     {
00231       n_faces_set<N, D> fs;
00232       fs.add(make_algebraic_n_face(f1, true));
00233       fs.add(f2);
00234       return fs;
00235     }
00236 
00237     template <unsigned N, unsigned D>
00238     inline
00239     n_faces_set<N, D>
00240     operator+(const n_face<N, D>& f1, const n_face<N, D>& f2)
00241     {
00242       n_faces_set<N, D> fs;
00243       fs.add(make_algebraic_n_face(f1, true));
00244       fs.add(make_algebraic_n_face(f2, true));
00245       return fs;
00246     }
00247 
00248 
00249     template <unsigned N, unsigned D>
00250     inline
00251     n_faces_set<N, D>
00252     operator+(const n_faces_set<N, D>& fs, const algebraic_n_face<N, D>& f)
00253     {
00254       n_faces_set<N, D> fs2(fs);
00255       fs2.add(f);
00256       return fs2;
00257     }
00258 
00259     template <unsigned N, unsigned D>
00260     inline
00261     n_faces_set<N, D>
00262     operator+(const n_faces_set<N, D>& fs, const n_face<N, D>& f)
00263     {
00264       n_faces_set<N, D> fs2(fs);
00265       fs2.add(make_algebraic_n_face(f, true));
00266       return fs2;
00267     }
00268 
00269     template <unsigned N, unsigned D>
00270     n_faces_set<N, D>&
00271     operator+=(n_faces_set<N, D>& fs, const algebraic_n_face<N, D>& f)
00272     {
00273       fs.add(f);
00274       return fs;
00275     }
00276 
00277     
00278     
00279     
00280 
00281     template <unsigned N, unsigned D>
00282     inline
00283     n_faces_set<N, D>
00284     operator-(const algebraic_n_face<N, D>& f1,
00285               const algebraic_n_face<N, D>& f2)
00286     {
00287       n_faces_set<N, D> fs;
00288       fs.add(f1);
00289       fs.add(-f2);
00290       return fs;
00291     }
00292 
00293     template <unsigned N, unsigned D>
00294     inline
00295     n_faces_set<N, D>
00296     operator-(const algebraic_n_face<N, D>& f1, const n_face<N, D>& f2)
00297     {
00298       n_faces_set<N, D> fs;
00299       fs.add(f1);
00300       fs.add(make_algebraic_n_face(f2, false));
00301       return fs;
00302     }
00303 
00304     template <unsigned N, unsigned D>
00305     inline
00306     n_faces_set<N, D>
00307     operator-(const n_face<N, D>& f1, const algebraic_n_face<N, D>& f2)
00308     {
00309       n_faces_set<N, D> fs;
00310       fs.add(make_algebraic_n_face(f1, true));
00311       fs.add(-f2);
00312       return fs;
00313     }
00314 
00315     template <unsigned N, unsigned D>
00316     inline
00317     n_faces_set<N, D>
00318     operator-(const n_face<N, D>& f1, const n_face<N, D>& f2)
00319     {
00320       n_faces_set<N, D> fs;
00321       fs.add(make_algebraic_n_face(f1, true));
00322       fs.add(make_algebraic_n_face(f2, false));
00323       return fs;
00324     }
00325 
00326 
00327     template <unsigned N, unsigned D>
00328     inline
00329     n_faces_set<N, D>
00330     operator-(const n_faces_set<N, D>& fs, const algebraic_n_face<N, D>& f)
00331     {
00332       n_faces_set<N, D> fs2(fs);
00333       fs2.add(-f);
00334       return fs2;
00335     }
00336 
00337     template <unsigned N, unsigned D>
00338     inline
00339     n_faces_set<N, D>
00340     operator-(const n_faces_set<N, D>& fs, const n_face<N, D>& f)
00341     {
00342       n_faces_set<N, D> fs2(fs);
00343       fs2.add(make_algebraic_n_face(f, false));
00344       return fs2;
00345     }
00346 
00347     template <unsigned N, unsigned D>
00348     n_faces_set<N, D>&
00349     operator-=(n_faces_set<N, D>& fs, const algebraic_n_face<N, D>& f)
00350     {
00351       fs.add(-f);
00352       return fs;
00353     }
00354 
00355 # endif // ! MLN_INCLUDE_ONLY
00356 
00357   } 
00358 
00359 } 
00360 
00361 #endif // ! MLN_TOPO_N_FACES_SET_HH