36 unsigned int num()
const {
return static_cast<unsigned int>(_pointers.size());}
38 T*
at(
unsigned int pos)
const {
return (pos<_pointers.size()) ? _pointers[pos] :
nullptr; }
52 void reorder(
const std::vector<unsigned int>& indexOrder);
57 void swap(
unsigned int i,
unsigned int j);
59 std::vector<T*> _pointers;
61 std::vector<int> _positions;
77 _pointers.reserve(
init);
78 _positions.reserve(
init);
108 T*& pi = _pointers[i];
109 T*& pj = _pointers[j];
114 pTemp = _positions[i];
115 _positions[i] = _positions[j];
116 _positions[j] = pTemp;
118 _pointers[i]->setEntryNumber(i);
119 _pointers[j]->setEntryNumber(j);
129 T *t = _objects.append(&pos);
132 unsigned int entryNumber =
static_cast<unsigned int>(_pointers.size());
133 _pointers.push_back(t);
134 _positions.push_back(pos);
135 t->setEntryNumber(entryNumber);
145 if (t ==
nullptr) {
return -1; }
146 const int i = t->getEntryNumber();
148 if (i >= n) {
return -1; }
149 if (i <= -1) {
return -1; }
151 _objects.deleteAt(_positions[i]);
157 at(n - 1)->setEntryNumber(-1);
159 _pointers.pop_back();
160 _positions.pop_back();
170 if (indexOrder.size() == _pointers.size())
172 std::vector<T*> tempPointers;
173 std::vector<int> tempPositions;
174 tempPointers.resize(indexOrder.size());
175 tempPositions.resize(indexOrder.size());
177 for (
size_t i = 0; i < indexOrder.size(); ++i)
179 const unsigned int index = indexOrder.at(i);
180 tempPointers[i] = _pointers.at(index);
181 tempPositions[i] = _positions.at(index);
183 for (
size_t i = 0; i < indexOrder.size(); ++i)
185 _pointers[i] = tempPointers.at(i);
186 _positions[i] = tempPositions.at(i);
187 at(
static_cast<unsigned int>(i))->setEntryNumber(
static_cast<int>(i));
192 WEM_ERROR(
"Vector of re-ordered indices must have the same size as the internal vectors!");
#define WEM_ERROR(msg)
Defines an output routine for error messages.
This template implements a proxy for containers that contain a collection of items normally accessed ...
Dynamic vector, based on a memory pool. Keeps track on entry numbers of stored primitives.
WEMIndexVector(unsigned int init=0, unsigned int bs=8192)
Standard constructor.
WEMIndexVector(WEMIndexVector &&other) noexcept=default
void destroy()
Destroys all elements in this vector.
~WEMIndexVector()
Standard destructor.
unsigned int num() const
Returns the number of elements in this vector.
T * first()
Returns the first element of this vector.
int remove(T *t)
Removes the given element from vector.
const T * first() const
Returns the first element of this vector.
WEMIndexVector & operator=(WEMIndexVector &&other) noexcept=default
T * at(unsigned int pos) const
Returns the element at the given position, typecast from WEMPrimitive to T.
void reorder(const std::vector< unsigned int > &indexOrder)
Sets the order by the given vector of indices.
T * append()
Appends an element to this vector, returns it and updates the index.
IteratorTraits::value_type & at(const ml_iterator_map< IteratorTraits, IDMap > &i, typename property_traits< IDMap >::key_type key)
void init()
Initializes the ML, the runtime type system, the memory manager, fields, static buffers,...
void destroy()
Delete dynamic data structures allocated by init().