Mercurial > ~dholland > hg > ag > index.cgi
comparison anagram/support/register-imp.h @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:13d2b8934445 |
---|---|
1 /* | |
2 * AnaGram, A System for Syntax Directed Programming | |
3 * Copyright 1993-2002 Parsifal Software. All Rights Reserved. | |
4 * See the file COPYING for license and usage terms. | |
5 * | |
6 * register-imp.h | |
7 */ | |
8 | |
9 #ifndef REGISTER_IMP_H | |
10 #define REGISTER_IMP_H | |
11 | |
12 template <class Descriptor> | |
13 AgStack<Descriptor> ObjectRegister<Descriptor>::descriptorList; | |
14 | |
15 template <class Descriptor> | |
16 ObjectRegister<Descriptor>::ObjectRegister(const Descriptor &d) | |
17 : index(descriptorList.size()) | |
18 { | |
19 descriptorList.push(d); | |
20 descriptor = &descriptorList.top(); | |
21 } | |
22 | |
23 template <class Descriptor> | |
24 ObjectRegister<Descriptor>::ObjectRegister(const ObjectRegister<Descriptor> &d) | |
25 : index(d.index), descriptor(d.descriptor) | |
26 { | |
27 // Nothing to do | |
28 } | |
29 | |
30 template <class Descriptor> | |
31 ObjectRegister<Descriptor>::ObjectRegister() | |
32 : index(0), descriptor(0) | |
33 { | |
34 // Nothing to do | |
35 } | |
36 | |
37 | |
38 template <class Descriptor> | |
39 ObjectRegister<Descriptor>::ObjectRegister(int x) | |
40 : index(x) | |
41 { | |
42 assert((unsigned) x < descriptorList.size()); | |
43 descriptor = &descriptorList[x]; | |
44 } | |
45 | |
46 template <class Descriptor> | |
47 ObjectRegister<Descriptor> & | |
48 ObjectRegister<Descriptor>::operator = (const ObjectRegister<Descriptor> &d) { | |
49 index = d.index; | |
50 descriptor = d.descriptor; | |
51 return *this; | |
52 } | |
53 | |
54 template <class Descriptor> | |
55 ObjectRegister<Descriptor> &ObjectRegister<Descriptor>::operator = (int x) { | |
56 assert((unsigned) x < descriptorList.size()); | |
57 index = x; | |
58 descriptor = &descriptorList[x]; | |
59 return *this; | |
60 } | |
61 | |
62 template <class Descriptor> | |
63 void ObjectRegister<Descriptor>::reset() { | |
64 descriptorList.reset(); | |
65 } | |
66 | |
67 template <class Descriptor> | |
68 int ObjectRegister<Descriptor>::next() { | |
69 if ((unsigned) (index + 1) >= descriptorList.size()) { | |
70 return 0; | |
71 } | |
72 index++; | |
73 descriptor = &descriptorList[index]; | |
74 return 1; | |
75 } | |
76 | |
77 template <class Descriptor> | |
78 unsigned ObjectRegister<Descriptor>::count() { | |
79 return descriptorList.size(); | |
80 } | |
81 | |
82 /* | |
83 template <class Descriptor> | |
84 Descriptor *ObjectRegister<Descriptor>::operator -> () const { | |
85 return descriptor; | |
86 } | |
87 */ | |
88 | |
89 template <class Descriptor> | |
90 int KeyedObjectRegister<Descriptor>::Tree::compare(const int &x, | |
91 const int &y) const { | |
92 //LOGSECTION("KeyedObjectRegister::Tree::compare"); | |
93 unsigned size = KeyedObjectRegister<Descriptor>::descriptorList.size(); | |
94 | |
95 const Descriptor &dx = (unsigned) x < size ? | |
96 KeyedObjectRegister<Descriptor>::descriptorList[x] : | |
97 *KeyedObjectRegister<Descriptor>::testObject; | |
98 const Descriptor &dy = (unsigned) y < size ? | |
99 KeyedObjectRegister<Descriptor>::descriptorList[y] : | |
100 *KeyedObjectRegister<Descriptor>::testObject; | |
101 | |
102 int flag = dx < dy ? -1 : dy < dx; | |
103 //LOGV(x) LCV(y) LCV(flag); | |
104 return flag; | |
105 } | |
106 | |
107 template <class Descriptor> | |
108 KeyedObjectRegister<Descriptor>::KeyedObjectRegister(const Descriptor &d) { | |
109 //LOGSECTION("KeyedObjectRegister::KeyedObjectRegister"); | |
110 testObject = &d; | |
111 | |
112 unsigned size = KeyedObjectRegister<Descriptor>::descriptorList.size(); | |
113 KeyedObjectRegister<Descriptor>::index = size; | |
114 //LOGV(index); | |
115 | |
116 if (tree.identify(KeyedObjectRegister<Descriptor>::index)) { | |
117 KeyedObjectRegister<Descriptor>::descriptor = | |
118 &KeyedObjectRegister<Descriptor>::descriptorList[ | |
119 KeyedObjectRegister<Descriptor>::index | |
120 ]; | |
121 return; | |
122 } | |
123 KeyedObjectRegister<Descriptor>::descriptorList.push(d); | |
124 KeyedObjectRegister<Descriptor>::descriptor = & | |
125 KeyedObjectRegister<Descriptor>::descriptorList.top(); | |
126 } | |
127 | |
128 template <class Descriptor> | |
129 KeyedObjectRegister<Descriptor>::KeyedObjectRegister() | |
130 : ObjectRegister<Descriptor>() | |
131 { | |
132 // Nothing to do | |
133 } | |
134 | |
135 template <class Descriptor> | |
136 KeyedObjectRegister<Descriptor>::KeyedObjectRegister(unsigned x) | |
137 : ObjectRegister<Descriptor>(x) | |
138 { | |
139 // Nothing to do | |
140 } | |
141 | |
142 template <class Descriptor> | |
143 typename KeyedObjectRegister<Descriptor>::Tree | |
144 KeyedObjectRegister<Descriptor>::tree; | |
145 | |
146 template <class Descriptor> | |
147 void KeyedObjectRegister<Descriptor>::reset() { | |
148 tree.reset(); | |
149 KeyedObjectRegister<Descriptor>::descriptorList.reset(); | |
150 } | |
151 | |
152 template <class Descriptor> | |
153 const Descriptor *KeyedObjectRegister<Descriptor>::testObject = 0; | |
154 | |
155 template <class Descriptor> | |
156 Each<Descriptor>::Each(int x) { | |
157 Each<Descriptor>::index = x; | |
158 Each<Descriptor>::descriptor = | |
159 ( (unsigned) Each<Descriptor>::index | |
160 < | |
161 Each<Descriptor>::descriptorList.size() | |
162 ) | |
163 ? &Each<Descriptor>::descriptorList[Each<Descriptor>::index] | |
164 : 0; | |
165 } | |
166 | |
167 template <class Descriptor> | |
168 void Each<Descriptor>::restart(int x) { | |
169 Each<Descriptor>::index = x; | |
170 Each<Descriptor>::descriptor = | |
171 ((unsigned) Each<Descriptor>::index | |
172 < | |
173 Each<Descriptor>::descriptorList.size()) | |
174 ? &Each<Descriptor>::descriptorList[Each<Descriptor>::index] | |
175 : 0; | |
176 } | |
177 | |
178 template <class Descriptor> | |
179 void Each<Descriptor>::getNext() { | |
180 Each<Descriptor>::index++; | |
181 Each<Descriptor>::descriptor = | |
182 ((unsigned) Each<Descriptor>::index | |
183 < | |
184 Each<Descriptor>::descriptorList.size()) | |
185 ? &Each<Descriptor>::descriptorList[Each<Descriptor>::index] | |
186 : 0; | |
187 } | |
188 | |
189 | |
190 #endif /* REGISTER_IMP_H */ |