Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/tests/cdt/tsearch.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1999-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#include "dttest.h"
21
22
Dtdisc_t Disc =
23
{ 0, sizeof(long), -1,
24
newint, NIL(Dtfree_f), compare, hashint,
25
NIL(Dtmemory_f), NIL(Dtevent_f)
26
};
27
28
Dtdisc_t Rdisc =
29
{ 0, sizeof(long), -1,
30
newint, NIL(Dtfree_f), rcompare, hashint,
31
NIL(Dtmemory_f), NIL(Dtevent_f)
32
};
33
34
tmain()
35
{
36
Dt_t* dt;
37
Dtlink_t* link;
38
long i, k, count[1000];
39
40
/* testing Dtoset */
41
dt = dtopen(&Disc,Dtoset);
42
if((long)dtinsert(dt,7L) != 7)
43
terror("Insert 7");
44
if((long)dtinsert(dt,1L) != 1)
45
terror("Insert 1");
46
if((long)dtinsert(dt,3L) != 3)
47
terror("Insert 3");
48
if((long)dtinsert(dt,4L) != 4)
49
terror("Insert 4");
50
if((long)dtinsert(dt,2L) != 2)
51
terror("Insert 2");
52
if((long)dtinsert(dt,6L) != 6)
53
terror("Insert 6");
54
if((long)dtinsert(dt,7L) != 7)
55
terror("Insert 7,2");
56
57
if((long)dtatmost(dt, 5L) != 4)
58
terror("Should have found 4");
59
if((long)dtatleast(dt, 5L) != 6)
60
terror("Should have found 6");
61
62
if((long)dtinsert(dt,5L) != 5)
63
terror("Insert 5");
64
65
if((long)dtatmost(dt, 5L) != 5)
66
terror("Should have found 5");
67
if((long)dtatleast(dt, 3L) != 3)
68
terror("Should have found 3");
69
70
for(i = 1; i <= 7; ++i)
71
if((long)dtsearch(dt,i) != i)
72
terror("Dtoset search");
73
for(link = dtflatten(dt), i = 1; link; link = dtlink(dt,link), i += 1)
74
if((long)dtobj(dt,link) != i)
75
terror("Dtoset flatten");
76
for(i = (long)dtlast(dt), k = 7; k >= 1; i = (long)dtprev(dt,i), k -= 1)
77
if(i != k)
78
terror("Dtoset backwalk");
79
80
/* reverse ordering */
81
dtdisc(dt,&Rdisc,0);
82
for(i = 7; i >= 1; --i)
83
if((long)dtsearch(dt,i) != i)
84
terror("Dtoset search 2");
85
for(i = (long)dtlast(dt), k = 1; k <= 7; i = (long)dtprev(dt,i), k += 1)
86
if(i != k)
87
terror("Dtoset backwalk 2");
88
for(link = dtflatten(dt), i = 7; link; link = dtlink(dt,link), i -= 1)
89
if((long)dtobj(dt,link) != i)
90
terror("Dtoset flatten 2");
91
92
if(!(link = dtextract(dt)) )
93
terror("Fail extracting Dtoset");
94
if(!dtrestore(dt,link) )
95
terror("Fail restoring Dtoset");
96
if(dtsize(dt) != 7)
97
terror("Dtoset size after extract");
98
for(link = dtflatten(dt), i = 7; link; link = dtlink(dt,link), i -= 1)
99
if((long)dtobj(dt,link) != i)
100
terror("Dtoset flatten after extract");
101
102
/* change to hashing */
103
dtmethod(dt,Dtset);
104
for(i = 1; i <= 7; ++i)
105
if((long)dtsearch(dt,i) != i)
106
terror("Dtset search");
107
for(i = 0, link = dtflatten(dt); link; link = dtlink(dt,link))
108
i += 1;
109
if(i != 7)
110
terror("Dtset flatten");
111
for(k = 0, i = (long)dtlast(dt); i != 0; i = (long)dtprev(dt,i))
112
k += 1;
113
if(k != 7)
114
terror("Dtset flatten 2");
115
116
if(!(link = dtextract(dt)) )
117
terror("Fail extracting Dtset");
118
if(!dtrestore(dt,link) )
119
terror("Fail restoring Dtset");
120
if(dtsize(dt) != 7)
121
terror("Dtset size after extract");
122
for(i = (long)dtlast(dt), k = 0; i != 0; i = (long)dtprev(dt,i))
123
k += 1;
124
if(k != 7)
125
terror("Dtset flatten after extract");
126
127
dtdisc(dt,&Disc,0);
128
for(i = 1; i <= 7; ++i)
129
if((long)dtsearch(dt,i) != i)
130
terror("Dtset search 2");
131
for(link = dtflatten(dt), i = 0; link; link = dtlink(dt,link))
132
i += 1;
133
if(i != 7)
134
terror("Dtset flatten 2");
135
136
dtclear(dt);
137
if(dtsize(dt) != 0)
138
terror("Dtsize");
139
140
/* testing Dtlist */
141
dtmethod(dt,Dtlist);
142
if((long)dtinsert(dt,1) != 1)
143
terror("Dtlist insert 1.1");
144
if((long)dtinsert(dt,3) != 3)
145
terror("Dtlist insert 3.1");
146
if((long)dtinsert(dt,2) != 2)
147
terror("Dtlist insert 2.1");
148
if((long)dtinsert(dt,3) != 3)
149
terror("Dtlist insert 3.2");
150
if((long)dtinsert(dt,2) != 2)
151
terror("Dtlist insert 2.2");
152
if((long)dtinsert(dt,3) != 3)
153
terror("Dtlist insert 3.3");
154
if((long)dtinsert(dt,1) != 1)
155
terror("Dtlist insert 1.2");
156
157
/* check multiplicities */
158
for(i = 1; i <= 3; ++i)
159
count[i] = 0;
160
for(i = (long)dtlast(dt); i != 0; i = (long)dtprev(dt,i))
161
count[i] += 1;
162
if(count[1] != 2)
163
terror("Dtlist count 1");
164
if(count[2] != 2)
165
terror("Dtlist count 2");
166
if(count[3] != 3)
167
terror("Dtlist count 3");
168
169
dtclear(dt);
170
if(dtsize(dt) != 0)
171
terror("Dtsize");
172
173
/* testing Dtbag */
174
dtmethod(dt,Dtbag);
175
if((long)dtinsert(dt,1) != 1)
176
terror("Dtlist insert 1.1");
177
if((long)dtinsert(dt,3) != 3)
178
terror("Dtlist insert 3.1");
179
if((long)dtinsert(dt,2) != 2)
180
terror("Dtlist insert 2.1");
181
if((long)dtinsert(dt,3) != 3)
182
terror("Dtlist insert 3.2");
183
if((long)dtinsert(dt,2) != 2)
184
terror("Dtlist insert 2.2");
185
if((long)dtinsert(dt,3) != 3)
186
terror("Dtlist insert 3.3");
187
if((long)dtinsert(dt,1) != 1)
188
terror("Dtlist insert 1.2");
189
190
/* check multiplicities */
191
for(i = 1; i <= 3; ++i)
192
count[i] = 0;
193
for(i = (long)dtlast(dt); i != 0; i = (long)dtprev(dt,i))
194
count[i] += 1;
195
if(count[1] != 2)
196
terror("Dtbag count 1");
197
if(count[2] != 2)
198
terror("Dtbag count 2");
199
if(count[3] != 3)
200
terror("Dtbag count 3");
201
202
/* change method to Dtobag */
203
dtmethod(dt,Dtobag);
204
205
/* check multiplicities */
206
for(i = 1; i <= 3; ++i)
207
count[i] = 0;
208
for(i = (long)dtfirst(dt); i != 0; i = (long)dtnext(dt,i))
209
count[i] += 1;
210
if(count[1] != 2)
211
terror("Dtobag count 1");
212
if(count[2] != 2)
213
terror("Dtobag count 2");
214
if(count[3] != 3)
215
terror("Dtobag count 3");
216
217
/* test consecutive 1's */
218
if((long)dtatmost(dt,1) != 1)
219
terror("Dtobag search 1");
220
if((long)dtnext(dt,1) != 1)
221
terror("Dtobag next 1");
222
if((long)dtnext(dt,1) != 2)
223
terror("Dtobag next should be 2");
224
225
/* test consecutive 2's */
226
if((long)dtatmost(dt,2) != 2)
227
terror("Dtobag search 2");
228
if((long)dtnext(dt,2) != 2)
229
terror("Dtobag next 2");
230
if((long)dtnext(dt,2) != 3)
231
terror("Dtobag next should be 3");
232
233
/* test consecutive 3's */
234
if((long)dtatleast(dt,3) != 3)
235
terror("Dtobag search 3");
236
if((long)dtprev(dt,3) != 3)
237
terror("Dtobag prev 3");
238
if((long)dtprev(dt,3) != 3)
239
terror("Dtobag prev 3.2");
240
if((long)dtprev(dt,3) == 3)
241
terror("Dtobag prev not expecting 3");
242
243
/* test large set of values */
244
dtclear(dt);
245
dtmethod(dt,Dtset);
246
for(i = 1; i < 20000; ++i)
247
if((long)dtinsert(dt,i) != i)
248
terror("Can't insert");
249
dtmethod(dt,Dtoset);
250
for(i = 1, k = (long)dtfirst(dt); i < 20000; ++i, k = (long)dtnext(dt,k))
251
if(i != k)
252
terror("Bad value");
253
254
/* test walking Dtrhset */
255
dtclear(dt);
256
dtmethod(dt, Dtrhset);
257
for(i = 1; i < 100; ++i)
258
if((long)dtinsert(dt,i) != i)
259
terror("Can't insert");
260
for(i = 1; i < 100; ++i)
261
if((long)dtsearch(dt,i) != i)
262
terror("Can't find %d", i);
263
264
memset(count, 0, sizeof(count));
265
for(i = 0, k = (long)dtfirst(dt); k != 0; i += 1, k = (long)dtnext(dt,k))
266
count[k] += 1;
267
for(i = 1; i < 100; ++i)
268
if(count[i] != 1)
269
terror("wrong count[%d]=%d", i, count[i]);
270
271
texit(0);
272
}
273
274