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 */