1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
#pragma once
#include "Gc/Gc.h"
namespace storm {
/**
* An array that makes sure to register its contents as a root with the GC.
*/
template <class T, bool ambiguous = false>
class RootArray : NoCopy {
public:
// Create.
RootArray(Gc &gc) : gc(gc), root(null), size(0), data(null) {}
// Destroy.
~RootArray() {
clear();
}
// Clear.
void clear() {
Gc::destroyRoot(root);
root = null;
delete []data;
data = null;
size = 0;
}
// Resize.
void resize(nat nSize) {
if (nSize == 0) {
clear();
return;
}
if (nSize == size)
return;
T **nData = new T*[nSize];
memset(nData, 0, sizeof(T*)*nSize);
Gc::Root *nRoot = gc.createRoot(nData, nSize, ambiguous);
if (data) {
for (nat i = 0; i < min(nSize, size); i++)
nData[i] = data[i];
gc.destroyRoot(root);
delete []data;
}
data = nData;
size = nSize;
root = nRoot;
}
// Access element.
T *&operator [](nat id) {
return data[id];
}
T *operator [](nat id) const {
return data[id];
}
// Count.
nat count() const {
return size;
}
private:
// Gc used.
Gc &gc;
// Current root.
Gc::Root *root;
// Array size.
nat size;
// Data.
T **data;
};
}
|