Subversion Repositories gelsvn

Rev

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

Rev Author Line No. Line
512 s042372 1
/* ----------------------------------------------------------------------- *
2
 * This file is part of GEL, www.imm.dtu.dk/GEL
3
 * Copyright (C) the authors (see AUTHORS.txt) and DTU Informatics
4
 *
5
 * Principal authors:
6
 *  Christian Thode Larsen (thode2d@gmail.com)
7
 *  J. Andreas Baerentzen (jab@imm.dtu.dk)
8
 *
9
 * See LICENSE.txt for licensing information
10
 * ----------------------------------------------------------------------- */
511 s042372 11
 
12
#ifndef __HMESH_ITEMVECTOR_H__
13
#define __HMESH_ITEMVECTOR_H__
14
 
15
#include <vector>
16
 
17
#include "ItemID.h"
18
 
19
namespace HMesh
20
{
512 s042372 21
    template<typename ITEM>
22
    class ItemVector
23
    {
24
    public:
25
        /// default constructor
26
        ItemVector();
27
        ItemVector(IndexType _size, ITEM i = ITEM()); 
511 s042372 28
 
512 s042372 29
        /// Get a reference to entity i from kernel
30
        ITEM& get(IndexType i);
31
        /// Get a const reference to entity i from kernel
32
        const ITEM& get(IndexType i) const;
511 s042372 33
 
512 s042372 34
        ITEM& operator[](IndexType i);
35
        const ITEM& operator[](IndexType i) const;
511 s042372 36
 
512 s042372 37
        /// Add an entity to the kernel
38
        IndexType add(const ITEM& i);
511 s042372 39
 
512 s042372 40
        /// remove an entity from kernel - entity is NOT erased!
41
        void remove(IndexType i);
511 s042372 42
 
512 s042372 43
        /// erase unused entities from the kernel
44
        void cleanup();
511 s042372 45
 
512 s042372 46
        /// size of vector (default: only active items)
47
        IndexType size(bool active = true) const;
511 s042372 48
 
512 s042372 49
        /// Resize the kernel NOTE: Sets all active flags to true
50
        void resize(IndexType _size, ITEM i = ITEM());
51
        /// Request size change in kernel
52
        void reserve(IndexType i);
511 s042372 53
 
512 s042372 54
        /// Clear the kernel
55
        void clear();
511 s042372 56
 
512 s042372 57
        /// Check if entity i is used
58
        bool in_use(IndexType i) const;
511 s042372 59
 
512 s042372 60
        /// get starting index (default: skip to first active index)
61
        IndexType index_begin(bool skip = true) const;
511 s042372 62
 
512 s042372 63
        /// get ending index
64
        IndexType index_end() const;
511 s042372 65
 
512 s042372 66
        /// get the next index (default: skip to first active index)
67
        IndexType index_next(IndexType index, bool skip = true) const;
511 s042372 68
 
512 s042372 69
        /// get the previous index (default: skip to first active index)
70
        IndexType index_prev(IndexType index, bool skip = true) const;
511 s042372 71
 
512 s042372 72
    private:
511 s042372 73
 
512 s042372 74
        IndexType size_active;
75
        std::vector<ITEM> items;
511 s042372 76
 
512 s042372 77
        /// Memory consideration - objects flagged as unused should be remembered for future use (unless purged)
78
        std::vector<bool> active_items;
79
    };
511 s042372 80
 
512 s042372 81
    template<typename ITEM>
82
    inline ItemVector<ITEM>::ItemVector() : size_active(0) {}
511 s042372 83
 
512 s042372 84
    template<typename ITEM>
513 s042372 85
    inline ItemVector<ITEM>::ItemVector(IndexType _size, ITEM i = ITEM()) : size_active(_size), items(_size, i), active_items(_size, true){}
511 s042372 86
 
512 s042372 87
    template<typename ITEM>
88
    ITEM& ItemVector<ITEM>::get(IndexType i)
89
    {
90
        assert(i < items.size());
91
        return items[i];
92
    }
511 s042372 93
 
512 s042372 94
    template<typename ITEM>
95
    const ITEM& ItemVector<ITEM>::get(IndexType i) const
96
    {
97
        assert(i < items.size());
98
        return items[i];
99
    }
511 s042372 100
 
512 s042372 101
    template<typename ITEM>
102
    ITEM& ItemVector<ITEM>::operator [](IndexType i)
103
    {
104
        assert(i < items.size());
105
        return items[i];
106
    } 
511 s042372 107
 
512 s042372 108
    template<typename ITEM>
109
    const ITEM& ItemVector<ITEM>::operator [](IndexType i) const
110
    {
111
        assert(i < items.size());
112
        return items[i];
113
    }
511 s042372 114
 
512 s042372 115
    template<typename ITEM>
116
    IndexType ItemVector<ITEM>::add(const ITEM& i)
117
    {
118
        items.push_back(i);
119
        active_items.push_back(true);
120
        ++size_active;
121
        return items.size() - 1;
122
    }
511 s042372 123
 
512 s042372 124
    template<typename ITEM>
125
    void ItemVector<ITEM>::remove(IndexType i)
126
    {
513 s042372 127
        if(active_items[i]){ 
512 s042372 128
            --size_active;
513 s042372 129
            active_items[i] = false;
130
        }
512 s042372 131
    }
511 s042372 132
 
512 s042372 133
    template<typename ITEM>
134
    void ItemVector<ITEM>::cleanup()
135
    {
136
        std::vector<ITEM> new_items;
137
        for(IndexType i = 0; i < items.size(); ++i){
138
            if(active_items[i]) 
139
                new_items.push_back(items[i]);          
140
        }
141
        items = new_items;
142
        active_items = std::vector<bool>(items.size(), true);
143
        size_active = items.size();
144
    }
511 s042372 145
 
512 s042372 146
    template<typename ITEM>
147
    IndexType ItemVector<ITEM>::size(bool active = true) const
148
    { return active ? size_active : items.size(); }
511 s042372 149
 
512 s042372 150
    template<typename ITEM>
151
    void ItemVector<ITEM>::resize(IndexType _size, ITEM i = ITEM())
152
    {
153
        items.resize(_size, i);
154
        active_items.resize(_size, true);
155
        size_active = _size;
156
    }
511 s042372 157
 
512 s042372 158
    template<typename ITEM>
159
    void ItemVector<ITEM>::reserve(IndexType i)
160
    {
161
        items.reserve(i);
162
        active_items.reserve(i);
163
    }
511 s042372 164
 
512 s042372 165
    template<typename ITEM>
166
    void ItemVector<ITEM>::clear()
167
    {
168
        items.clear();
169
        active_items.clear();
170
        size_active = 0;
171
    }
511 s042372 172
 
512 s042372 173
    template<typename ITEM>
174
    bool ItemVector<ITEM>::in_use(IndexType i) const
175
    {
176
        assert(i < active_items.size());
177
        return active_items[i];
178
    }
511 s042372 179
 
512 s042372 180
    template<typename ITEM>
181
    IndexType ItemVector<ITEM>::index_begin(bool skip = true) const
182
    {
513 s042372 183
        IndexType i = 0;
184
 
512 s042372 185
        if(!skip)
513 s042372 186
            return i;
187
 
188
        while(i < active_items.size() && !active_items[i])
512 s042372 189
            ++i;
513 s042372 190
 
512 s042372 191
        return i;
192
    }
511 s042372 193
 
512 s042372 194
    template<typename ITEM>
195
    IndexType ItemVector<ITEM>::index_end() const
196
    { return items.size(); }
511 s042372 197
 
512 s042372 198
    template<typename ITEM>
199
    IndexType ItemVector<ITEM>::index_next(IndexType index, bool skip = true) const
200
    {
513 s042372 201
        if(index < items.size())
512 s042372 202
            ++index;
511 s042372 203
 
513 s042372 204
        if(!skip)
205
            return index;
206
 
207
        while(index < items.size() && !active_items[index])
208
           ++index;
209
 
512 s042372 210
        return index;
211
    }
511 s042372 212
 
512 s042372 213
    template<typename ITEM>
214
    IndexType ItemVector<ITEM>::index_prev(IndexType index, bool skip = true) const
215
    {
216
        if(index > 0)
217
            --index;
511 s042372 218
 
513 s042372 219
        if(!skip)
220
            return index;
221
 
222
        while(!active_items[index] && index > 0)
223
            --index;
224
 
512 s042372 225
        return index;
226
    }
511 s042372 227
 
228
}
229
 
230
#endif