annotate dmd/Array.d @ 0:10317f0c89a5

Initial commit
author korDen
date Sat, 24 Oct 2009 08:42:06 +0400
parents
children 7427ded8caf7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.Array;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3 import std.contracts;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import core.stdc.stdlib;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import core.stdc.string;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 class Array
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 uint dim = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 uint allocdim = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 void** data = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 ~this()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 ///mem.free(data);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 free(data);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 void mark()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 ///unsigned u;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 ///mem.mark(data);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 ///for (u = 0; u < dim; u++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 ///mem.mark(data[u]); // BUG: what if arrays of Object's?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 string toString()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 char *p;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 ///char **buf = cast(char**)alloca(dim * (char*).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 scope string[] buf = new string[dim];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 uint len = 2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 for (uint u = 0; u < dim; u++) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 buf[u] = (cast(Object)data[u]).toString();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 len += buf[u].length + 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 char* str = cast(char*)malloc(len);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 str[0] = '[';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 p = str + 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 for (uint u = 0; u < dim; u++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 if (u != 0) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 *p++ = ',';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 uint length = buf[u].length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 p[0..length] = buf[u][];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 p += length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 *p++ = ']';
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 *p = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 return assumeUnique(str[0..len]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 final void reserve(uint nentries)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 //printf("Array::reserve: size = %d, offset = %d, nbytes = %d\n", size, offset, nbytes);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 if (allocdim - dim < nentries) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 allocdim = dim + nentries;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 /// data = (void **)mem.realloc(data, allocdim * sizeof(*data));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 data = cast(void**)realloc(data, allocdim * (*data).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 final void setDim(uint newdim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 if (dim < newdim) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 reserve(newdim - dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 dim = newdim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 final void fixDim()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 if (dim != allocdim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 ///data = (void**)mem.realloc(data, dim * sizeof(*data));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 data = cast(void**)realloc(data, dim * (*data).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 allocdim = dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 final void push(void* ptr)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 reserve(1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 data[dim++] = ptr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 final void* pop()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 return data[--dim];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 final void shift(void* ptr)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 reserve(1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 memmove(data + 1, data, dim * (*data).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 data[0] = ptr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 dim++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 final void insert(uint index, void* ptr)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 reserve(1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 memmove(data + index + 1, data + index, (dim - index) * (*data).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 data[index] = ptr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 dim++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 final void insert(uint index, Array a)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 if (a !is null) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 uint d = a.dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 reserve(d);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 if (dim != index) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 memmove(data + index + d, data + index, (dim - index) * (*data).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 memcpy(data + index, a.data, d * (*data).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 dim += d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 /***********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 * Append array a to this array.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 final void append(Array a)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 insert(dim, a);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 final void remove(uint i)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 memmove(data + i, data + i + 1, (dim - i) * (*data).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 dim--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 final void zero()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 memset(data, 0, dim * (*data).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 final void* tos()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 return dim ? data[dim - 1] : null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 private static extern (C) int Array_sort_compare(const(void*) x, const(void*) y)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 Object ox = *cast(Object *)x;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 Object oy = *cast(Object *)y;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 return ox.opCmp(oy);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 final void sort()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 if (dim) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 qsort(cast(void*)data, dim, Object.sizeof, &Array_sort_compare);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 final Array copyTo(Array a)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 a.setDim(dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 memcpy(a.data, data, dim * (*data).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 return a;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 final Array copy()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 return copyTo(new Array());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 }