Subversion Repositories gelsvn

Rev

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