xref: /aosp_15_r20/external/marisa-trie/tests/vector-test.cc (revision ab8db090fce404b23716c4c9194221ee27efe31c)
1*ab8db090SAndroid Build Coastguard Worker #include <cstdlib>
2*ab8db090SAndroid Build Coastguard Worker #include <ctime>
3*ab8db090SAndroid Build Coastguard Worker #include <sstream>
4*ab8db090SAndroid Build Coastguard Worker #include <string>
5*ab8db090SAndroid Build Coastguard Worker #include <vector>
6*ab8db090SAndroid Build Coastguard Worker 
7*ab8db090SAndroid Build Coastguard Worker #include <marisa/grimoire/vector/pop-count.h>
8*ab8db090SAndroid Build Coastguard Worker #include <marisa/grimoire/vector/rank-index.h>
9*ab8db090SAndroid Build Coastguard Worker #include <marisa/grimoire/vector.h>
10*ab8db090SAndroid Build Coastguard Worker 
11*ab8db090SAndroid Build Coastguard Worker #include "marisa-assert.h"
12*ab8db090SAndroid Build Coastguard Worker 
13*ab8db090SAndroid Build Coastguard Worker namespace {
14*ab8db090SAndroid Build Coastguard Worker 
15*ab8db090SAndroid Build Coastguard Worker #if MARISA_WORD_SIZE == 64
TestPopCount()16*ab8db090SAndroid Build Coastguard Worker void TestPopCount() {
17*ab8db090SAndroid Build Coastguard Worker   TEST_START();
18*ab8db090SAndroid Build Coastguard Worker 
19*ab8db090SAndroid Build Coastguard Worker   {
20*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::vector::PopCount count(0);
21*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo8() == 0);
22*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo16() == 0);
23*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo24() == 0);
24*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo32() == 0);
25*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo40() == 0);
26*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo48() == 0);
27*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo56() == 0);
28*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo64() == 0);
29*ab8db090SAndroid Build Coastguard Worker   }
30*ab8db090SAndroid Build Coastguard Worker 
31*ab8db090SAndroid Build Coastguard Worker   {
32*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::vector::PopCount count(0xFFFFFFFFFFFFFFFFULL);
33*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo8() == 8);
34*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo16() == 16);
35*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo24() == 24);
36*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo32() == 32);
37*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo40() == 40);
38*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo48() == 48);
39*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo56() == 56);
40*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo64() == 64);
41*ab8db090SAndroid Build Coastguard Worker   }
42*ab8db090SAndroid Build Coastguard Worker 
43*ab8db090SAndroid Build Coastguard Worker   {
44*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::vector::PopCount count(0xFF7F3F1F0F070301ULL);
45*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo8() == 1);
46*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo16() == 3);
47*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo24() == 6);
48*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo32() == 10);
49*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo40() == 15);
50*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo48() == 21);
51*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo56() == 28);
52*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo64() == 36);
53*ab8db090SAndroid Build Coastguard Worker   }
54*ab8db090SAndroid Build Coastguard Worker 
55*ab8db090SAndroid Build Coastguard Worker   TEST_END();
56*ab8db090SAndroid Build Coastguard Worker }
57*ab8db090SAndroid Build Coastguard Worker #else  // MARISA_WORD_SIZE == 64
58*ab8db090SAndroid Build Coastguard Worker void TestPopCount() {
59*ab8db090SAndroid Build Coastguard Worker   TEST_START();
60*ab8db090SAndroid Build Coastguard Worker 
61*ab8db090SAndroid Build Coastguard Worker   {
62*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::vector::PopCount count(0);
63*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo8() == 0);
64*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo16() == 0);
65*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo24() == 0);
66*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo32() == 0);
67*ab8db090SAndroid Build Coastguard Worker   }
68*ab8db090SAndroid Build Coastguard Worker 
69*ab8db090SAndroid Build Coastguard Worker   {
70*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::vector::PopCount count(0xFFFFFFFFU);
71*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo8() == 8);
72*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo16() == 16);
73*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo24() == 24);
74*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo32() == 32);
75*ab8db090SAndroid Build Coastguard Worker   }
76*ab8db090SAndroid Build Coastguard Worker 
77*ab8db090SAndroid Build Coastguard Worker   {
78*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::vector::PopCount count(0xFF3F0F03U);
79*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo8() == 2);
80*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo16() == 6);
81*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo24() == 12);
82*ab8db090SAndroid Build Coastguard Worker     ASSERT(count.lo32() == 20);
83*ab8db090SAndroid Build Coastguard Worker   }
84*ab8db090SAndroid Build Coastguard Worker 
85*ab8db090SAndroid Build Coastguard Worker   TEST_END();
86*ab8db090SAndroid Build Coastguard Worker }
87*ab8db090SAndroid Build Coastguard Worker #endif  // MARISA_WORD_SIZE == 64
88*ab8db090SAndroid Build Coastguard Worker 
TestRankIndex()89*ab8db090SAndroid Build Coastguard Worker void TestRankIndex() {
90*ab8db090SAndroid Build Coastguard Worker   TEST_START();
91*ab8db090SAndroid Build Coastguard Worker 
92*ab8db090SAndroid Build Coastguard Worker   marisa::grimoire::vector::RankIndex rank;
93*ab8db090SAndroid Build Coastguard Worker 
94*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.abs() == 0);
95*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel1() == 0);
96*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel2() == 0);
97*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel3() == 0);
98*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel4() == 0);
99*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel5() == 0);
100*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel6() == 0);
101*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel7() == 0);
102*ab8db090SAndroid Build Coastguard Worker 
103*ab8db090SAndroid Build Coastguard Worker   rank.set_abs(10000);
104*ab8db090SAndroid Build Coastguard Worker   rank.set_rel1(64);
105*ab8db090SAndroid Build Coastguard Worker   rank.set_rel2(128);
106*ab8db090SAndroid Build Coastguard Worker   rank.set_rel3(192);
107*ab8db090SAndroid Build Coastguard Worker   rank.set_rel4(256);
108*ab8db090SAndroid Build Coastguard Worker   rank.set_rel5(320);
109*ab8db090SAndroid Build Coastguard Worker   rank.set_rel6(384);
110*ab8db090SAndroid Build Coastguard Worker   rank.set_rel7(448);
111*ab8db090SAndroid Build Coastguard Worker 
112*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.abs() == 10000);
113*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel1() == 64);
114*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel2() == 128);
115*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel3() == 192);
116*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel4() == 256);
117*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel5() == 320);
118*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel6() == 384);
119*ab8db090SAndroid Build Coastguard Worker   ASSERT(rank.rel7() == 448);
120*ab8db090SAndroid Build Coastguard Worker 
121*ab8db090SAndroid Build Coastguard Worker   TEST_END();
122*ab8db090SAndroid Build Coastguard Worker }
123*ab8db090SAndroid Build Coastguard Worker 
TestVector()124*ab8db090SAndroid Build Coastguard Worker void TestVector() {
125*ab8db090SAndroid Build Coastguard Worker   TEST_START();
126*ab8db090SAndroid Build Coastguard Worker 
127*ab8db090SAndroid Build Coastguard Worker   std::vector<int> values;
128*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < 10000; ++i) {
129*ab8db090SAndroid Build Coastguard Worker     values.push_back(std::rand());
130*ab8db090SAndroid Build Coastguard Worker   }
131*ab8db090SAndroid Build Coastguard Worker 
132*ab8db090SAndroid Build Coastguard Worker   marisa::grimoire::Vector<int> vec;
133*ab8db090SAndroid Build Coastguard Worker 
134*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.max_size() == (MARISA_SIZE_MAX / sizeof(int)));
135*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == 0);
136*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.capacity() == 0);
137*ab8db090SAndroid Build Coastguard Worker   ASSERT(!vec.fixed());
138*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.empty());
139*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.total_size() == 0);
140*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.io_size() == sizeof(marisa::UInt64));
141*ab8db090SAndroid Build Coastguard Worker 
142*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < values.size(); ++i) {
143*ab8db090SAndroid Build Coastguard Worker     vec.push_back(values[i]);
144*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec[i] == values[i]);
145*ab8db090SAndroid Build Coastguard Worker     ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec)[i]
146*ab8db090SAndroid Build Coastguard Worker         == values[i]);
147*ab8db090SAndroid Build Coastguard Worker   }
148*ab8db090SAndroid Build Coastguard Worker 
149*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == values.size());
150*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.capacity() >= vec.size());
151*ab8db090SAndroid Build Coastguard Worker   ASSERT(!vec.empty());
152*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.total_size() == (sizeof(int) * values.size()));
153*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.io_size() == sizeof(marisa::UInt64)
154*ab8db090SAndroid Build Coastguard Worker       + ((sizeof(int) * values.size())));
155*ab8db090SAndroid Build Coastguard Worker 
156*ab8db090SAndroid Build Coastguard Worker   ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec).front()
157*ab8db090SAndroid Build Coastguard Worker       == values.front());
158*ab8db090SAndroid Build Coastguard Worker   ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec).back()
159*ab8db090SAndroid Build Coastguard Worker       == values.back());
160*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.front() == values.front());
161*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.back() == values.back());
162*ab8db090SAndroid Build Coastguard Worker 
163*ab8db090SAndroid Build Coastguard Worker   vec.shrink();
164*ab8db090SAndroid Build Coastguard Worker 
165*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == values.size());
166*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.capacity() == vec.size());
167*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < values.size(); ++i) {
168*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec[i] == values[i]);
169*ab8db090SAndroid Build Coastguard Worker     ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec)[i]
170*ab8db090SAndroid Build Coastguard Worker         == values[i]);
171*ab8db090SAndroid Build Coastguard Worker   }
172*ab8db090SAndroid Build Coastguard Worker 
173*ab8db090SAndroid Build Coastguard Worker   {
174*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::Writer writer;
175*ab8db090SAndroid Build Coastguard Worker     writer.open("vector-test.dat");
176*ab8db090SAndroid Build Coastguard Worker     vec.write(writer);
177*ab8db090SAndroid Build Coastguard Worker   }
178*ab8db090SAndroid Build Coastguard Worker   vec.clear();
179*ab8db090SAndroid Build Coastguard Worker 
180*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.empty());
181*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.capacity() == 0);
182*ab8db090SAndroid Build Coastguard Worker 
183*ab8db090SAndroid Build Coastguard Worker   {
184*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::Mapper mapper;
185*ab8db090SAndroid Build Coastguard Worker     mapper.open("vector-test.dat");
186*ab8db090SAndroid Build Coastguard Worker     vec.map(mapper);
187*ab8db090SAndroid Build Coastguard Worker 
188*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec.size() == values.size());
189*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec.capacity() == 0);
190*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec.fixed());
191*ab8db090SAndroid Build Coastguard Worker     ASSERT(!vec.empty());
192*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec.total_size() == (sizeof(int) * values.size()));
193*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec.io_size() == sizeof(marisa::UInt64)
194*ab8db090SAndroid Build Coastguard Worker         + ((sizeof(int) * values.size())));
195*ab8db090SAndroid Build Coastguard Worker 
196*ab8db090SAndroid Build Coastguard Worker     for (std::size_t i = 0; i < values.size(); ++i) {
197*ab8db090SAndroid Build Coastguard Worker       ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec)[i]
198*ab8db090SAndroid Build Coastguard Worker           == values[i]);
199*ab8db090SAndroid Build Coastguard Worker     }
200*ab8db090SAndroid Build Coastguard Worker 
201*ab8db090SAndroid Build Coastguard Worker     vec.clear();
202*ab8db090SAndroid Build Coastguard Worker   }
203*ab8db090SAndroid Build Coastguard Worker 
204*ab8db090SAndroid Build Coastguard Worker   {
205*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::Reader reader;
206*ab8db090SAndroid Build Coastguard Worker     reader.open("vector-test.dat");
207*ab8db090SAndroid Build Coastguard Worker     vec.read(reader);
208*ab8db090SAndroid Build Coastguard Worker   }
209*ab8db090SAndroid Build Coastguard Worker 
210*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == values.size());
211*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.capacity() == vec.size());
212*ab8db090SAndroid Build Coastguard Worker   ASSERT(!vec.fixed());
213*ab8db090SAndroid Build Coastguard Worker   ASSERT(!vec.empty());
214*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.total_size() == (sizeof(int) * values.size()));
215*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.io_size() == sizeof(marisa::UInt64)
216*ab8db090SAndroid Build Coastguard Worker       + ((sizeof(int) * values.size())));
217*ab8db090SAndroid Build Coastguard Worker 
218*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < values.size(); ++i) {
219*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec[i] == values[i]);
220*ab8db090SAndroid Build Coastguard Worker     ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec)[i]
221*ab8db090SAndroid Build Coastguard Worker         == values[i]);
222*ab8db090SAndroid Build Coastguard Worker   }
223*ab8db090SAndroid Build Coastguard Worker 
224*ab8db090SAndroid Build Coastguard Worker   vec.clear();
225*ab8db090SAndroid Build Coastguard Worker 
226*ab8db090SAndroid Build Coastguard Worker   vec.push_back(0);
227*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.capacity() == 1);
228*ab8db090SAndroid Build Coastguard Worker   vec.push_back(1);
229*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.capacity() == 2);
230*ab8db090SAndroid Build Coastguard Worker   vec.push_back(2);
231*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.capacity() == 4);
232*ab8db090SAndroid Build Coastguard Worker   vec.resize(5);
233*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.capacity() == 8);
234*ab8db090SAndroid Build Coastguard Worker   vec.resize(100);
235*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.capacity() == 100);
236*ab8db090SAndroid Build Coastguard Worker 
237*ab8db090SAndroid Build Coastguard Worker   EXCEPT(vec.resize(MARISA_SIZE_MAX), MARISA_SIZE_ERROR);
238*ab8db090SAndroid Build Coastguard Worker 
239*ab8db090SAndroid Build Coastguard Worker   vec.fix();
240*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.fixed());
241*ab8db090SAndroid Build Coastguard Worker   EXCEPT(vec.fix(), MARISA_STATE_ERROR);
242*ab8db090SAndroid Build Coastguard Worker   EXCEPT(vec.push_back(0), MARISA_STATE_ERROR);
243*ab8db090SAndroid Build Coastguard Worker   EXCEPT(vec.resize(0), MARISA_STATE_ERROR);
244*ab8db090SAndroid Build Coastguard Worker   EXCEPT(vec.reserve(0), MARISA_STATE_ERROR);
245*ab8db090SAndroid Build Coastguard Worker 
246*ab8db090SAndroid Build Coastguard Worker   TEST_END();
247*ab8db090SAndroid Build Coastguard Worker }
248*ab8db090SAndroid Build Coastguard Worker 
TestFlatVector()249*ab8db090SAndroid Build Coastguard Worker void TestFlatVector() {
250*ab8db090SAndroid Build Coastguard Worker   TEST_START();
251*ab8db090SAndroid Build Coastguard Worker 
252*ab8db090SAndroid Build Coastguard Worker   marisa::grimoire::FlatVector vec;
253*ab8db090SAndroid Build Coastguard Worker 
254*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.value_size() == 0);
255*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.mask() == 0);
256*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == 0);
257*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.empty());
258*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.total_size() == 0);
259*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.io_size() == (sizeof(marisa::UInt64) * 3));
260*ab8db090SAndroid Build Coastguard Worker 
261*ab8db090SAndroid Build Coastguard Worker   marisa::grimoire::Vector<marisa::UInt32> values;
262*ab8db090SAndroid Build Coastguard Worker   vec.build(values);
263*ab8db090SAndroid Build Coastguard Worker 
264*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.value_size() == 0);
265*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.mask() == 0);
266*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == 0);
267*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.empty());
268*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.total_size() == 0);
269*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.io_size() == (sizeof(marisa::UInt64) * 3));
270*ab8db090SAndroid Build Coastguard Worker 
271*ab8db090SAndroid Build Coastguard Worker   values.push_back(0);
272*ab8db090SAndroid Build Coastguard Worker   vec.build(values);
273*ab8db090SAndroid Build Coastguard Worker 
274*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.value_size() == 0);
275*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.mask() == 0);
276*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == 1);
277*ab8db090SAndroid Build Coastguard Worker   ASSERT(!vec.empty());
278*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.total_size() == 8);
279*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.io_size() == (sizeof(marisa::UInt64) * 4));
280*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec[0] == 0);
281*ab8db090SAndroid Build Coastguard Worker 
282*ab8db090SAndroid Build Coastguard Worker   values.push_back(255);
283*ab8db090SAndroid Build Coastguard Worker   vec.build(values);
284*ab8db090SAndroid Build Coastguard Worker 
285*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.value_size() == 8);
286*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.mask() == 0xFF);
287*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == 2);
288*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec[0] == 0);
289*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec[1] == 255);
290*ab8db090SAndroid Build Coastguard Worker 
291*ab8db090SAndroid Build Coastguard Worker   values.push_back(65536);
292*ab8db090SAndroid Build Coastguard Worker   vec.build(values);
293*ab8db090SAndroid Build Coastguard Worker 
294*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.value_size() == 17);
295*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.mask() == 0x1FFFF);
296*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == 3);
297*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec[0] == 0);
298*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec[1] == 255);
299*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec[2] == 65536);
300*ab8db090SAndroid Build Coastguard Worker 
301*ab8db090SAndroid Build Coastguard Worker   {
302*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::Writer writer;
303*ab8db090SAndroid Build Coastguard Worker     writer.open("vector-test.dat");
304*ab8db090SAndroid Build Coastguard Worker     vec.write(writer);
305*ab8db090SAndroid Build Coastguard Worker   }
306*ab8db090SAndroid Build Coastguard Worker 
307*ab8db090SAndroid Build Coastguard Worker   vec.clear();
308*ab8db090SAndroid Build Coastguard Worker 
309*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.value_size() == 0);
310*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.mask() == 0);
311*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == 0);
312*ab8db090SAndroid Build Coastguard Worker 
313*ab8db090SAndroid Build Coastguard Worker   {
314*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::Mapper mapper;
315*ab8db090SAndroid Build Coastguard Worker     mapper.open("vector-test.dat");
316*ab8db090SAndroid Build Coastguard Worker     vec.map(mapper);
317*ab8db090SAndroid Build Coastguard Worker 
318*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec.value_size() == 17);
319*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec.mask() == 0x1FFFF);
320*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec.size() == 3);
321*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec[0] == 0);
322*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec[1] == 255);
323*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec[2] == 65536);
324*ab8db090SAndroid Build Coastguard Worker 
325*ab8db090SAndroid Build Coastguard Worker     vec.clear();
326*ab8db090SAndroid Build Coastguard Worker   }
327*ab8db090SAndroid Build Coastguard Worker 
328*ab8db090SAndroid Build Coastguard Worker   {
329*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::Reader reader;
330*ab8db090SAndroid Build Coastguard Worker     reader.open("vector-test.dat");
331*ab8db090SAndroid Build Coastguard Worker     vec.read(reader);
332*ab8db090SAndroid Build Coastguard Worker   }
333*ab8db090SAndroid Build Coastguard Worker 
334*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.value_size() == 17);
335*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.mask() == 0x1FFFF);
336*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == 3);
337*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec[0] == 0);
338*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec[1] == 255);
339*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec[2] == 65536);
340*ab8db090SAndroid Build Coastguard Worker 
341*ab8db090SAndroid Build Coastguard Worker   values.clear();
342*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < 10000; ++i) {
343*ab8db090SAndroid Build Coastguard Worker     values.push_back(static_cast<marisa::UInt32>(std::rand()));
344*ab8db090SAndroid Build Coastguard Worker   }
345*ab8db090SAndroid Build Coastguard Worker   vec.build(values);
346*ab8db090SAndroid Build Coastguard Worker 
347*ab8db090SAndroid Build Coastguard Worker   ASSERT(vec.size() == values.size());
348*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < vec.size(); ++i) {
349*ab8db090SAndroid Build Coastguard Worker     ASSERT(vec[i] == values[i]);
350*ab8db090SAndroid Build Coastguard Worker   }
351*ab8db090SAndroid Build Coastguard Worker 
352*ab8db090SAndroid Build Coastguard Worker   TEST_END();
353*ab8db090SAndroid Build Coastguard Worker }
354*ab8db090SAndroid Build Coastguard Worker 
TestBitVector(std::size_t size)355*ab8db090SAndroid Build Coastguard Worker void TestBitVector(std::size_t size) {
356*ab8db090SAndroid Build Coastguard Worker   marisa::grimoire::BitVector bv;
357*ab8db090SAndroid Build Coastguard Worker 
358*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.size() == 0);
359*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.empty());
360*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.total_size() == 0);
361*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.io_size() == sizeof(marisa::UInt64) * 5);
362*ab8db090SAndroid Build Coastguard Worker 
363*ab8db090SAndroid Build Coastguard Worker   std::vector<bool> bits(size);
364*ab8db090SAndroid Build Coastguard Worker   std::vector<std::size_t> zeros, ones;
365*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < size; ++i) {
366*ab8db090SAndroid Build Coastguard Worker     const bool bit = (std::rand() % 2) == 0;
367*ab8db090SAndroid Build Coastguard Worker     bits[i] = bit;
368*ab8db090SAndroid Build Coastguard Worker     bv.push_back(bit);
369*ab8db090SAndroid Build Coastguard Worker     (bit ? ones : zeros).push_back(i);
370*ab8db090SAndroid Build Coastguard Worker     ASSERT(bv[i] == bits[i]);
371*ab8db090SAndroid Build Coastguard Worker   }
372*ab8db090SAndroid Build Coastguard Worker 
373*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.size() == bits.size());
374*ab8db090SAndroid Build Coastguard Worker   ASSERT((size == 0) || !bv.empty());
375*ab8db090SAndroid Build Coastguard Worker 
376*ab8db090SAndroid Build Coastguard Worker   bv.build(true, true);
377*ab8db090SAndroid Build Coastguard Worker 
378*ab8db090SAndroid Build Coastguard Worker   std::size_t num_zeros = 0, num_ones = 0;
379*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < bits.size(); ++i) {
380*ab8db090SAndroid Build Coastguard Worker     ASSERT(bv[i] == bits[i]);
381*ab8db090SAndroid Build Coastguard Worker     ASSERT(bv.rank0(i) == num_zeros);
382*ab8db090SAndroid Build Coastguard Worker     ASSERT(bv.rank1(i) == num_ones);
383*ab8db090SAndroid Build Coastguard Worker     ++(bv[i] ? num_ones : num_zeros);
384*ab8db090SAndroid Build Coastguard Worker   }
385*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < zeros.size(); ++i) {
386*ab8db090SAndroid Build Coastguard Worker     ASSERT(bv.select0(i) == zeros[i]);
387*ab8db090SAndroid Build Coastguard Worker   }
388*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < ones.size(); ++i) {
389*ab8db090SAndroid Build Coastguard Worker     ASSERT(bv.select1(i) == ones[i]);
390*ab8db090SAndroid Build Coastguard Worker   }
391*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.num_0s() == num_zeros);
392*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.num_1s() == num_ones);
393*ab8db090SAndroid Build Coastguard Worker 
394*ab8db090SAndroid Build Coastguard Worker   std::stringstream stream;
395*ab8db090SAndroid Build Coastguard Worker   {
396*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::Writer writer;
397*ab8db090SAndroid Build Coastguard Worker     writer.open(stream);
398*ab8db090SAndroid Build Coastguard Worker     bv.write(writer);
399*ab8db090SAndroid Build Coastguard Worker   }
400*ab8db090SAndroid Build Coastguard Worker 
401*ab8db090SAndroid Build Coastguard Worker   bv.clear();
402*ab8db090SAndroid Build Coastguard Worker 
403*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.size() == 0);
404*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.empty());
405*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.total_size() == 0);
406*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.io_size() == sizeof(marisa::UInt64) * 5);
407*ab8db090SAndroid Build Coastguard Worker 
408*ab8db090SAndroid Build Coastguard Worker   {
409*ab8db090SAndroid Build Coastguard Worker     marisa::grimoire::Reader reader;
410*ab8db090SAndroid Build Coastguard Worker     reader.open(stream);
411*ab8db090SAndroid Build Coastguard Worker     bv.read(reader);
412*ab8db090SAndroid Build Coastguard Worker   }
413*ab8db090SAndroid Build Coastguard Worker 
414*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.size() == bits.size());
415*ab8db090SAndroid Build Coastguard Worker 
416*ab8db090SAndroid Build Coastguard Worker   num_zeros = 0, num_ones = 0;
417*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < bits.size(); ++i) {
418*ab8db090SAndroid Build Coastguard Worker     ASSERT(bv[i] == bits[i]);
419*ab8db090SAndroid Build Coastguard Worker     ASSERT(bv.rank0(i) == num_zeros);
420*ab8db090SAndroid Build Coastguard Worker     ASSERT(bv.rank1(i) == num_ones);
421*ab8db090SAndroid Build Coastguard Worker     ++(bv[i] ? num_ones : num_zeros);
422*ab8db090SAndroid Build Coastguard Worker   }
423*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < zeros.size(); ++i) {
424*ab8db090SAndroid Build Coastguard Worker     ASSERT(bv.select0(i) == zeros[i]);
425*ab8db090SAndroid Build Coastguard Worker   }
426*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < ones.size(); ++i) {
427*ab8db090SAndroid Build Coastguard Worker     ASSERT(bv.select1(i) == ones[i]);
428*ab8db090SAndroid Build Coastguard Worker   }
429*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.num_0s() == num_zeros);
430*ab8db090SAndroid Build Coastguard Worker   ASSERT(bv.num_1s() == num_ones);
431*ab8db090SAndroid Build Coastguard Worker }
432*ab8db090SAndroid Build Coastguard Worker 
TestBitVector()433*ab8db090SAndroid Build Coastguard Worker void TestBitVector() {
434*ab8db090SAndroid Build Coastguard Worker   TEST_START();
435*ab8db090SAndroid Build Coastguard Worker 
436*ab8db090SAndroid Build Coastguard Worker   TestBitVector(0);
437*ab8db090SAndroid Build Coastguard Worker   TestBitVector(1);
438*ab8db090SAndroid Build Coastguard Worker   TestBitVector(511);
439*ab8db090SAndroid Build Coastguard Worker   TestBitVector(512);
440*ab8db090SAndroid Build Coastguard Worker   TestBitVector(513);
441*ab8db090SAndroid Build Coastguard Worker 
442*ab8db090SAndroid Build Coastguard Worker   for (int i = 0; i < 100; ++i) {
443*ab8db090SAndroid Build Coastguard Worker     TestBitVector(std::rand() % 4096);
444*ab8db090SAndroid Build Coastguard Worker   }
445*ab8db090SAndroid Build Coastguard Worker 
446*ab8db090SAndroid Build Coastguard Worker   TEST_END();
447*ab8db090SAndroid Build Coastguard Worker }
448*ab8db090SAndroid Build Coastguard Worker 
449*ab8db090SAndroid Build Coastguard Worker }  // namespace
450*ab8db090SAndroid Build Coastguard Worker 
main()451*ab8db090SAndroid Build Coastguard Worker int main() try {
452*ab8db090SAndroid Build Coastguard Worker   std::srand((unsigned int)std::time(NULL));
453*ab8db090SAndroid Build Coastguard Worker 
454*ab8db090SAndroid Build Coastguard Worker   TestPopCount();
455*ab8db090SAndroid Build Coastguard Worker   TestPopCount();
456*ab8db090SAndroid Build Coastguard Worker   TestRankIndex();
457*ab8db090SAndroid Build Coastguard Worker 
458*ab8db090SAndroid Build Coastguard Worker   TestVector();
459*ab8db090SAndroid Build Coastguard Worker   TestFlatVector();
460*ab8db090SAndroid Build Coastguard Worker   TestBitVector();
461*ab8db090SAndroid Build Coastguard Worker 
462*ab8db090SAndroid Build Coastguard Worker   return 0;
463*ab8db090SAndroid Build Coastguard Worker } catch (const marisa::Exception &ex) {
464*ab8db090SAndroid Build Coastguard Worker   std::cerr << ex.what() << std::endl;
465*ab8db090SAndroid Build Coastguard Worker   throw;
466*ab8db090SAndroid Build Coastguard Worker }
467