Subversion Repositories gelsvn

Rev

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