File: RootArray.h

package info (click to toggle)
storm-lang 0.7.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 52,004 kB
  • sloc: ansic: 261,462; cpp: 140,405; sh: 14,891; perl: 9,846; python: 2,525; lisp: 2,504; asm: 860; makefile: 678; pascal: 70; java: 52; xml: 37; awk: 12
file content (84 lines) | stat: -rw-r--r-- 1,243 bytes parent folder | download | duplicates (2)
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;
	};

}