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_ADJ_HIGHER_DIM_CONNECTED_N_FACE_ITER_HH
00027 # define MLN_TOPO_ADJ_HIGHER_DIM_CONNECTED_N_FACE_ITER_HH
00028 
00034 
00035 # include <set>
00036 
00037 # include <mln/topo/internal/complex_relative_iterator_base.hh>
00038 # include <mln/topo/algebraic_face.hh>
00039 
00040 
00041 namespace mln
00042 {
00043 
00044   namespace topo
00045   {
00046 
00047     
00048     template <unsigned D> class complex;
00049     namespace internal
00050     {
00051       template <unsigned D> class adj_higher_dim_connected_n_face_iterator;
00052     }
00053 
00054 
00055     
00056 
00057 
00058 
00063     
00064     template <unsigned D>
00065     class adj_higher_dim_connected_n_face_fwd_iter
00066       : public internal::forward_complex_relative_iterator_base< topo::face<D>,
00067                                                                  algebraic_face<D>,
00068                                                                  adj_higher_dim_connected_n_face_fwd_iter<D> >,
00069         private internal::adj_higher_dim_connected_n_face_iterator<D>
00070     {
00071       
00072     private:
00073       typedef adj_higher_dim_connected_n_face_fwd_iter<D> self_;
00074       typedef internal::forward_complex_relative_iterator_base< topo::face<D>,
00075                                                                 algebraic_face<D>,
00076                                                                 self_ > super_;
00077 
00078     public:
00081       adj_higher_dim_connected_n_face_fwd_iter();
00082       template <typename Fref>
00083       adj_higher_dim_connected_n_face_fwd_iter(const Fref& f_ref);
00085 
00090       void update_adj_faces_();
00091     };
00092 
00093 
00094     
00095 
00096 
00097 
00102     
00103     template <unsigned D>
00104     class adj_higher_dim_connected_n_face_bkd_iter
00105       : public internal::backward_complex_relative_iterator_base< topo::face<D>,
00106                                                                   algebraic_face<D>,
00107                                                                   adj_higher_dim_connected_n_face_bkd_iter<D> >,
00108         private internal::adj_higher_dim_connected_n_face_iterator<D>
00109     {
00110       
00111     private:
00112       typedef adj_higher_dim_connected_n_face_bkd_iter<D> self_;
00113       typedef internal::backward_complex_relative_iterator_base< topo::face<D>,
00114                                                                  algebraic_face<D>,
00115                                                                  self_ > super_;
00116 
00117     public:
00120       adj_higher_dim_connected_n_face_bkd_iter();
00121       template <typename Fref>
00122       adj_higher_dim_connected_n_face_bkd_iter(const Fref& f_ref);
00124 
00129       void update_adj_faces_();
00130     };
00131 
00132 
00133     
00134 
00135 
00136 
00137     namespace internal
00138     {
00139 
00140       template <unsigned D>
00141       class adj_higher_dim_connected_n_face_iterator
00142       {
00143       protected:
00146         void update_adj_faces__(const topo::face<D>& center,
00147                                 std::vector< algebraic_face<D> >& adj_faces);
00148       };
00149 
00150     } 
00151 
00152 
00153 
00154 # ifndef MLN_INCLUDE_ONLY
00155 
00156     
00157 
00158 
00159 
00160     template <unsigned D>
00161     inline
00162     adj_higher_dim_connected_n_face_fwd_iter<D>::adj_higher_dim_connected_n_face_fwd_iter()
00163     {
00164     }
00165 
00166     template <unsigned D>
00167     template <typename Fref>
00168     inline
00169     adj_higher_dim_connected_n_face_fwd_iter<D>::adj_higher_dim_connected_n_face_fwd_iter(const Fref& f_ref)
00170       : super_(f_ref)
00171     {
00172     }
00173 
00174     
00175 
00176 
00177 
00178 
00179     template <unsigned D>
00180     inline
00181     void
00182     adj_higher_dim_connected_n_face_fwd_iter<D>::update_adj_faces_()
00183     {
00184       mln_precondition(this->c_);
00185       
00186       this->update_adj_faces__(*this->c_, this->adj_faces_);
00187     }
00188 
00189 
00190     
00191 
00192 
00193 
00194     template <unsigned D>
00195     inline
00196     adj_higher_dim_connected_n_face_bkd_iter<D>::adj_higher_dim_connected_n_face_bkd_iter()
00197     {
00198     }
00199 
00200     template <unsigned D>
00201     template <typename Fref>
00202     inline
00203     adj_higher_dim_connected_n_face_bkd_iter<D>::adj_higher_dim_connected_n_face_bkd_iter(const Fref& f_ref)
00204       : super_(f_ref)
00205     {
00206     }
00207 
00208     template <unsigned D>
00209     inline
00210     void
00211     adj_higher_dim_connected_n_face_bkd_iter<D>::update_adj_faces_()
00212     {
00213       mln_precondition(this->c_);
00214       
00215       this->update_adj_faces__(*this->c_, this->adj_faces_);
00216     }
00217 
00218 
00219     
00220 
00221 
00222 
00223     namespace internal
00224     {
00225 
00226       
00227 
00228 
00229 
00230       template <unsigned D>
00231       inline
00232       void
00233       adj_higher_dim_connected_n_face_iterator<D>::update_adj_faces__(const topo::face<D>& center,
00234                                                                       std::vector< algebraic_face<D> >& adj_faces)
00235       {
00236         
00237         adj_faces.clear();
00238 
00239         
00240 
00241 
00242 
00243 
00244         std::set< algebraic_face<D> > faces_set;
00245         typedef std::vector< algebraic_face<D> > faces_t;
00246 
00247         
00248         faces_t shared_higher_faces = center.higher_dim_adj_faces();
00249         for (typename faces_t::const_iterator slf = shared_higher_faces.begin();
00250              slf != shared_higher_faces.end(); ++slf)
00251           {
00252             
00253 
00254             faces_t adj_n_faces = slf->lower_dim_adj_faces();
00255             for (typename faces_t::const_iterator af = adj_n_faces.begin();
00256                  af != adj_n_faces.end(); ++af)
00257               {
00258                 
00259 
00260 
00261                 if (*af != center &&
00262                     faces_set.find(*af) == faces_set.end())
00263                   {
00264                     adj_faces.push_back(*af);
00265                     faces_set.insert(*af);
00266                   }
00267               }
00268           }
00269       }
00270 
00271     } 
00272 
00273 # endif // ! MLN_INCLUDE_ONLY
00274 
00275   } 
00276 
00277 } 
00278 
00279 #endif // ! MLN_TOPO_ADJ_HIGHER_DIM_CONNECTED_N_FACE_ITER_HH