Subversion Repositories gelsvn

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
512 s042372 1
/* ----------------------------------------------------------------------- *
572 jab 2
 * This file is part of GEL, http://www.imm.dtu.dk/GEL
3
 * Copyright (C) the authors and DTU Informatics
512 s042372 4
 *
572 jab 5
 * For license and list of authors, see ../doc/intro.pdf
512 s042372 6
 * ----------------------------------------------------------------------- */
511 s042372 7
 
8
#ifndef __HMESH_ITERATORS_H__
9
#define __HMESH_ITERATORS_H__
10
 
11
#include "ConnectivityKernel.h"
12
 
13
namespace HMesh
14
{
518 s042372 15
    template<typename ID>
16
    class IDIterator
512 s042372 17
    {
18
    public:
520 s042372 19
        // typedefs to accommodiate stl compliance
515 s042372 20
        typedef std::bidirectional_iterator_tag iterator_category;
21
        typedef ptrdiff_t difference_type;
520 s042372 22
        typedef ID value_type;
518 s042372 23
        typedef value_type reference;
515 s042372 24
        typedef value_type* pointer;
520 s042372 25
 
512 s042372 26
        /// constructor (default: skipping enabled)
518 s042372 27
        IDIterator(const ConnectivityKernel& _ck, ID _id, bool _skip = true);
511 s042372 28
 
512 s042372 29
        /// prefix increment 
518 s042372 30
        IDIterator& operator ++();		
512 s042372 31
        /// postfix increment
518 s042372 32
        IDIterator& operator ++(int);
512 s042372 33
        /// prefix decrement
518 s042372 34
        IDIterator& operator --();
512 s042372 35
        /// postfix decrement
518 s042372 36
        IDIterator& operator --(int);
511 s042372 37
 
512 s042372 38
        /// equal to
518 s042372 39
        bool operator ==(const IDIterator& other) const;
512 s042372 40
        /// not equal to
518 s042372 41
        bool operator !=(const IDIterator& other) const;
511 s042372 42
 
512 s042372 43
        /// indirection
518 s042372 44
        reference operator *();
512 s042372 45
        /// member by pointer
518 s042372 46
        pointer operator ->();
512 s042372 47
        /// cast
48
        //operator VertexID() const;
511 s042372 49
 
512 s042372 50
    private:
51
        const ConnectivityKernel* ck;
518 s042372 52
        ID id;
512 s042372 53
        bool skip;
54
    };
511 s042372 55
 
518 s042372 56
     /*---------
57
     * Typedefs
58
     *----------*/
59
    typedef IDIterator<VertexID> VertexIDIterator;
60
    typedef IDIterator<FaceID> FaceIDIterator;
61
    typedef IDIterator<HalfEdgeID> HalfEdgeIDIterator;
515 s042372 62
 
63
 
518 s042372 64
    /*-----------------------------------------
65
     * IDIterator template implementation
66
     *-----------------------------------------*/
511 s042372 67
 
518 s042372 68
    template<typename ID>
69
    inline IDIterator<ID>::IDIterator(const ConnectivityKernel& _ck, ID _id, bool _skip) 
70
        : ck(&_ck), id(_id), skip(_skip){}
511 s042372 71
 
518 s042372 72
    template<typename ID>
73
    inline IDIterator<ID>& IDIterator<ID>::operator ++(int)
74
    { return ++(*this); }
511 s042372 75
 
518 s042372 76
    template<typename ID>
77
    inline IDIterator<ID>& IDIterator<ID>::operator --(int)
78
    { return --(*this); }
511 s042372 79
 
518 s042372 80
    template<typename ID>
81
    inline bool IDIterator<ID>::operator ==(const IDIterator<ID>& other) const
82
    { return ck == other.ck && id == other.id; }
511 s042372 83
 
518 s042372 84
    template<typename ID>
85
    inline bool IDIterator<ID>::operator !=(const IDIterator<ID>& other) const
86
    { return ck != other.ck || id != other.id; }
511 s042372 87
 
518 s042372 88
    template<typename ID>
89
    inline ID IDIterator<ID>::operator *()
90
    { return id; }
511 s042372 91
 
518 s042372 92
    template<typename ID>
93
    inline ID* IDIterator<ID>::operator ->()
94
    { return &id; }
515 s042372 95
 
518 s042372 96
     /*-----------------------------
97
     * Specializations for vertices
98
     *------------------------------*/
99
    template<>
100
    inline IDIterator<VertexID>& IDIterator<VertexID>::operator ++()
512 s042372 101
    {
102
        id = ck->vertices_next(id, skip);
103
        return *this;
104
    }
518 s042372 105
    template<>
106
    inline IDIterator<VertexID>& IDIterator<VertexID>::operator --()
512 s042372 107
    {
108
        id = ck->vertices_prev(id, skip);
109
        return *this;
110
    }
511 s042372 111
 
518 s042372 112
     /*-----------------------------
113
     * Specializations for faces
114
     *------------------------------*/
115
    template<>
116
    inline IDIterator<FaceID>& IDIterator<FaceID>::operator ++()
512 s042372 117
    {
118
        id = ck->faces_next(id, skip);
119
        return *this;
120
    }
511 s042372 121
 
518 s042372 122
    template<>
123
    inline IDIterator<FaceID>& IDIterator<FaceID>::operator --()
512 s042372 124
    {
125
        id = ck->faces_prev(id, skip);
126
        return *this;
127
    }
511 s042372 128
 
518 s042372 129
     /*-----------------------------
130
     * Specializations for halfedges
131
     *------------------------------*/
132
    template<>
133
    inline IDIterator<HalfEdgeID>& IDIterator<HalfEdgeID>::operator ++()
512 s042372 134
    {
135
        id = ck->halfedges_next(id, skip);
136
        return *this;
137
    }
511 s042372 138
 
518 s042372 139
    template<>
140
    inline IDIterator<HalfEdgeID>& IDIterator<HalfEdgeID>::operator --()
512 s042372 141
    {
142
        id = ck->halfedges_prev(id, skip);
143
        return *this;
144
    }
511 s042372 145
}
146
 
147
#endif