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