Subversion Repositories gelsvn

Rev

Rev 595 | Details | Compare with Previous | Last modification | View Log | RSS feed

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