annotate dmdscript_tango/property.d @ 4:6d905019f7bf

some changes
author saaadel
date Thu, 28 Jan 2010 21:23:27 +0200
parents 8363a4bf6a8f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2 /* Digital Mars DMDScript source code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
3 * Copyright (c) 2000-2002 by Chromium Communications
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
4 * D version Copyright (c) 2004-2006 by Digital Mars
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
5 * All Rights Reserved
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
6 * written by Walter Bright
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
7 * www.digitalmars.com
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
8 * Use at your own risk. There is no warranty, express or implied.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
9 * License for redistribution is by the GNU General Public License in gpl.txt.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
10 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
11 * A binary, non-exclusive license for commercial use can be
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
12 * purchased from www.digitalmars.com/dscript/buy.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
13 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
14 * DMDScript is implemented in the D Programming Language,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
15 * www.digitalmars.com/d/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
16 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
17 * For a C++ implementation of DMDScript, including COM support,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
18 * see www.digitalmars.com/dscript/cppscript.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
19 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
20
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
21
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
22 module dmdscript_tango.property;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
24 import dmdscript_tango.script;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
25 import dmdscript_tango.value;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
26 import dmdscript_tango.identifier;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
27
4
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
28 //import std.c.string;
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
29 import tango.stdc.string;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 // attribute flags
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32 enum
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
33 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
34 ReadOnly = 0x001,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
35 DontEnum = 0x002,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36 DontDelete = 0x004,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 Internal = 0x008,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38 Deleted = 0x010,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 Locked = 0x020,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40 DontOverride = 0x040,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 KeyWord = 0x080,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42 DebugFree = 0x100, // for debugging help
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 Instantiate = 0x200, // For COM named item namespace support
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46 struct Property
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48 uint attributes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 Value value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 extern (C)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 /* These functions are part of the internal implementation of Phobos
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 * associative arrays. It's faster to use them when we have precomputed
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 * values to use.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 struct Array
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 int length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 void* ptr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 struct aaA
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 aaA *left;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69 aaA *right;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 hash_t hash;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 /* key */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 /* value */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 struct BB
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 aaA*[] b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 size_t nodes; // total number of aaA nodes
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 struct AA
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 BB* a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 version (X86_64)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 // This is here only to retain binary compatibility with the
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 // old way we did AA's. Should eventually be removed.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 int reserved;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 long _aaRehash(AA* paa, TypeInfo keyti);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 /************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 * Alternate Get() version
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 Property* _aaGetY(hash_t hash, Property[Value]* bb, Value* key)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 aaA* e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 auto aa = cast(AA*)bb;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 if (!aa.a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 aa.a = new BB();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 auto aalen = aa.a.b.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 if (!aalen)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 alias aaA *pa;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114 aalen = 97;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115 aa.a.b = new pa[aalen];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 //printf("hash = %d\n", hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119 size_t i = hash % aalen;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 auto pe = &aa.a.b[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 while ((e = *pe) != null)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 if (hash == e.hash)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 Value* v = cast(Value*)(e + 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 if (key.vtype == V_NUMBER)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 { if (v.vtype == V_NUMBER && key.number == v.number)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 else if (key.vtype == V_STRING)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 { if (v.vtype == V_STRING && key.string is v.string)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 auto c = key.opCmp(v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 if (c == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 pe = (c < 0) ? &e.left : &e.right;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 pe = (hash < e.hash) ? &e.left : &e.right;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 // Not found, create new elem
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 //printf("\tcreate new one\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 e = cast(aaA *) cast(void*) new void[aaA.sizeof + Value.sizeof + Property.sizeof];
4
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
146 tango.stdc.string.memcpy(e + 1, key, Value.sizeof);
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
147 //std.c.string.memcpy(e + 1, key, Value.sizeof);
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 e.hash = hash;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 *pe = e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 auto nodes = ++aa.a.nodes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 //printf("length = %d, nodes = %d\n", (*aa).length, nodes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 if (nodes > aalen * 4)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 _aaRehash(aa, typeid(Value));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 Lret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 return cast(Property*)(cast(void *)(e + 1) + Value.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 /************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 * Alternate In() with precomputed values.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 Property* _aaInY(hash_t hash, Property[Value] bb, Value* key)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 size_t i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 AA aa = *cast(AA*)&bb;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 //printf("_aaIn(), aa.length = %d, .ptr = %x\n", aa.length, cast(uint)aa.ptr);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 if (aa.a && aa.a.b.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 //printf("hash = %d\n", hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 i = hash % aa.a.b.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 auto e = aa.a.b[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 while (e != null)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 if (hash == e.hash)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 Value* v = cast(Value*)(e + 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 if (key.vtype == V_NUMBER && v.vtype == V_NUMBER &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 key.number == v.number)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184 goto Lfound;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 auto c = key.opCmp(v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 if (c == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 Lfound:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 return cast(Property*)(cast(void *)(e + 1) + Value.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 e = (c < 0) ? e.left : e.right;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 e = (hash < e.hash) ? e.left : e.right;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 // Not found
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 /*********************************** PropTable *********************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 struct PropTable
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208 Property[Value] table;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209 PropTable* previous;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 int opApply(int delegate(inout Property) dg)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 { int result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214 foreach (inout Property p; table)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 result = dg(p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 if (result)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220 return result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223 int opApply(int delegate(inout Value, inout Property) dg)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224 { int result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 foreach (Value key, inout Property p; table)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228 result = dg(key, p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229 if (result)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 return result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235 /*******************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 * Look up name and get its corresponding Property.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 * Return null if not found.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 Property *getProperty(d_string name)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 Property *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245 v = get(name, Value.calcHash(name));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249 // Work backwards from &p->value to p
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 p = cast(Property *)(cast(char *)v - uint.sizeof /*Property.value.offsetof*/);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 return p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 Value* get(Value* key, hash_t hash)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 Property *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 PropTable *t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 //writefln("get(key = '%s', hash = x%x)", key.toString(), hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 assert(key.toHash() == hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 t = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 do
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 //writefln("\tt = %x", cast(uint)t);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267 // p = *key in t.table;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 p = _aaInY(hash, t.table, key);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270 if (p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 { //writefln("\tfound");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272 //p.value.dump();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273 assert(&t.table[*key] == p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274 //p.value.dump();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275 return &p.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
277 t = t.previous;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
278 } while (t);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279 //writefln("\tnot found");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280 return null; // not found
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283 Value* get(d_uint32 index)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285 //writefln("get(index = %d)", index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
286 Value key;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
287
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
288 key.putVnumber(index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
289 return get(&key, Value.calcHash(index));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 Value* get(Identifier* id)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294 //writefln("get('%s', hash = x%x)", name, hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295 return get(&id.value, id.value.hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296 //return get(id.value.string, id.value.hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299 Value* get(d_string name, hash_t hash)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301 //writefln("get('%s', hash = x%x)", name, hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302 Value key;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304 key.putVstring(name);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305 return get(&key, hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
308 /*******************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
309 * Determine if property exists for this object.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
310 * The enumerable flag means the DontEnum attribute cannot be set.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
311 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
312
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313 int hasownproperty(Value* key, int enumerable)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315 Property* p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317 p = *key in table;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318 return p && (!enumerable || !(p.attributes & DontEnum));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
320
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
321 int hasproperty(Value* key)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
322 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
323 return (*key in table) != null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
324 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
325
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
326 int hasproperty(d_string name)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
327 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
328 Value v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
329
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
330 v.putVstring(name);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
331 return hasproperty(&v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
332 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
333
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
334 Value* put(Value* key, hash_t hash, Value* value, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
335 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
336 Property* p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
337
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
338 //writefln("put(key = %s, hash = x%x, value = %s, attributes = x%x)", key.toString(), hash, value.toString(), attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
339 //writefln("put(key = %s)", key.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
340 // p = &table[*key];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
341 p = _aaGetY(hash, &table, key);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
342 /+
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
343 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
344 size_t i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
345 aaA *e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
346 aaA **pe;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
347 aaA*[]* aa = cast(aaA*[]*)&table;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
348 size_t aalen;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
349
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
350 aalen = (*aa).length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
351 if (!aalen)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
352 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
353 alias aaA *pa;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
354
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
355 aalen = 97 + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
356 *aa = new pa[aalen];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
357 (*aa)[0] = cast(aaA *) cast(void*) new void[aaA.sizeof];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
358 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
359
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
360 //printf("hash = %d\n", hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
361 i = (hash % (aalen - 1)) + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
362 pe = &(*aa)[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
363 while ((e = *pe) != null)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
364 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
365 if (hash == e.hash)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
366 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
367 Value* v = cast(Value*)(e + 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
368 if (key.vtype == V_NUMBER)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
369 { if (v.vtype == V_NUMBER && key.number == v.number)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
370 goto Lfound;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
371 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
372 else if (key.vtype == V_STRING)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
373 { if (v.vtype == V_STRING && key.string is v.string)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
374 goto Lfound;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
375 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
376 auto c = key.opCmp(v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
377 if (c == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
378 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
379 Lfound:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
380 p = cast(Property*)(v + 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
381 goto Lx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
382 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
383 pe = (c < 0) ? &e.left : &e.right;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
384 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
385 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
386 pe = (hash < e.hash) ? &e.left : &e.right;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
387 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
388
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
389 // Not found, create new elem
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
390 //printf("\tcreate new one\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
391 e = cast(aaA *) cast(void*) new void[aaA.sizeof + Value.sizeof + Property.sizeof];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
392 memcpy(e + 1, key, Value.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
393 e.hash = hash;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
394 *pe = e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
395
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
396 uint nodes = ++(*aa)[0].nodes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
397 //printf("length = %d, nodes = %d\n", (*aa).length, nodes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
398 if (nodes > aalen * 4)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
399 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
400 _aaRehash(aa, typeid(Value));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
401 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
402
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
403 p = cast(Property*)(cast(void *)(e + 1) + Value.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
404 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
405 +/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
406 if (p.value.vtype != V_NONE)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
407 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
408 Lx:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
409 if (attributes & DontOverride ||
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
410 p.attributes & ReadOnly)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
411 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
412 if (p.attributes & KeyWord)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
413 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
414 return &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
415 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
416
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
417 PropTable* t = previous;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
418 if (t)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
419 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
420 do
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
421 { Property* q;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
422 // q = *key in t.table;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
423 q = _aaInY(hash, t.table, key);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
424 if (q)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
425 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
426 if (q.attributes & ReadOnly)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
427 { p.attributes |= ReadOnly;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
428 return &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
429 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
430 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
431 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
432 t = t.previous;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
433 } while (t);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
434 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
435
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
436 // Overwrite property with new value
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
437 Value.copy(&p.value, value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
438 p.attributes = (attributes & ~DontOverride) | (p.attributes & (DontDelete | DontEnum));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
439 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
440 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
441
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
442 // Not in table; create new entry
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
443
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
444 p.attributes = attributes & ~DontOverride;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
445 Value.copy(&p.value, value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
446 assert(p.value == value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
447
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
448 return null; // success
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
449 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
450
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
451 Value* put(d_string name, Value* value, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
452 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
453 Value key;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
454
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
455 key.putVstring(name);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
456
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
457 //writef("PropTable::put(%p, '%ls', hash = x%x)\n", this, d_string_ptr(name), key.toHash());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
458 return put(&key, Value.calcHash(name), value, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
459 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
460
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
461 Value* put(d_uint32 index, Value* value, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
462 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
463 Value key;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
464
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
465 key.putVnumber(index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
466
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
467 //writef("PropTable::put(%d)\n", index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
468 return put(&key, Value.calcHash(index), value, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
469 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
470
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
471 Value* put(d_uint32 index, d_string string, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
472 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
473 Value key;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
474 Value value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
475
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
476 key.putVnumber(index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
477 value.putVstring(string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
478
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
479 return put(&key, Value.calcHash(index), &value, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
480 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
481
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
482 int canput(Value* key, hash_t hash)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
483 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
484 Property *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
485 PropTable *t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
486
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
487 t = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
488 do
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
489 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
490 // p = *key in t.table;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
491 p = _aaInY(hash, t.table, key);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
492 if (p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
493 { return (p.attributes & ReadOnly)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
494 ? false : true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
495 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
496 t = t.previous;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
497 } while (t);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
498 return true; // success
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
499 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
500
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
501 int canput(d_string name)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
502 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
503 Value v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
504
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
505 v.putVstring(name);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
506
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
507 return canput(&v, v.toHash());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
508 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
509
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
510 int del(Value* key)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
511 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
512 Property *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
513
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
514 //writef("PropTable::del('%ls')\n", d_string_ptr(key.toString()));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
515 p = *key in table;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
516 if (p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
517 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
518 if (p.attributes & DontDelete)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
519 return false;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
520 table.remove(*key);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
521 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
522 return true; // not found
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
523 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
524
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
525 int del(d_string name)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
526 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
527 Value v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
528
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
529 v.putVstring(name);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
530
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
531 //writef("PropTable::del('%ls')\n", d_string_ptr(name));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
532 return del(&v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
533 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
534
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
535 int del(d_uint32 index)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
536 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
537 Value v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
538
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
539 v.putVnumber(index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
540
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
541 //writef("PropTable::del(%d)\n", index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
542 return del(&v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
543 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
544 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
545
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
546