OpenVolumeMesh
Loading...
Searching...
No Matches
Iterators.hh
1/*===========================================================================*\
2 * *
3 * OpenVolumeMesh *
4 * Copyright (C) 2011 by Computer Graphics Group, RWTH Aachen *
5 * www.openvolumemesh.org *
6 * *
7 *---------------------------------------------------------------------------*
8 * This file is part of OpenVolumeMesh. *
9 * *
10 * OpenVolumeMesh is free software: you can redistribute it and/or modify *
11 * it under the terms of the GNU Lesser General Public License as *
12 * published by the Free Software Foundation, either version 3 of *
13 * the License, or (at your option) any later version with the *
14 * following exceptions: *
15 * *
16 * If other files instantiate templates or use macros *
17 * or inline functions from this file, or you compile this file and *
18 * link it with other files to produce an executable, this file does *
19 * not by itself cause the resulting executable to be covered by the *
20 * GNU Lesser General Public License. This exception does not however *
21 * invalidate any other reasons why the executable file might be *
22 * covered by the GNU Lesser General Public License. *
23 * *
24 * OpenVolumeMesh is distributed in the hope that it will be useful, *
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
27 * GNU Lesser General Public License for more details. *
28 * *
29 * You should have received a copy of the GNU LesserGeneral Public *
30 * License along with OpenVolumeMesh. If not, *
31 * see <http://www.gnu.org/licenses/>. *
32 * *
33\*===========================================================================*/
34
35/*===========================================================================*\
36 * *
37 * $Revision$ *
38 * $Date$ *
39 * $LastChangedBy$ *
40 * *
41\*===========================================================================*/
42
43#ifndef ITERATORS_HH_
44#define ITERATORS_HH_
45
46#include <iterator>
47#include <set>
48#include <vector>
49
50#include "OpenVolumeMeshHandle.hh"
51
52namespace OpenVolumeMesh {
53
54class TopologyKernel;
55
56template <
57class OH /* Output handle type */>
58class BaseIterator {
59public:
60
61 // STL compliance
62 typedef std::bidirectional_iterator_tag iterator_category;
63 typedef int difference_type;
64 typedef const OH value_type;
65 typedef const OH* pointer;
66 typedef const OH& reference;
67
68
69 BaseIterator(const TopologyKernel* _mesh, const OH& _ch) :
70 valid_(true), cur_handle_(_ch), mesh_(_mesh) {}
71
72 BaseIterator(const TopologyKernel* _mesh) :
73 valid_(true), mesh_(_mesh) {}
74
75 // STL compliance (needs to have default constructor)
76 BaseIterator() : valid_(false), mesh_(0) {}
77 virtual ~BaseIterator() {}
78 bool operator== (const BaseIterator& _c) const {
79 return (this->cur_handle_ == _c.cur_handle() &&
80 this->valid_ == _c.valid() &&
81 this->mesh_ == _c.mesh());
82 }
83 bool operator!= (const BaseIterator& _c) const {
84 return !this->operator==(_c);
85 }
86
87 pointer operator->() const {
88 return &cur_handle_;
89 }
90
91 reference operator*() const {
92 return cur_handle_;
93 }
94
95 bool operator< (const BaseIterator& _c) const {
96 return cur_handle_.idx() < _c.cur_handle_.idx();
97 }
98
99 BaseIterator& operator=(const BaseIterator& _c) {
100 this->valid_ = _c.valid();
101 this->cur_handle_ = _c.cur_handle();
102 this->mesh_ = _c.mesh();
103 return *this;
104 }
105
106 operator bool() const {
107 return valid_;
108 }
109
110 void valid(bool _valid) {
111 valid_ = _valid;
112 }
113 bool valid() const {
114 return valid_;
115 }
116 void cur_handle(const OH& _h) {
117 cur_handle_ = _h;
118 }
119 reference cur_handle() const {
120 return cur_handle_;
121 }
122 const TopologyKernel* mesh() const {
123 return mesh_;
124 }
125
126private:
127
128 bool valid_;
129 OH cur_handle_;
130 const TopologyKernel* mesh_;
131};
132
133template <
134class IH /* Input handle type */,
135class OH /* Output handle type */>
136class BaseCirculator : public BaseIterator<OH> {
137public:
138
139 typedef BaseIterator<OH> BaseIter;
140
141 BaseCirculator(const TopologyKernel* _mesh, const IH& _ih, const OH& _oh, int _max_laps = 1) :
142 BaseIter(_mesh, _oh),
143 lap_(0),
144 max_laps_(_max_laps),
145 ref_handle_(_ih)
146 {}
147
148 BaseCirculator(const TopologyKernel* _mesh, const IH& _ih, int _max_laps = 1) :
149 BaseIter(_mesh, OH()),
150 lap_(0),
151 max_laps_(_max_laps),
152 ref_handle_(_ih)
153 {}
154
155 // STL compliance (needs to have default constructor)
156 BaseCirculator() :
157 BaseIter(),
158 lap_(0),
159 max_laps_(1)
160 {}
161
162 virtual ~BaseCirculator() {}
163
164 bool operator== (const BaseCirculator& _c) const {
165 return (BaseIter::operator==(_c) &&
166 this->lap() == _c.lap() &&
167 this->ref_handle() == _c.ref_handle());
168 }
169 bool operator!= (const BaseCirculator& _c) const {
170 return !this->operator==(_c);
171 }
172
173 bool operator< (const BaseCirculator& _c) const {
174 if (lap_ == _c.lap_)
175 return BaseIter::operator<(_c);
176 else
177 return lap_ < _c.lap_;
178 }
179
180 BaseCirculator& operator=(const BaseCirculator& _c) {
181 BaseIter::operator=(_c);
182 this->ref_handle_ = _c.ref_handle();
183 this->lap_ = _c.lap_;
184 this->max_laps_ = _c.max_laps_;
185 return *this;
186 }
187
188 const IH& ref_handle() const {
189 return ref_handle_;
190 }
191
192 void lap(int _lap) {
193 lap_ = _lap;
194 }
195 int lap() const {
196 return lap_;
197 }
198
199 void max_laps(int _max_laps) {
200 max_laps_ = _max_laps;
201 }
202 int max_laps() const {
203 return max_laps_;
204 }
205
206protected:
207 int lap_;
208 int max_laps_;
209 IH ref_handle_;
210
211};
212
213//===========================================================================
214
215class VertexOHalfEdgeIter :
216 public BaseCirculator<
217 VertexHandle,
218 HalfEdgeHandle> {
219public:
220 typedef BaseCirculator<
222 HalfEdgeHandle> BaseIter;
223
224
225 VertexOHalfEdgeIter(const VertexHandle& _vIdx,
226 const TopologyKernel* _mesh, int _max_laps = 1);
227
228 // Post increment/decrement operator
229 VertexOHalfEdgeIter operator++(int) {
230 VertexOHalfEdgeIter cpy = *this;
231 ++(*this);
232 return cpy;
233 }
234 VertexOHalfEdgeIter operator--(int) {
235 VertexOHalfEdgeIter cpy = *this;
236 --(*this);
237 return cpy;
238 }
239 VertexOHalfEdgeIter operator+(int _n) {
240 VertexOHalfEdgeIter cpy = *this;
241 for(int i = 0; i < _n; ++i) {
242 ++cpy;
243 }
244 return cpy;
245 }
246 VertexOHalfEdgeIter operator-(int _n) {
247 VertexOHalfEdgeIter cpy = *this;
248 for(int i = 0; i < _n; ++i) {
249 --cpy;
250 }
251 return cpy;
252 }
253 VertexOHalfEdgeIter& operator+=(int _n) {
254 for(int i = 0; i < _n; ++i) {
255 ++(*this);
256 }
257 return *this;
258 }
259 VertexOHalfEdgeIter& operator-=(int _n) {
260 for(int i = 0; i < _n; ++i) {
261 --(*this);
262 }
263 return *this;
264 }
265
266 VertexOHalfEdgeIter& operator++();
267 VertexOHalfEdgeIter& operator--();
268
269private:
270
271 size_t cur_index_;
272};
273
274//===========================================================================
275
276class HalfEdgeHalfFaceIter : public BaseCirculator<
277 HalfEdgeHandle,
278 HalfFaceHandle> {
279public:
280 typedef BaseCirculator<
282 HalfFaceHandle> BaseIter;
283
284
285 HalfEdgeHalfFaceIter(const HalfEdgeHandle& _heIdx, const TopologyKernel* _mesh, int _max_laps);
286
287 // Post increment/decrement operator
288 HalfEdgeHalfFaceIter operator++(int) {
289 HalfEdgeHalfFaceIter cpy = *this;
290 ++(*this);
291 return cpy;
292 }
293 HalfEdgeHalfFaceIter operator--(int) {
294 HalfEdgeHalfFaceIter cpy = *this;
295 --(*this);
296 return cpy;
297 }
298 HalfEdgeHalfFaceIter operator+(int _n) {
299 HalfEdgeHalfFaceIter cpy = *this;
300 for(int i = 0; i < _n; ++i) {
301 ++cpy;
302 }
303 return cpy;
304 }
305 HalfEdgeHalfFaceIter operator-(int _n) {
306 HalfEdgeHalfFaceIter cpy = *this;
307 for(int i = 0; i < _n; ++i) {
308 --cpy;
309 }
310 return cpy;
311 }
312 HalfEdgeHalfFaceIter& operator+=(int _n) {
313 for(int i = 0; i < _n; ++i) {
314 ++(*this);
315 }
316 return *this;
317 }
318 HalfEdgeHalfFaceIter& operator-=(int _n) {
319 for(int i = 0; i < _n; ++i) {
320 --(*this);
321 }
322 return *this;
323 }
324
325 HalfEdgeHalfFaceIter& operator++();
326 HalfEdgeHalfFaceIter& operator--();
327
328private:
329 size_t cur_index_;
330};
331
332//===========================================================================
333
334class VertexCellIter : public BaseCirculator<
335 VertexHandle,
336 CellHandle> {
337public:
338 typedef BaseCirculator<
340 CellHandle> BaseIter;
341
342 VertexCellIter(const VertexHandle& _vIdx, const TopologyKernel* _mesh, int _max_laps = 1);
343
344 // Post increment/decrement operator
345 VertexCellIter operator++(int) {
346 VertexCellIter cpy = *this;
347 ++(*this);
348 return cpy;
349 }
350 VertexCellIter operator--(int) {
351 VertexCellIter cpy = *this;
352 --(*this);
353 return cpy;
354 }
355 VertexCellIter operator+(int _n) {
356 VertexCellIter cpy = *this;
357 for(int i = 0; i < _n; ++i) {
358 ++cpy;
359 }
360 return cpy;
361 }
362 VertexCellIter operator-(int _n) {
363 VertexCellIter cpy = *this;
364 for(int i = 0; i < _n; ++i) {
365 --cpy;
366 }
367 return cpy;
368 }
369 VertexCellIter& operator+=(int _n) {
370 for(int i = 0; i < _n; ++i) {
371 ++(*this);
372 }
373 return *this;
374 }
375 VertexCellIter& operator-=(int _n) {
376 for(int i = 0; i < _n; ++i) {
377 --(*this);
378 }
379 return *this;
380 }
381
382 VertexCellIter& operator++();
383 VertexCellIter& operator--();
384
385private:
386 std::vector<CellHandle> cells_;
387 size_t cur_index_;
388};
389
390class HalfEdgeCellIter : public BaseCirculator<
391 HalfEdgeHandle,
392 CellHandle> {
393public:
394 typedef BaseCirculator<
396 CellHandle> BaseIter;
397
398
399 HalfEdgeCellIter(const HalfEdgeHandle& _heIdx, const TopologyKernel* _mesh, int _max_laps = 1);
400
401 // Post increment/decrement operator
402 HalfEdgeCellIter operator++(int) {
403 HalfEdgeCellIter cpy = *this;
404 ++(*this);
405 return cpy;
406 }
407 HalfEdgeCellIter operator--(int) {
408 HalfEdgeCellIter cpy = *this;
409 --(*this);
410 return cpy;
411 }
412 HalfEdgeCellIter operator+(int _n) {
413 HalfEdgeCellIter cpy = *this;
414 for(int i = 0; i < _n; ++i) {
415 ++cpy;
416 }
417 return cpy;
418 }
419 HalfEdgeCellIter operator-(int _n) {
420 HalfEdgeCellIter cpy = *this;
421 for(int i = 0; i < _n; ++i) {
422 --cpy;
423 }
424 return cpy;
425 }
426 HalfEdgeCellIter& operator+=(int _n) {
427 for(int i = 0; i < _n; ++i) {
428 ++(*this);
429 }
430 return *this;
431 }
432 HalfEdgeCellIter& operator-=(int _n) {
433 for(int i = 0; i < _n; ++i) {
434 --(*this);
435 }
436 return *this;
437 }
438
439 HalfEdgeCellIter& operator++();
440 HalfEdgeCellIter& operator--();
441
442private:
443 CellHandle getCellHandle(int _cur_index) const;
444
445private:
446 std::vector<CellHandle> cells_;
447 size_t cur_index_;
448};
449
450//===========================================================================
451
452class CellVertexIter : public BaseCirculator<
453 CellHandle,
454 VertexHandle> {
455public:
456 typedef BaseCirculator<
458 VertexHandle> BaseIter;
459
460 CellVertexIter(const CellHandle& _cIdx, const TopologyKernel* _mesh, int _max_laps = 1);
461
462 // Post increment/decrement operator
463 CellVertexIter operator++(int) {
464 CellVertexIter cpy = *this;
465 ++(*this);
466 return cpy;
467 }
468 CellVertexIter operator--(int) {
469 CellVertexIter cpy = *this;
470 --(*this);
471 return cpy;
472 }
473 CellVertexIter operator+(int _n) {
474 CellVertexIter cpy = *this;
475 for(int i = 0; i < _n; ++i) {
476 ++cpy;
477 }
478 return cpy;
479 }
480 CellVertexIter operator-(int _n) {
481 CellVertexIter cpy = *this;
482 for(int i = 0; i < _n; ++i) {
483 --cpy;
484 }
485 return cpy;
486 }
487 CellVertexIter& operator+=(int _n) {
488 for(int i = 0; i < _n; ++i) {
489 ++(*this);
490 }
491 return *this;
492 }
493 CellVertexIter& operator-=(int _n) {
494 for(int i = 0; i < _n; ++i) {
495 --(*this);
496 }
497 return *this;
498 }
499
500 CellVertexIter& operator++();
501 CellVertexIter& operator--();
502
503private:
504 std::vector<VertexHandle> incident_vertices_;
505 size_t cur_index_;
506};
507
508//===========================================================================
509
510class CellCellIter : public BaseCirculator<
511 CellHandle,
512 CellHandle> {
513public:
514 typedef BaseCirculator<
516 CellHandle> BaseIter;
517
518 CellCellIter(const CellHandle& _cIdx, const TopologyKernel* _mesh, int _max_laps = 1);
519
520 // Post increment/decrement operator
521 CellCellIter operator++(int) {
522 CellCellIter cpy = *this;
523 ++(*this);
524 return cpy;
525 }
526 CellCellIter operator--(int) {
527 CellCellIter cpy = *this;
528 --(*this);
529 return cpy;
530 }
531 CellCellIter operator+(int _n) {
532 CellCellIter cpy = *this;
533 for(int i = 0; i < _n; ++i) {
534 ++cpy;
535 }
536 return cpy;
537 }
538 CellCellIter operator-(int _n) {
539 CellCellIter cpy = *this;
540 for(int i = 0; i < _n; ++i) {
541 --cpy;
542 }
543 return cpy;
544 }
545 CellCellIter& operator+=(int _n) {
546 for(int i = 0; i < _n; ++i) {
547 ++(*this);
548 }
549 return *this;
550 }
551 CellCellIter& operator-=(int _n) {
552 for(int i = 0; i < _n; ++i) {
553 --(*this);
554 }
555 return *this;
556 }
557
558 CellCellIter& operator++();
559 CellCellIter& operator--();
560
561private:
562 std::vector<CellHandle> adjacent_cells_;
563 size_t cur_index_;
564};
565
566//===========================================================================
567
568class HalfFaceVertexIter : public BaseCirculator<
569 HalfFaceHandle,
570 VertexHandle> {
571public:
572 typedef BaseCirculator<
574 VertexHandle> BaseIter;
575
576 HalfFaceVertexIter(const HalfFaceHandle& _hIdx, const TopologyKernel* _mesh, int _max_laps = 1);
577
578 // Post increment/decrement operator
579 HalfFaceVertexIter operator++(int) {
580 HalfFaceVertexIter cpy = *this;
581 ++(*this);
582 return cpy;
583 }
584 HalfFaceVertexIter operator--(int) {
585 HalfFaceVertexIter cpy = *this;
586 --(*this);
587 return cpy;
588 }
589 HalfFaceVertexIter operator+(int _n) {
590 HalfFaceVertexIter cpy = *this;
591 for(int i = 0; i < _n; ++i) {
592 ++cpy;
593 }
594 return cpy;
595 }
596 HalfFaceVertexIter operator-(int _n) {
597 HalfFaceVertexIter cpy = *this;
598 for(int i = 0; i < _n; ++i) {
599 --cpy;
600 }
601 return cpy;
602 }
603 HalfFaceVertexIter& operator+=(int _n) {
604 for(int i = 0; i < _n; ++i) {
605 ++(*this);
606 }
607 return *this;
608 }
609 HalfFaceVertexIter& operator-=(int _n) {
610 for(int i = 0; i < _n; ++i) {
611 --(*this);
612 }
613 return *this;
614 }
615
616 HalfFaceVertexIter& operator++();
617 HalfFaceVertexIter& operator--();
618
619private:
620 std::vector<VertexHandle> vertices_;
621 size_t cur_index_;
622};
623
624//===========================================================================
625
626class BoundaryHalfFaceHalfFaceIter : public BaseCirculator<HalfFaceHandle,
627 HalfFaceHandle> {
628private:
629 typedef BaseCirculator<HalfFaceHandle,
630 HalfFaceHandle> BaseIter;
631public:
632 BoundaryHalfFaceHalfFaceIter(const HalfFaceHandle& _ref_h,
633 const TopologyKernel* _mesh, int _max_laps = 1);
634
635 // Post increment/decrement operator
636 BoundaryHalfFaceHalfFaceIter operator++(int) {
637 BoundaryHalfFaceHalfFaceIter cpy = *this;
638 ++(*this);
639 return cpy;
640 }
641 BoundaryHalfFaceHalfFaceIter operator--(int) {
642 BoundaryHalfFaceHalfFaceIter cpy = *this;
643 --(*this);
644 return cpy;
645 }
646 BoundaryHalfFaceHalfFaceIter operator+(int _n) {
647 BoundaryHalfFaceHalfFaceIter cpy = *this;
648 for(int i = 0; i < _n; ++i) {
649 ++cpy;
650 }
651 return cpy;
652 }
653 BoundaryHalfFaceHalfFaceIter operator-(int _n) {
654 BoundaryHalfFaceHalfFaceIter cpy = *this;
655 for(int i = 0; i < _n; ++i) {
656 --cpy;
657 }
658 return cpy;
659 }
660 BoundaryHalfFaceHalfFaceIter& operator+=(int _n) {
661 for(int i = 0; i < _n; ++i) {
662 ++(*this);
663 }
664 return *this;
665 }
666 BoundaryHalfFaceHalfFaceIter& operator-=(int _n) {
667 for(int i = 0; i < _n; ++i) {
668 --(*this);
669 }
670 return *this;
671 }
672
673 const EdgeHandle& common_edge() const { return common_edges_[cur_index_]; }
674
675 BoundaryHalfFaceHalfFaceIter& operator++();
676 BoundaryHalfFaceHalfFaceIter& operator--();
677
678private:
679 std::vector<HalfFaceHandle> neighbor_halffaces_;
680 std::vector<EdgeHandle> common_edges_;
681 size_t cur_index_;
682};
683
684//===========================================================================
685
686class VertexIter : public BaseIterator<VertexHandle> {
687public:
688 typedef BaseIterator<VertexHandle> BaseIter;
689
690
691 VertexIter(const TopologyKernel* _mesh, const VertexHandle& _vh = VertexHandle(0));
692
693 // Post increment/decrement operator
694 VertexIter operator++(int) {
695 VertexIter cpy = *this;
696 ++(*this);
697 return cpy;
698 }
699 VertexIter operator--(int) {
700 VertexIter cpy = *this;
701 --(*this);
702 return cpy;
703 }
704 VertexIter operator+(int _n) {
705 VertexIter cpy = *this;
706 for(int i = 0; i < _n; ++i) {
707 ++cpy;
708 }
709 return cpy;
710 }
711 VertexIter operator-(int _n) {
712 VertexIter cpy = *this;
713 for(int i = 0; i < _n; ++i) {
714 --cpy;
715 }
716 return cpy;
717 }
718 VertexIter& operator+=(int _n) {
719 for(int i = 0; i < _n; ++i) {
720 ++(*this);
721 }
722 return *this;
723 }
724 VertexIter& operator-=(int _n) {
725 for(int i = 0; i < _n; ++i) {
726 --(*this);
727 }
728 return *this;
729 }
730
731 VertexIter& operator++();
732 VertexIter& operator--();
733
734private:
735 int cur_index_;
736};
737
738//===========================================================================
739
740class EdgeIter : public BaseIterator<EdgeHandle> {
741public:
742 typedef BaseIterator<EdgeHandle> BaseIter;
743
744
745 EdgeIter(const TopologyKernel* _mesh, const EdgeHandle& _eh = EdgeHandle(0));
746
747 // Post increment/decrement operator
748 EdgeIter operator++(int) {
749 EdgeIter cpy = *this;
750 ++(*this);
751 return cpy;
752 }
753 EdgeIter operator--(int) {
754 EdgeIter cpy = *this;
755 --(*this);
756 return cpy;
757 }
758 EdgeIter operator+(int _n) {
759 EdgeIter cpy = *this;
760 for(int i = 0; i < _n; ++i) {
761 ++cpy;
762 }
763 return cpy;
764 }
765 EdgeIter operator-(int _n) {
766 EdgeIter cpy = *this;
767 for(int i = 0; i < _n; ++i) {
768 --cpy;
769 }
770 return cpy;
771 }
772 EdgeIter& operator+=(int _n) {
773 for(int i = 0; i < _n; ++i) {
774 ++(*this);
775 }
776 return *this;
777 }
778 EdgeIter& operator-=(int _n) {
779 for(int i = 0; i < _n; ++i) {
780 --(*this);
781 }
782 return *this;
783 }
784
785 EdgeIter& operator++();
786 EdgeIter& operator--();
787
788private:
789 int cur_index_;
790};
791
792//===========================================================================
793
794class HalfEdgeIter : public BaseIterator<HalfEdgeHandle> {
795public:
796 typedef BaseIterator<HalfEdgeHandle> BaseIter;
797
798
799 HalfEdgeIter(const TopologyKernel* _mesh, const HalfEdgeHandle& _heh = HalfEdgeHandle(0));
800
801 // Post increment/decrement operator
802 HalfEdgeIter operator++(int) {
803 HalfEdgeIter cpy = *this;
804 ++(*this);
805 return cpy;
806 }
807 HalfEdgeIter operator--(int) {
808 HalfEdgeIter cpy = *this;
809 --(*this);
810 return cpy;
811 }
812 HalfEdgeIter operator+(int _n) {
813 HalfEdgeIter cpy = *this;
814 for(int i = 0; i < _n; ++i) {
815 ++cpy;
816 }
817 return cpy;
818 }
819 HalfEdgeIter operator-(int _n) {
820 HalfEdgeIter cpy = *this;
821 for(int i = 0; i < _n; ++i) {
822 --cpy;
823 }
824 return cpy;
825 }
826 HalfEdgeIter& operator+=(int _n) {
827 for(int i = 0; i < _n; ++i) {
828 ++(*this);
829 }
830 return *this;
831 }
832 HalfEdgeIter& operator-=(int _n) {
833 for(int i = 0; i < _n; ++i) {
834 --(*this);
835 }
836 return *this;
837 }
838
839 HalfEdgeIter& operator++();
840 HalfEdgeIter& operator--();
841
842private:
843 int cur_index_;
844};
845
846//===========================================================================
847
848class FaceIter : public BaseIterator<FaceHandle> {
849public:
850 typedef BaseIterator<FaceHandle> BaseIter;
851
852
853 FaceIter(const TopologyKernel* _mesh, const FaceHandle& _fh = FaceHandle(0));
854
855 // Post increment/decrement operator
856 FaceIter operator++(int) {
857 FaceIter cpy = *this;
858 ++(*this);
859 return cpy;
860 }
861 FaceIter operator--(int) {
862 FaceIter cpy = *this;
863 --(*this);
864 return cpy;
865 }
866 FaceIter operator+(int _n) {
867 FaceIter cpy = *this;
868 for(int i = 0; i < _n; ++i) {
869 ++cpy;
870 }
871 return cpy;
872 }
873 FaceIter operator-(int _n) {
874 FaceIter cpy = *this;
875 for(int i = 0; i < _n; ++i) {
876 --cpy;
877 }
878 return cpy;
879 }
880 FaceIter& operator+=(int _n) {
881 for(int i = 0; i < _n; ++i) {
882 ++(*this);
883 }
884 return *this;
885 }
886 FaceIter& operator-=(int _n) {
887 for(int i = 0; i < _n; ++i) {
888 --(*this);
889 }
890 return *this;
891 }
892
893 FaceIter& operator++();
894 FaceIter& operator--();
895
896private:
897 int cur_index_;
898};
899
900//===========================================================================
901
902class HalfFaceIter : public BaseIterator<HalfFaceHandle> {
903public:
904 typedef BaseIterator<HalfFaceHandle> BaseIter;
905
906
907 HalfFaceIter(const TopologyKernel* _mesh, const HalfFaceHandle& _hfh = HalfFaceHandle(0));
908
909 // Post increment/decrement operator
910 HalfFaceIter operator++(int) {
911 HalfFaceIter cpy = *this;
912 ++(*this);
913 return cpy;
914 }
915 HalfFaceIter operator--(int) {
916 HalfFaceIter cpy = *this;
917 --(*this);
918 return cpy;
919 }
920 HalfFaceIter operator+(int _n) {
921 HalfFaceIter cpy = *this;
922 for(int i = 0; i < _n; ++i) {
923 ++cpy;
924 }
925 return cpy;
926 }
927 HalfFaceIter operator-(int _n) {
928 HalfFaceIter cpy = *this;
929 for(int i = 0; i < _n; ++i) {
930 --cpy;
931 }
932 return cpy;
933 }
934 HalfFaceIter& operator+=(int _n) {
935 for(int i = 0; i < _n; ++i) {
936 ++(*this);
937 }
938 return *this;
939 }
940 HalfFaceIter& operator-=(int _n) {
941 for(int i = 0; i < _n; ++i) {
942 --(*this);
943 }
944 return *this;
945 }
946
947 HalfFaceIter& operator++();
948 HalfFaceIter& operator--();
949
950private:
951 int cur_index_;
952};
953
954//===========================================================================
955
956class CellIter : public BaseIterator<CellHandle> {
957public:
958 typedef BaseIterator<CellHandle> BaseIter;
959
960
961 CellIter(const TopologyKernel* _mesh, const CellHandle& _ch = CellHandle(0));
962
963 // Post increment/decrement operator
964 CellIter operator++(int) {
965 CellIter cpy = *this;
966 ++(*this);
967 return cpy;
968 }
969 CellIter operator--(int) {
970 CellIter cpy = *this;
971 --(*this);
972 return cpy;
973 }
974 CellIter operator+(int _n) {
975 CellIter cpy = *this;
976 for(int i = 0; i < _n; ++i) {
977 ++cpy;
978 }
979 return cpy;
980 }
981 CellIter operator-(int _n) {
982 CellIter cpy = *this;
983 for(int i = 0; i < _n; ++i) {
984 --cpy;
985 }
986 return cpy;
987 }
988 CellIter& operator+=(int _n) {
989 for(int i = 0; i < _n; ++i) {
990 ++(*this);
991 }
992 return *this;
993 }
994 CellIter& operator-=(int _n) {
995 for(int i = 0; i < _n; ++i) {
996 --(*this);
997 }
998 return *this;
999 }
1000
1001 CellIter& operator++();
1002 CellIter& operator--();
1003
1004private:
1005 int cur_index_;
1006};
1007
1008//===========================================================================
1009
1010class BoundaryFaceIter : public BaseIterator<FaceHandle> {
1011public:
1012 typedef BaseIterator<FaceHandle> BaseIter;
1013
1014
1015 BoundaryFaceIter(const TopologyKernel* _mesh);
1016
1017 // Post increment/decrement operator
1018 BoundaryFaceIter operator++(int) {
1019 BoundaryFaceIter cpy = *this;
1020 ++(*this);
1021 return cpy;
1022 }
1023 BoundaryFaceIter operator--(int) {
1024 BoundaryFaceIter cpy = *this;
1025 --(*this);
1026 return cpy;
1027 }
1028 BoundaryFaceIter operator+(int _n) {
1029 BoundaryFaceIter cpy = *this;
1030 for(int i = 0; i < _n; ++i) {
1031 ++cpy;
1032 }
1033 return cpy;
1034 }
1035 BoundaryFaceIter operator-(int _n) {
1036 BoundaryFaceIter cpy = *this;
1037 for(int i = 0; i < _n; ++i) {
1038 --cpy;
1039 }
1040 return cpy;
1041 }
1042 BoundaryFaceIter& operator+=(int _n) {
1043 for(int i = 0; i < _n; ++i) {
1044 ++(*this);
1045 }
1046 return *this;
1047 }
1048 BoundaryFaceIter& operator-=(int _n) {
1049 for(int i = 0; i < _n; ++i) {
1050 --(*this);
1051 }
1052 return *this;
1053 }
1054
1055 BoundaryFaceIter& operator++();
1056 BoundaryFaceIter& operator--();
1057
1058private:
1059 FaceIter bf_it_;
1060};
1061
1062//===========================================================================
1063
1064} // Namespace OpenVolumeMesh
1065
1066#endif /* ITERATORS_HH_ */
Definition OpenVolumeMeshHandle.hh:101
Definition OpenVolumeMeshHandle.hh:99
Definition OpenVolumeMeshHandle.hh:100
Definition Iterators.hh:848
Definition OpenVolumeMeshHandle.hh:102
Definition OpenVolumeMeshHandle.hh:103
Definition TopologyKernel.hh:57
Definition OpenVolumeMeshHandle.hh:98