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 Workervoid 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 Workervoid 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 Workervoid 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 Workervoid 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 Workervoid 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 Workervoid 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 Workerint 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