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