46 #include "Iterators.hh" 47 #include "TopologyKernel.hh" 56 VertexOHalfEdgeIter::VertexOHalfEdgeIter(
const VertexHandle& _ref_h,
57 const TopologyKernel* _mesh,
int _max_laps) :
58 BaseIter(_mesh, _ref_h, _max_laps),
61 if(!_mesh->has_vertex_bottom_up_incidences()) {
63 std::cerr <<
"This iterator needs bottom-up incidences!" << std::endl;
65 BaseIter::valid(
false);
69 if((
unsigned int)_ref_h.idx() >= BaseIter::mesh()->outgoing_hes_per_vertex_.size()) {
70 BaseIter::valid(
false);
73 if(BaseIter::valid()) {
74 if((
unsigned int)cur_index_ >= BaseIter::mesh()->outgoing_hes_per_vertex_[_ref_h.idx()].size()) {
75 BaseIter::valid(
false);
79 if(BaseIter::valid()) {
80 BaseIter::cur_handle((
81 BaseIter::mesh()->outgoing_hes_per_vertex_[_ref_h.idx()])[cur_index_]);
86 VertexOHalfEdgeIter& VertexOHalfEdgeIter::operator--() {
88 size_t n_outgoing_halfedges = BaseIter::mesh()->outgoing_hes_per_vertex_[BaseIter::ref_handle().idx()].size();
90 if (cur_index_ == 0) {
91 cur_index_ = n_outgoing_halfedges-1;
94 BaseIter::valid(
false);
100 BaseIter::cur_handle((BaseIter::mesh()->outgoing_hes_per_vertex_[BaseIter::ref_handle().idx()])[cur_index_]);
106 VertexOHalfEdgeIter& VertexOHalfEdgeIter::operator++() {
108 size_t n_outgoing_halfedges = BaseIter::mesh()->outgoing_hes_per_vertex_[BaseIter::ref_handle().idx()].size();
112 if (cur_index_ == n_outgoing_halfedges) {
115 if (lap_ >= max_laps_)
116 BaseIter::valid(
false);
119 BaseIter::cur_handle((BaseIter::mesh()->outgoing_hes_per_vertex_[BaseIter::ref_handle().idx()])[cur_index_]);
130 VertexVertexIter::VertexVertexIter(
const VertexHandle& _ref_h,
131 const TopologyKernel* _mesh,
int _max_laps) :
132 BaseIter(_mesh, _ref_h, _max_laps),
135 if(!_mesh->has_vertex_bottom_up_incidences()) {
137 std::cerr <<
"This iterator needs bottom-up incidences!" << std::endl;
139 BaseIter::valid(
false);
143 if((
size_t)_ref_h.idx() >= BaseIter::mesh()->outgoing_hes_per_vertex_.size()) {
144 BaseIter::valid(
false);
147 if(BaseIter::valid()) {
148 if((
size_t)cur_index_ >= BaseIter::mesh()->outgoing_hes_per_vertex_[_ref_h.idx()].size()) {
149 BaseIter::valid(
false);
153 if(BaseIter::valid()) {
154 HalfEdgeHandle heh = BaseIter::mesh()->outgoing_hes_per_vertex_[_ref_h.idx()][cur_index_];
155 BaseIter::cur_handle(BaseIter::mesh()->halfedge(heh).to_vertex());
160 VertexVertexIter& VertexVertexIter::operator--() {
162 size_t n_outgoing_halfedges = BaseIter::mesh()->outgoing_hes_per_vertex_[BaseIter::ref_handle().idx()].size();
164 if (cur_index_ == 0) {
165 cur_index_ = n_outgoing_halfedges-1;
168 BaseIter::valid(
false);
174 HalfEdgeHandle heh = BaseIter::mesh()->outgoing_hes_per_vertex_[BaseIter::ref_handle().idx()][cur_index_];
175 BaseIter::cur_handle(BaseIter::mesh()->halfedge(heh).to_vertex());
181 VertexVertexIter& VertexVertexIter::operator++() {
183 size_t n_outgoing_halfedges = BaseIter::mesh()->outgoing_hes_per_vertex_[BaseIter::ref_handle().idx()].size();
187 if (cur_index_ == n_outgoing_halfedges) {
190 if (lap_ >= max_laps_)
191 BaseIter::valid(
false);
195 HalfEdgeHandle heh = BaseIter::mesh()->outgoing_hes_per_vertex_[BaseIter::ref_handle().idx()][cur_index_];
196 BaseIter::cur_handle(BaseIter::mesh()->halfedge(heh).to_vertex());
207 HalfEdgeHalfFaceIter::HalfEdgeHalfFaceIter(
const HalfEdgeHandle& _ref_h,
208 const TopologyKernel* _mesh,
int _max_laps) :
209 BaseIter(_mesh, _ref_h, _max_laps),
212 if(!_mesh->has_edge_bottom_up_incidences()) {
214 std::cerr <<
"This iterator needs bottom-up incidences!" << std::endl;
216 BaseIter::valid(
false);
220 if((
unsigned int)_ref_h.idx() >= BaseIter::mesh()->incident_hfs_per_he_.size()) {
221 BaseIter::valid(
false);
224 if(BaseIter::valid()) {
225 if((
unsigned int)cur_index_ >= BaseIter::mesh()->incident_hfs_per_he_[_ref_h.idx()].size()) {
226 BaseIter::valid(
false);
230 if(BaseIter::valid()) {
231 BaseIter::cur_handle((
232 BaseIter::mesh()->incident_hfs_per_he_[_ref_h.idx()])[cur_index_]);
237 HalfEdgeHalfFaceIter& HalfEdgeHalfFaceIter::operator--() {
239 size_t n_outgoing_halffaces = BaseIter::mesh()->incident_hfs_per_he_[BaseIter::ref_handle().idx()].size();
241 if (cur_index_ == 0) {
242 cur_index_ = n_outgoing_halffaces-1;
245 BaseIter::valid(
false);
251 BaseIter::cur_handle((BaseIter::mesh()->incident_hfs_per_he_[BaseIter::ref_handle().idx()])[cur_index_]);
257 HalfEdgeHalfFaceIter& HalfEdgeHalfFaceIter::operator++() {
260 size_t n_outgoing_halffaces = BaseIter::mesh()->incident_hfs_per_he_[BaseIter::ref_handle().idx()].size();
264 if (cur_index_ == n_outgoing_halffaces) {
267 if (lap_ >= max_laps_)
268 BaseIter::valid(
false);
271 BaseIter::cur_handle((BaseIter::mesh()->incident_hfs_per_he_[BaseIter::ref_handle().idx()])[cur_index_]);
280 VertexFaceIter::VertexFaceIter(
const VertexHandle& _ref_h,
281 const TopologyKernel* _mesh,
int _max_laps) :
282 BaseIter(_mesh, _ref_h, _max_laps) {
284 if(!_mesh->has_full_bottom_up_incidences()) {
286 std::cerr <<
"This iterator needs bottom-up incidences!" << std::endl;
288 BaseIter::valid(
false);
292 if((
unsigned int)_ref_h.idx() >= BaseIter::mesh()->outgoing_hes_per_vertex_.size()) {
293 BaseIter::valid(
false);
298 const std::vector<HalfEdgeHandle>& incidentHalfedges = BaseIter::mesh()->outgoing_hes_per_vertex_[_ref_h.idx()];
299 for(std::vector<HalfEdgeHandle>::const_iterator it = incidentHalfedges.begin(); it != incidentHalfedges.end(); ++it) {
301 if(*it < 0 || (
unsigned int)it->idx() >= BaseIter::mesh()->incident_hfs_per_he_.size())
continue;
302 const std::vector<HalfFaceHandle>& incidentHalfFaces = BaseIter::mesh()->incident_hfs_per_he_[it->idx()];
304 for (std::vector<HalfFaceHandle>::const_iterator hf_it = incidentHalfFaces.begin();
305 hf_it != incidentHalfFaces.end(); ++hf_it) {
306 faces_.push_back(BaseIter::mesh()->face_handle(*hf_it));
310 std::sort(faces_.begin(), faces_.end());
311 faces_.resize(std::unique(faces_.begin(), faces_.end()) - faces_.begin());
314 if ((faces_.size() > 0) && !faces_.front().is_valid())
315 faces_.erase(faces_.begin());
318 BaseIter::valid(faces_.size() > 0);
319 if(BaseIter::valid()) {
320 BaseIter::cur_handle(faces_[cur_index_]);
324 VertexFaceIter& VertexFaceIter::operator--() {
326 if(cur_index_ == 0) {
327 cur_index_ = faces_.size()-1;
330 BaseIter::valid(
false);
336 BaseIter::cur_handle(faces_[cur_index_]);
341 VertexFaceIter& VertexFaceIter::operator++() {
344 if(cur_index_ == faces_.size()) {
347 if (lap_ >= max_laps_) {
348 BaseIter::valid(
false);
351 BaseIter::cur_handle(faces_[cur_index_]);
359 VertexCellIter::VertexCellIter(
const VertexHandle& _ref_h,
360 const TopologyKernel* _mesh,
int _max_laps) :
361 BaseIter(_mesh, _ref_h, _max_laps) {
363 if(!_mesh->has_full_bottom_up_incidences()) {
365 std::cerr <<
"This iterator needs bottom-up incidences!" << std::endl;
367 BaseIter::valid(
false);
371 if((
unsigned int)_ref_h.idx() >= BaseIter::mesh()->outgoing_hes_per_vertex_.size()) {
372 BaseIter::valid(
false);
377 const std::vector<HalfEdgeHandle>& incidentHalfedges = BaseIter::mesh()->outgoing_hes_per_vertex_[_ref_h.idx()];
378 for(std::vector<HalfEdgeHandle>::const_iterator it = incidentHalfedges.begin(); it != incidentHalfedges.end(); ++it) {
380 if(*it < 0 || (
unsigned int)it->idx() >= BaseIter::mesh()->incident_hfs_per_he_.size())
continue;
381 const std::vector<HalfFaceHandle>& incidentHalfFaces = BaseIter::mesh()->incident_hfs_per_he_[it->idx()];
383 for(std::vector<HalfFaceHandle>::const_iterator hf_it = incidentHalfFaces.begin();
384 hf_it != incidentHalfFaces.end(); ++hf_it) {
385 if((
unsigned int)hf_it->idx() < BaseIter::mesh()->incident_cell_per_hf_.size()) {
386 CellHandle c_idx = BaseIter::mesh()->incident_cell_per_hf_[hf_it->idx()];
387 if(c_idx != TopologyKernel::InvalidCellHandle)
388 cells_.push_back(c_idx);
393 std::sort(cells_.begin(), cells_.end());
394 cells_.resize(std::unique(cells_.begin(), cells_.end()) - cells_.begin());
397 if ((cells_.size() > 0) && !cells_.front().is_valid())
398 cells_.erase(cells_.begin());
401 BaseIter::valid(cells_.size()>0);
402 if(BaseIter::valid()) {
403 BaseIter::cur_handle(cells_[cur_index_]);
407 VertexCellIter& VertexCellIter::operator--() {
409 if(cur_index_ == 0) {
410 cur_index_ = cells_.size()-1;
413 BaseIter::valid(
false);
419 BaseIter::cur_handle(cells_[cur_index_]);
424 VertexCellIter& VertexCellIter::operator++() {
427 if(cur_index_ == cells_.size()) {
430 if (lap_ >= max_laps_) {
431 BaseIter::valid(
false);
434 BaseIter::cur_handle(cells_[cur_index_]);
443 HalfEdgeCellIter::HalfEdgeCellIter(
const HalfEdgeHandle& _ref_h,
444 const TopologyKernel* _mesh,
int _max_laps) :
445 BaseIter(_mesh, _ref_h, _max_laps),
448 if(!_mesh->has_edge_bottom_up_incidences() || !_mesh->has_face_bottom_up_incidences()) {
450 std::cerr <<
"This iterator needs bottom-up incidences!" << std::endl;
452 BaseIter::valid(
false);
456 if((
unsigned int)_ref_h.idx() >= BaseIter::mesh()->incident_hfs_per_he_.size()) {
458 BaseIter::valid(
false);
461 if((
unsigned int)cur_index_ >= BaseIter::mesh()->incident_hfs_per_he_[_ref_h.idx()].size()) {
463 BaseIter::valid(
false);
466 if((
unsigned int)((BaseIter::mesh()->incident_hfs_per_he_[_ref_h.idx()])[cur_index_]).idx() >=
467 BaseIter::mesh()->incident_cell_per_hf_.size()) {
469 BaseIter::valid(
false);
474 const std::vector<HalfFaceHandle>& incidentHalffaces = BaseIter::mesh()->incident_hfs_per_he_[_ref_h.idx()];
475 std::set<CellHandle> cells;
476 for (
unsigned int i = 0; i < incidentHalffaces.size(); ++i)
478 CellHandle ch = getCellHandle(i);
480 if(cells.count(ch) == 0) {
481 cells_.push_back(ch);
487 BaseIter::valid(cells_.size() > 0);
489 if(BaseIter::valid()) {
490 BaseIter::cur_handle(cells_[cur_index_]);
495 HalfEdgeCellIter& HalfEdgeCellIter::operator--() {
497 if (cur_index_ == 0) {
498 cur_index_ = cells_.size()-1;
501 BaseIter::valid(
false);
507 BaseIter::cur_handle(cells_[cur_index_]);
512 HalfEdgeCellIter& HalfEdgeCellIter::operator++() {
516 if (cur_index_ == cells_.size()) {
519 if (lap_ >= max_laps_)
520 BaseIter::valid(
false);
523 BaseIter::cur_handle(cells_[cur_index_]);
527 CellHandle HalfEdgeCellIter::getCellHandle(
int _cur_index)
const 529 const std::vector<HalfFaceHandle>& halffacehandles = BaseIter::mesh()->incident_hfs_per_he_[BaseIter::ref_handle().idx()];
530 HalfFaceHandle currentHalfface = halffacehandles[_cur_index];
531 if(!currentHalfface.is_valid())
return CellHandle(-1);
532 CellHandle cellhandle = BaseIter::mesh()->incident_cell_per_hf_[currentHalfface.idx()];
542 CellVertexIter::CellVertexIter(
const CellHandle& _ref_h,
543 const TopologyKernel* _mesh,
int _max_laps) :
544 BaseIter(_mesh, _ref_h, _max_laps) {
546 OpenVolumeMeshCell c = BaseIter::mesh()->cell(_ref_h);
547 std::vector<HalfFaceHandle>::const_iterator hf_iter = c.halffaces().begin();
548 for(; hf_iter != c.halffaces().end(); ++hf_iter) {
549 const OpenVolumeMeshFace& halfface = BaseIter::mesh()->halfface(*hf_iter);
550 const std::vector<HalfEdgeHandle>& hes = halfface.halfedges();
551 for(std::vector<HalfEdgeHandle>::const_iterator he_iter = hes.begin(); he_iter != hes.end(); ++he_iter) {
552 incident_vertices_.push_back(BaseIter::mesh()->halfedge(*he_iter).to_vertex());
557 std::sort(incident_vertices_.begin(), incident_vertices_.end());
558 incident_vertices_.resize(std::unique(incident_vertices_.begin(), incident_vertices_.end()) - incident_vertices_.begin());
561 BaseIter::valid(incident_vertices_.size() > 0);
563 if(BaseIter::valid()) {
564 BaseIter::cur_handle(incident_vertices_[cur_index_]);
569 CellVertexIter& CellVertexIter::operator--() {
571 if (cur_index_ == 0) {
572 cur_index_ = incident_vertices_.size()-1;
575 BaseIter::valid(
false);
581 BaseIter::cur_handle(incident_vertices_[cur_index_]);
586 CellVertexIter& CellVertexIter::operator++() {
589 if (cur_index_ == incident_vertices_.size()){
592 if (lap_ >= max_laps_)
593 BaseIter::valid(
false);
596 BaseIter::cur_handle(incident_vertices_[cur_index_]);
605 CellCellIter::CellCellIter(
const CellHandle& _ref_h,
606 const TopologyKernel* _mesh,
int _max_laps) :
607 BaseIter(_mesh, _ref_h, _max_laps) {
609 if(!_mesh->has_face_bottom_up_incidences()) {
611 std::cerr <<
"This iterator needs bottom-up incidences!" << std::endl;
613 BaseIter::valid(
false);
617 std::vector<HalfFaceHandle>::const_iterator hf_iter = BaseIter::mesh()->cell(_ref_h).halffaces().begin();
618 std::vector<HalfFaceHandle>::const_iterator hf_end = BaseIter::mesh()->cell(_ref_h).halffaces().end();
619 for(; hf_iter != hf_end; ++hf_iter) {
621 HalfFaceHandle opp_hf = BaseIter::mesh()->opposite_halfface_handle(*hf_iter);
622 CellHandle ch = BaseIter::mesh()->incident_cell_per_hf_[opp_hf.idx()];
623 if(ch != TopologyKernel::InvalidCellHandle) {
624 adjacent_cells_.push_back(ch);
629 std::sort(adjacent_cells_.begin(), adjacent_cells_.end());
630 adjacent_cells_.resize(std::unique(adjacent_cells_.begin(), adjacent_cells_.end()) - adjacent_cells_.begin());
633 BaseIter::valid(adjacent_cells_.size()>0);
634 if(BaseIter::valid()) {
635 BaseIter::cur_handle(adjacent_cells_[cur_index_]);
640 CellCellIter& CellCellIter::operator--() {
642 if (cur_index_ == 0) {
643 cur_index_ = adjacent_cells_.size() - 1;
646 BaseIter::valid(
false);
652 BaseIter::cur_handle(adjacent_cells_[cur_index_]);
657 CellCellIter& CellCellIter::operator++() {
660 if (cur_index_ == adjacent_cells_.size())
664 if (lap_ >= max_laps_)
665 BaseIter::valid(
false);
667 BaseIter::cur_handle(adjacent_cells_[cur_index_]);
676 HalfFaceVertexIter::HalfFaceVertexIter(
const HalfFaceHandle& _ref_h,
677 const TopologyKernel* _mesh,
int _max_laps) :
678 BaseIter(_mesh, _ref_h, _max_laps) {
680 if(!_ref_h.is_valid())
return;
682 const OpenVolumeMeshFace& halfface = _mesh->halfface(_ref_h);
683 const std::vector<HalfEdgeHandle>& hes = halfface.halfedges();
684 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes.begin();
685 he_it != hes.end(); ++he_it) {
686 vertices_.push_back(_mesh->halfedge(*he_it).from_vertex());
691 BaseIter::valid(vertices_.size() > 0);
692 if(BaseIter::valid()) {
693 BaseIter::cur_handle(vertices_[cur_index_]);
698 HalfFaceVertexIter& HalfFaceVertexIter::operator--() {
700 if (cur_index_ == 0) {
701 cur_index_ = vertices_.size() - 1;
704 BaseIter::valid(
false);
710 BaseIter::cur_handle(vertices_[cur_index_]);
715 HalfFaceVertexIter& HalfFaceVertexIter::operator++() {
718 if (cur_index_ == vertices_.size())
722 if (lap_ >= max_laps_)
723 BaseIter::valid(
false);
725 BaseIter::cur_handle(vertices_[cur_index_]);
733 BoundaryHalfFaceHalfFaceIter::BoundaryHalfFaceHalfFaceIter(
const HalfFaceHandle& _ref_h,
734 const TopologyKernel* _mesh,
int _max_laps) :
735 BaseIter(_mesh, _ref_h, _max_laps) {
737 if(!_mesh->has_face_bottom_up_incidences()) {
739 std::cerr <<
"This iterator needs bottom-up incidences!" << std::endl;
741 BaseIter::valid(
false);
747 const OpenVolumeMeshFace& halfface = _mesh->halfface(_ref_h);
748 const std::vector<HalfEdgeHandle>& halfedges = halfface.halfedges();
749 for(std::vector<HalfEdgeHandle>::const_iterator he_it = halfedges.begin();
750 he_it != halfedges.end(); ++he_it) {
754 for(; hehf_it.valid(); ++hehf_it) {
756 if(_mesh->is_boundary(*hehf_it)) {
757 neighbor_halffaces_.push_back(*hehf_it);
758 common_edges_.push_back(_mesh->edge_handle(*he_it));
764 BaseIter::valid(neighbor_halffaces_.size() > 0);
765 if(BaseIter::valid()) {
766 BaseIter::cur_handle(neighbor_halffaces_[cur_index_]);
771 BoundaryHalfFaceHalfFaceIter& BoundaryHalfFaceHalfFaceIter::operator--() {
775 cur_index_ = neighbor_halffaces_.size() - 1;
778 BaseIter::valid(
false);
784 BaseIter::cur_handle(neighbor_halffaces_[cur_index_]);
789 BoundaryHalfFaceHalfFaceIter& BoundaryHalfFaceHalfFaceIter::operator++() {
792 if (cur_index_ == neighbor_halffaces_.size())
796 if (lap_ >= max_laps_)
797 BaseIter::valid(
false);
800 BaseIter::cur_handle(neighbor_halffaces_[cur_index_]);
809 VertexIter::VertexIter(
const TopologyKernel* _mesh,
const VertexHandle& _vh) :
810 BaseIter(_mesh, _vh),
811 cur_index_(_vh.idx()) {
813 while ((
unsigned int)cur_index_ < BaseIter::mesh()->n_vertices() && BaseIter::mesh()->is_deleted(VertexHandle(cur_index_)))
815 if((
unsigned int)cur_index_ >= BaseIter::mesh()->n_vertices()) {
816 BaseIter::valid(
false);
818 BaseIter::cur_handle(VertexHandle(cur_index_));
822 VertexIter& VertexIter::operator--() {
825 while (cur_index_ >= 0 && BaseIter::mesh()->is_deleted(VertexHandle(cur_index_)))
828 BaseIter::valid(
false);
830 BaseIter::cur_handle(VertexHandle(cur_index_));
835 VertexIter& VertexIter::operator++() {
838 while ((
unsigned int)cur_index_ < BaseIter::mesh()->n_vertices() && BaseIter::mesh()->is_deleted(VertexHandle(cur_index_)))
840 if((
unsigned int)cur_index_ >= BaseIter::mesh()->n_vertices()) {
841 BaseIter::valid(
false);
843 BaseIter::cur_handle(VertexHandle(cur_index_));
852 EdgeIter::EdgeIter(
const TopologyKernel* _mesh,
const EdgeHandle& _eh) :
853 BaseIter(_mesh, _eh),
854 cur_index_(_eh.idx()) {
856 while ((
unsigned int)cur_index_ < BaseIter::mesh()->edges_.size() && BaseIter::mesh()->is_deleted(EdgeHandle(cur_index_)))
858 if((
unsigned int)cur_index_ >= BaseIter::mesh()->edges_.size()) {
859 BaseIter::valid(
false);
861 BaseIter::cur_handle(EdgeHandle(cur_index_));
865 EdgeIter& EdgeIter::operator--() {
868 while (cur_index_ >= 0 && BaseIter::mesh()->is_deleted(EdgeHandle(cur_index_)))
871 BaseIter::valid(
false);
873 BaseIter::cur_handle(EdgeHandle(cur_index_));
878 EdgeIter& EdgeIter::operator++() {
881 while ((
unsigned int)cur_index_ < BaseIter::mesh()->edges_.size() && BaseIter::mesh()->is_deleted(EdgeHandle(cur_index_)))
883 if((
unsigned int)cur_index_ >= BaseIter::mesh()->edges_.size()) {
884 BaseIter::valid(
false);
886 BaseIter::cur_handle(EdgeHandle(cur_index_));
895 HalfEdgeIter::HalfEdgeIter(
const TopologyKernel* _mesh,
const HalfEdgeHandle& _heh) :
896 BaseIter(_mesh, _heh),
897 cur_index_(_heh.idx()) {
899 while ((
unsigned int)cur_index_ < BaseIter::mesh()->edges_.size() * 2 && BaseIter::mesh()->is_deleted(HalfEdgeHandle(cur_index_)))
901 if((
unsigned int)cur_index_ >= BaseIter::mesh()->edges_.size() * 2) {
902 BaseIter::valid(
false);
904 BaseIter::cur_handle(HalfEdgeHandle(cur_index_));
908 HalfEdgeIter& HalfEdgeIter::operator--() {
911 while (cur_index_ >= 0 && BaseIter::mesh()->is_deleted(HalfEdgeHandle(cur_index_)))
914 BaseIter::valid(
false);
916 BaseIter::cur_handle(HalfEdgeHandle(cur_index_));
921 HalfEdgeIter& HalfEdgeIter::operator++() {
924 while ((
unsigned int)cur_index_ < BaseIter::mesh()->edges_.size() * 2 && BaseIter::mesh()->is_deleted(HalfEdgeHandle(cur_index_)))
926 if((
unsigned int)cur_index_ >= BaseIter::mesh()->edges_.size() * 2) {
927 BaseIter::valid(
false);
929 BaseIter::cur_handle(HalfEdgeHandle(cur_index_));
938 FaceIter::FaceIter(
const TopologyKernel* _mesh,
const FaceHandle& _fh) :
939 BaseIter(_mesh, _fh),
940 cur_index_(_fh.idx()) {
942 while ((
unsigned int)cur_index_ < BaseIter::mesh()->faces_.size() && BaseIter::mesh()->is_deleted(FaceHandle(cur_index_)))
944 if((
unsigned int)cur_index_ >= BaseIter::mesh()->faces_.size()) {
945 BaseIter::valid(
false);
947 BaseIter::cur_handle(FaceHandle(cur_index_));
951 FaceIter& FaceIter::operator--() {
954 while (cur_index_ >= 0 && BaseIter::mesh()->is_deleted(FaceHandle(cur_index_)))
957 BaseIter::valid(
false);
959 BaseIter::cur_handle(FaceHandle(cur_index_));
964 FaceIter& FaceIter::operator++() {
967 while ((
unsigned int)cur_index_ < BaseIter::mesh()->faces_.size() && BaseIter::mesh()->is_deleted(FaceHandle(cur_index_)))
969 if((
unsigned int)cur_index_ >= BaseIter::mesh()->faces_.size()) {
970 BaseIter::valid(
false);
972 BaseIter::cur_handle(FaceHandle(cur_index_));
981 HalfFaceIter::HalfFaceIter(
const TopologyKernel* _mesh,
const HalfFaceHandle& _hfh) :
982 BaseIter(_mesh, _hfh),
983 cur_index_(_hfh.idx()) {
985 while ((
unsigned int)cur_index_ < BaseIter::mesh()->faces_.size() * 2 && BaseIter::mesh()->is_deleted(HalfFaceHandle(cur_index_)))
987 if((
unsigned int)cur_index_ >= BaseIter::mesh()->faces_.size() * 2) {
988 BaseIter::valid(
false);
990 BaseIter::cur_handle(HalfFaceHandle(cur_index_));
994 HalfFaceIter& HalfFaceIter::operator--() {
997 while (cur_index_ >= 0 && BaseIter::mesh()->is_deleted(HalfFaceHandle(cur_index_)))
1000 BaseIter::valid(
false);
1002 BaseIter::cur_handle(HalfFaceHandle(cur_index_));
1007 HalfFaceIter& HalfFaceIter::operator++() {
1010 while ((
unsigned int)cur_index_ < BaseIter::mesh()->faces_.size() * 2 && BaseIter::mesh()->is_deleted(HalfFaceHandle(cur_index_)))
1012 if((
unsigned int)cur_index_ >= BaseIter::mesh()->faces_.size() * 2) {
1013 BaseIter::valid(
false);
1015 BaseIter::cur_handle(HalfFaceHandle(cur_index_));
1024 CellIter::CellIter(
const TopologyKernel* _mesh,
const CellHandle& _ch) :
1025 BaseIter(_mesh, _ch),
1026 cur_index_(_ch.idx()) {
1028 while ((
unsigned int)cur_index_ < BaseIter::mesh()->cells_.size() && BaseIter::mesh()->is_deleted(CellHandle(cur_index_)))
1030 if((
unsigned int)cur_index_ >= BaseIter::mesh()->cells_.size()) {
1031 BaseIter::valid(
false);
1033 BaseIter::cur_handle(CellHandle(cur_index_));
1037 CellIter& CellIter::operator--() {
1040 while (cur_index_ >= 0 && BaseIter::mesh()->is_deleted(CellHandle(cur_index_)))
1042 if(cur_index_ < 0) {
1043 BaseIter::valid(
false);
1045 BaseIter::cur_handle(CellHandle(cur_index_));
1050 CellIter& CellIter::operator++() {
1053 while ((
unsigned int)cur_index_ < BaseIter::mesh()->cells_.size() && BaseIter::mesh()->is_deleted(CellHandle(cur_index_)))
1055 if((
unsigned int)cur_index_ >= BaseIter::mesh()->cells_.size()) {
1056 BaseIter::valid(
false);
1058 BaseIter::cur_handle(CellHandle(cur_index_));
1062 namespace Internal {
1068 VertexIHalfEdgeIterImpl::VertexIHalfEdgeIterImpl(
const VertexHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1069 BaseIter(_mesh, _ref_h, _max_laps),
1070 voh_iter_(_mesh->voh_iter(_ref_h, _max_laps))
1072 BaseIter::valid(voh_iter_.valid());
1073 if (BaseIter::valid()) {
1074 BaseIter::cur_handle(mesh()->opposite_halfedge_handle(*voh_iter_));
1078 VertexIHalfEdgeIterImpl& VertexIHalfEdgeIterImpl::operator--() {
1080 BaseIter::lap(voh_iter_.lap());
1081 BaseIter::valid(voh_iter_.valid());
1082 BaseIter::cur_handle(mesh()->opposite_halfedge_handle(*voh_iter_));
1086 VertexIHalfEdgeIterImpl& VertexIHalfEdgeIterImpl::operator++() {
1088 BaseIter::lap(voh_iter_.lap());
1089 BaseIter::valid(voh_iter_.valid());
1090 BaseIter::cur_handle(mesh()->opposite_halfedge_handle(*voh_iter_));
1098 VertexEdgeIterImpl::VertexEdgeIterImpl(
const VertexHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1099 BaseIter(_mesh, _ref_h, _max_laps),
1100 voh_iter_(_mesh->voh_iter(_ref_h, _max_laps))
1102 BaseIter::valid(voh_iter_.valid());
1103 if (BaseIter::valid()) {
1104 BaseIter::cur_handle(mesh()->edge_handle(*voh_iter_));
1108 VertexEdgeIterImpl& VertexEdgeIterImpl::operator--() {
1110 BaseIter::lap(voh_iter_.lap());
1111 BaseIter::valid(voh_iter_.valid());
1112 BaseIter::cur_handle(mesh()->edge_handle(*voh_iter_));
1116 VertexEdgeIterImpl& VertexEdgeIterImpl::operator++() {
1118 BaseIter::lap(voh_iter_.lap());
1119 BaseIter::valid(voh_iter_.valid());
1120 BaseIter::cur_handle(mesh()->edge_handle(*voh_iter_));
1128 VertexHalfFaceIterImpl::VertexHalfFaceIterImpl(
const VertexHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1129 BaseIter(_mesh, _ref_h, _max_laps),
1132 for (VertexEdgeIter ve_iter = _mesh->ve_iter(_ref_h); ve_iter.valid(); ++ve_iter) {
1133 for (EdgeHalfFaceIter ehf_iter = _mesh->ehf_iter(*ve_iter); ehf_iter.valid(); ++ehf_iter) {
1134 halffaces_.push_back(*ehf_iter);
1139 std::sort(halffaces_.begin(), halffaces_.end());
1140 halffaces_.resize(std::unique(halffaces_.begin(), halffaces_.end()) - halffaces_.begin());
1142 BaseIter::valid(halffaces_.size() > 0);
1143 if (BaseIter::valid()) {
1144 BaseIter::cur_handle(halffaces_[cur_index_]);
1148 VertexHalfFaceIterImpl& VertexHalfFaceIterImpl::operator--() {
1149 if (cur_index_ == 0) {
1150 cur_index_ = halffaces_.size() - 1;
1153 BaseIter::valid(
false);
1158 BaseIter::cur_handle(halffaces_[cur_index_]);
1162 VertexHalfFaceIterImpl& VertexHalfFaceIterImpl::operator++() {
1164 if (cur_index_ >= halffaces_.size()) {
1167 if (lap_ >= max_laps_)
1168 BaseIter::valid(
false);
1170 BaseIter::cur_handle(halffaces_[cur_index_]);
1179 HalfEdgeFaceIterImpl::HalfEdgeFaceIterImpl(
const HalfEdgeHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1180 BaseIter(_mesh, _ref_h, _max_laps),
1183 for (HalfEdgeHalfFaceIter hehf_iter = _mesh->hehf_iter(_ref_h); hehf_iter.valid(); ++hehf_iter) {
1184 faces_.push_back(_mesh->face_handle(*hehf_iter));
1188 std::sort(faces_.begin(), faces_.end());
1189 faces_.resize(std::unique(faces_.begin(), faces_.end()) - faces_.begin());
1191 BaseIter::valid(faces_.size() > 0);
1192 if (BaseIter::valid()) {
1193 BaseIter::cur_handle(faces_[cur_index_]);
1197 HalfEdgeFaceIterImpl& HalfEdgeFaceIterImpl::operator--() {
1198 if (cur_index_ == 0) {
1199 cur_index_ = faces_.size() - 1;
1202 BaseIter::valid(
false);
1207 BaseIter::cur_handle(faces_[cur_index_]);
1211 HalfEdgeFaceIterImpl& HalfEdgeFaceIterImpl::operator++() {
1213 if (cur_index_ >= faces_.size()) {
1216 if (lap_ >= max_laps_)
1217 BaseIter::valid(
false);
1219 BaseIter::cur_handle(faces_[cur_index_]);
1228 EdgeHalfFaceIterImpl::EdgeHalfFaceIterImpl(
const EdgeHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1229 BaseIter(_mesh, _ref_h, _max_laps),
1232 const HalfEdgeHandle he = _mesh->halfedge_handle(_ref_h, 0);
1233 for (HalfEdgeHalfFaceIter hehf_iter = _mesh->hehf_iter(he); hehf_iter.valid(); ++hehf_iter) {
1234 halffaces_.push_back(*hehf_iter);
1235 halffaces_.push_back(_mesh->opposite_halfface_handle(*hehf_iter));
1238 BaseIter::valid(halffaces_.size() > 0);
1239 if (BaseIter::valid()) {
1240 BaseIter::cur_handle(halffaces_[cur_index_]);
1244 EdgeHalfFaceIterImpl& EdgeHalfFaceIterImpl::operator--() {
1245 if (cur_index_ == 0) {
1246 cur_index_ = halffaces_.size() - 1;
1249 BaseIter::valid(
false);
1254 BaseIter::cur_handle(halffaces_[cur_index_]);
1258 EdgeHalfFaceIterImpl& EdgeHalfFaceIterImpl::operator++() {
1260 if (cur_index_ >= halffaces_.size()) {
1263 if (lap_ >= max_laps_)
1264 BaseIter::valid(
false);
1266 BaseIter::cur_handle(halffaces_[cur_index_]);
1275 EdgeFaceIterImpl::EdgeFaceIterImpl(
const EdgeHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1276 HalfEdgeFaceIterImpl(_mesh->halfedge_handle(_ref_h, 0), _mesh, _max_laps) {}
1283 EdgeCellIterImpl::EdgeCellIterImpl(
const EdgeHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1284 HalfEdgeCellIter(_mesh->halfedge_handle(_ref_h, 0), _mesh, _max_laps) {}
1291 HalfFaceHalfEdgeIterImpl::HalfFaceHalfEdgeIterImpl(
const HalfFaceHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1292 BaseIter(_mesh, _ref_h, _max_laps),
1295 BaseIter::valid(_ref_h.is_valid() && _mesh->halfface(_ref_h).halfedges().size() > 0);
1296 if (BaseIter::valid()) {
1297 BaseIter::cur_handle(_mesh->halfface(_ref_h).halfedges()[cur_index_]);
1301 HalfFaceHalfEdgeIterImpl& HalfFaceHalfEdgeIterImpl::operator--() {
1302 const std::vector<HalfEdgeHandle> halfedges =
1303 mesh()->halfface(ref_handle()).halfedges();
1304 if (cur_index_ == 0) {
1305 cur_index_ = halfedges.size() - 1;
1308 BaseIter::valid(
false);
1313 BaseIter::cur_handle(halfedges[cur_index_]);
1317 HalfFaceHalfEdgeIterImpl& HalfFaceHalfEdgeIterImpl::operator++() {
1318 const std::vector<HalfEdgeHandle> halfedges =
1319 mesh()->halfface(ref_handle()).halfedges();
1321 if (cur_index_ >= halfedges.size()) {
1324 if (lap_ >= max_laps_)
1325 BaseIter::valid(
false);
1327 BaseIter::cur_handle(halfedges[cur_index_]);
1336 HalfFaceEdgeIterImpl::HalfFaceEdgeIterImpl(
const HalfFaceHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1337 BaseIter(_mesh, _ref_h, _max_laps),
1340 BaseIter::valid(_ref_h.is_valid() && _mesh->halfface(_ref_h).halfedges().size() > 0);
1341 if (BaseIter::valid()) {
1342 HalfEdgeHandle he = _mesh->halfface(_ref_h).halfedges()[cur_index_];
1343 BaseIter::cur_handle(_mesh->edge_handle(he));
1347 HalfFaceEdgeIterImpl& HalfFaceEdgeIterImpl::operator--() {
1348 const std::vector<HalfEdgeHandle> halfedges =
1349 mesh()->halfface(ref_handle()).halfedges();
1350 if (cur_index_ == 0) {
1351 cur_index_ = halfedges.size() - 1;
1354 BaseIter::valid(
false);
1359 BaseIter::cur_handle(mesh()->edge_handle(halfedges[cur_index_]));
1363 HalfFaceEdgeIterImpl& HalfFaceEdgeIterImpl::operator++() {
1364 const std::vector<HalfEdgeHandle> halfedges =
1365 mesh()->halfface(ref_handle()).halfedges();
1367 if (cur_index_ >= halfedges.size()) {
1370 if (lap_ >= max_laps_)
1371 BaseIter::valid(
false);
1373 BaseIter::cur_handle(mesh()->edge_handle(halfedges[cur_index_]));
1381 FaceVertexIterImpl::FaceVertexIterImpl(
const FaceHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1382 HalfFaceVertexIter(_mesh->halfface_handle(_ref_h, 0), _mesh, _max_laps) {}
1388 FaceHalfEdgeIterImpl::FaceHalfEdgeIterImpl(
const FaceHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1389 HalfFaceHalfEdgeIterImpl(_mesh->halfface_handle(_ref_h, 0), _mesh, _max_laps) {}
1396 FaceEdgeIterImpl::FaceEdgeIterImpl(
const FaceHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1397 HalfFaceEdgeIterImpl(_mesh->halfface_handle(_ref_h, 0), _mesh, _max_laps) {}
1404 CellHalfEdgeIterImpl::CellHalfEdgeIterImpl(
const CellHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1405 BaseIter(_mesh, _ref_h, _max_laps),
1408 for (CellHalfFaceIter chf_iter =_mesh->chf_iter(_ref_h); chf_iter.valid(); ++chf_iter) {
1409 for (HalfFaceHalfEdgeIter hfhe_iter =_mesh->hfhe_iter(*chf_iter); hfhe_iter.valid(); ++hfhe_iter) {
1410 halfedges_.push_back(*hfhe_iter);
1413 BaseIter::valid(halfedges_.size() > 0);
1414 if (BaseIter::valid()) {
1415 BaseIter::cur_handle(halfedges_[cur_index_]);
1419 CellHalfEdgeIterImpl& CellHalfEdgeIterImpl::operator--() {
1420 if (cur_index_ == 0) {
1421 cur_index_ = halfedges_.size() - 1;
1424 BaseIter::valid(
false);
1429 BaseIter::cur_handle(halfedges_[cur_index_]);
1433 CellHalfEdgeIterImpl& CellHalfEdgeIterImpl::operator++() {
1435 if (cur_index_ >= halfedges_.size()) {
1438 if (lap_ >= max_laps_)
1439 BaseIter::valid(
false);
1441 BaseIter::cur_handle(halfedges_[cur_index_]);
1450 CellEdgeIterImpl::CellEdgeIterImpl(
const CellHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1451 BaseIter(_mesh, _ref_h, _max_laps),
1454 for (CellHalfEdgeIter che_iter = _mesh->che_iter(_ref_h); che_iter.valid(); ++che_iter) {
1455 edges_.push_back(_mesh->edge_handle(*che_iter));
1459 std::sort(edges_.begin(), edges_.end());
1460 edges_.resize(std::unique(edges_.begin(), edges_.end()) - edges_.begin());
1462 BaseIter::valid(edges_.size() > 0);
1463 if (BaseIter::valid()) {
1464 BaseIter::cur_handle(edges_[cur_index_]);
1468 CellEdgeIterImpl& CellEdgeIterImpl::operator--() {
1469 if (cur_index_ == 0) {
1470 cur_index_ = edges_.size() - 1;
1473 BaseIter::valid(
false);
1478 BaseIter::cur_handle(edges_[cur_index_]);
1482 CellEdgeIterImpl& CellEdgeIterImpl::operator++() {
1484 if (cur_index_ >= edges_.size()) {
1487 if (lap_ >= max_laps_)
1488 BaseIter::valid(
false);
1490 BaseIter::cur_handle(edges_[cur_index_]);
1499 CellHalfFaceIterImpl::CellHalfFaceIterImpl(
const CellHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1500 BaseIter(_mesh, _ref_h, _max_laps),
1501 hf_iter_(BaseIter::mesh()->cell(_ref_h).halffaces().begin())
1503 BaseIter::valid(hf_iter_ != BaseIter::mesh()->cell(_ref_h).halffaces().end());
1504 if (BaseIter::valid()) {
1505 BaseIter::cur_handle(*hf_iter_);
1509 CellHalfFaceIterImpl& CellHalfFaceIterImpl::operator--() {
1510 const std::vector<HalfFaceHandle>& halffaces =
1511 BaseIter::mesh()->cell(ref_handle_).halffaces();
1512 if (hf_iter_ == halffaces.begin()) {
1513 hf_iter_ = halffaces.end();
1516 BaseIter::valid(
false);
1521 BaseIter::cur_handle(*hf_iter_);
1525 CellHalfFaceIterImpl& CellHalfFaceIterImpl::operator++() {
1527 const std::vector<HalfFaceHandle>& halffaces =
1528 BaseIter::mesh()->cell(ref_handle_).halffaces();
1529 if (hf_iter_ == halffaces.end()) {
1530 hf_iter_ = halffaces.begin();
1532 if (lap_ >= max_laps_)
1533 BaseIter::valid(
false);
1535 BaseIter::cur_handle(*hf_iter_);
1544 CellFaceIterImpl::CellFaceIterImpl(
const CellHandle& _ref_h,
const TopologyKernel* _mesh,
int _max_laps) :
1545 BaseIter(_mesh, _ref_h, _max_laps),
1546 hf_iter_(BaseIter::mesh()->cell(_ref_h).halffaces().begin())
1548 BaseIter::valid(hf_iter_ != BaseIter::mesh()->cell(_ref_h).halffaces().end());
1549 if (BaseIter::valid()) {
1550 BaseIter::cur_handle(BaseIter::mesh()->face_handle(*hf_iter_));
1554 CellFaceIterImpl& CellFaceIterImpl::operator--() {
1555 const std::vector<HalfFaceHandle>& halffaces =
1556 BaseIter::mesh()->cell(ref_handle_).halffaces();
1557 if (hf_iter_ == halffaces.begin()) {
1558 hf_iter_ = halffaces.end();
1561 BaseIter::valid(
false);
1566 BaseIter::cur_handle(BaseIter::mesh()->face_handle(*hf_iter_));
1570 CellFaceIterImpl& CellFaceIterImpl::operator++() {
1572 const std::vector<HalfFaceHandle>& halffaces =
1573 BaseIter::mesh()->cell(ref_handle_).halffaces();
1574 if (hf_iter_ == halffaces.end()) {
1575 hf_iter_ = halffaces.begin();
1577 if (lap_ >= max_laps_)
1578 BaseIter::valid(
false);
1580 BaseIter::cur_handle(BaseIter::mesh()->face_handle(*hf_iter_));
1592 size_t BoundaryItemIter<VertexIter, VertexHandle>::n_items()
const {
1593 return BaseIter::mesh()->n_vertices();
1597 size_t BoundaryItemIter<HalfEdgeIter, HalfEdgeHandle>::n_items()
const {
1598 return BaseIter::mesh()->n_halfedges();
1602 size_t BoundaryItemIter<EdgeIter, EdgeHandle>::n_items()
const {
1603 return BaseIter::mesh()->n_edges();
1607 size_t BoundaryItemIter<HalfFaceIter, HalfFaceHandle>::n_items()
const {
1608 return BaseIter::mesh()->n_halffaces();
1612 size_t BoundaryItemIter<FaceIter, FaceHandle>::n_items()
const {
1613 return BaseIter::mesh()->n_faces();
1617 size_t BoundaryItemIter<CellIter, CellHandle>::n_items()
const {
1618 return BaseIter::mesh()->n_cells();
1622 bool BoundaryItemIter<VertexIter, VertexHandle>::has_incidences()
const {
1623 return BaseIter::mesh()->has_full_bottom_up_incidences();
1627 bool BoundaryItemIter<HalfEdgeIter, HalfEdgeHandle>::has_incidences()
const {
1628 const TopologyKernel *mesh = BaseIter::mesh();
1629 return mesh->has_edge_bottom_up_incidences() && mesh->has_face_bottom_up_incidences();
1633 bool BoundaryItemIter<EdgeIter, EdgeHandle>::has_incidences()
const {
1634 const TopologyKernel *mesh = BaseIter::mesh();
1635 return mesh->has_edge_bottom_up_incidences() && mesh->has_face_bottom_up_incidences();
1639 bool BoundaryItemIter<HalfFaceIter, HalfFaceHandle>::has_incidences()
const {
1640 return BaseIter::mesh()->has_face_bottom_up_incidences();
1644 bool BoundaryItemIter<FaceIter, FaceHandle>::has_incidences()
const {
1645 return BaseIter::mesh()->has_face_bottom_up_incidences();
1649 bool BoundaryItemIter<CellIter, CellHandle>::has_incidences()
const {