1 #include <cstdlib> 2 #include <ctime> 3 #include <sstream> 4 #include <string> 5 #include <vector> 6 7 #include <marisa_alpha/vector.h> 8 #include <marisa_alpha/intvector.h> 9 #include <marisa_alpha/bitvector.h> 10 11 #include "assert.h" 12 13 namespace { 14 15 void TestVector() { 16 TEST_START(); 17 18 std::vector<int> values; 19 for (std::size_t i = 0; i < 1000; ++i) { 20 values.push_back(std::rand()); 21 } 22 23 marisa_alpha::Vector<int> vec; 24 25 ASSERT(vec.max_size() == MARISA_ALPHA_UINT32_MAX); 26 ASSERT(vec.size() == 0); 27 ASSERT(vec.capacity() == 0); 28 ASSERT(!vec.fixed()); 29 ASSERT(vec.empty()); 30 ASSERT(vec.total_size() == sizeof(marisa_alpha::UInt32)); 31 32 for (std::size_t i = 0; i < values.size(); ++i) { 33 vec.push_back(values[i]); 34 ASSERT(vec[i] == values[i]); 35 ASSERT(static_cast<const marisa_alpha::Vector<int> &>(vec)[i] == 36 values[i]); 37 } 38 39 ASSERT(vec.size() == values.size()); 40 ASSERT(vec.capacity() >= vec.size()); 41 ASSERT(!vec.empty()); 42 ASSERT(vec.total_size() == sizeof(marisa_alpha::UInt32) 43 + ((sizeof(int) * values.size()))); 44 45 ASSERT(static_cast<const marisa_alpha::Vector<int> &>(vec).front() 46 == values.front()); 47 ASSERT(static_cast<const marisa_alpha::Vector<int> &>(vec).back() 48 == values.back()); 49 ASSERT(vec.front() == values.front()); 50 ASSERT(vec.back() == values.back()); 51 52 vec.shrink(); 53 54 ASSERT(vec.size() == values.size()); 55 ASSERT(vec.capacity() == vec.size()); 56 for (std::size_t i = 0; i < values.size(); ++i) { 57 ASSERT(vec[i] == values[i]); 58 ASSERT(static_cast<const marisa_alpha::Vector<int> &>(vec)[i] == 59 values[i]); 60 } 61 62 vec.save("vector-test.dat"); 63 vec.clear(); 64 65 ASSERT(vec.empty()); 66 ASSERT(vec.capacity() == 0); 67 68 marisa_alpha::Mapper mapper; 69 vec.mmap(&mapper, "vector-test.dat"); 70 71 ASSERT(mapper.is_open()); 72 ASSERT(vec.size() == values.size()); 73 ASSERT(vec.capacity() == 0); 74 ASSERT(vec.fixed()); 75 ASSERT(!vec.empty()); 76 ASSERT(vec.total_size() == sizeof(marisa_alpha::UInt32) 77 + ((sizeof(int) * values.size()))); 78 79 for (std::size_t i = 0; i < values.size(); ++i) { 80 ASSERT(static_cast<const marisa_alpha::Vector<int> &>(vec)[i] == 81 values[i]); 82 } 83 84 vec.clear(); 85 vec.load("vector-test.dat"); 86 87 ASSERT(vec.size() == values.size()); 88 ASSERT(vec.capacity() == vec.size()); 89 ASSERT(!vec.fixed()); 90 ASSERT(!vec.empty()); 91 ASSERT(vec.total_size() == sizeof(marisa_alpha::UInt32) 92 + ((sizeof(int) * values.size()))); 93 94 for (std::size_t i = 0; i < values.size(); ++i) { 95 ASSERT(vec[i] == values[i]); 96 ASSERT(static_cast<const marisa_alpha::Vector<int> &>(vec)[i] == 97 values[i]); 98 } 99 100 vec.clear(); 101 102 vec.push_back(0); 103 ASSERT(vec.capacity() == 1); 104 vec.push_back(1); 105 ASSERT(vec.capacity() == 2); 106 vec.push_back(2); 107 ASSERT(vec.capacity() == 4); 108 vec.resize(5); 109 ASSERT(vec.capacity() == 8); 110 vec.resize(100); 111 ASSERT(vec.capacity() == 100); 112 113 vec.fix(); 114 ASSERT(vec.fixed()); 115 EXCEPT(vec.fix(), MARISA_ALPHA_STATE_ERROR); 116 EXCEPT(vec.push_back(0), MARISA_ALPHA_STATE_ERROR); 117 EXCEPT(vec.resize(0), MARISA_ALPHA_STATE_ERROR); 118 EXCEPT(vec.reserve(0), MARISA_ALPHA_STATE_ERROR); 119 120 TEST_END(); 121 } 122 123 void TestIntVector() { 124 TEST_START(); 125 126 marisa_alpha::IntVector vec; 127 128 ASSERT(vec.num_bits_per_int() == 0); 129 ASSERT(vec.mask() == 0); 130 ASSERT(vec.size() == 0); 131 ASSERT(vec.empty()); 132 ASSERT(vec.total_size() == sizeof(marisa_alpha::UInt32) * 4); 133 134 marisa_alpha::Vector<marisa_alpha::UInt32> values; 135 vec.build(values); 136 137 ASSERT(vec.num_bits_per_int() == 1); 138 ASSERT(vec.mask() == 1); 139 ASSERT(vec.size() == 0); 140 ASSERT(vec.empty()); 141 ASSERT(vec.total_size() == sizeof(marisa_alpha::UInt32) * 4); 142 143 values.push_back(0); 144 vec.build(values); 145 146 ASSERT(vec.num_bits_per_int() == 1); 147 ASSERT(vec.mask() == 1); 148 ASSERT(vec.size() == 1); 149 ASSERT(!vec.empty()); 150 ASSERT(vec.total_size() == sizeof(marisa_alpha::UInt32) * 5); 151 ASSERT(vec[0] == 0); 152 153 values.push_back(255); 154 vec.build(values); 155 156 ASSERT(vec.num_bits_per_int() == 8); 157 ASSERT(vec.mask() == 0xFF); 158 ASSERT(vec.size() == 2); 159 ASSERT(vec[0] == 0); 160 ASSERT(vec[1] == 255); 161 162 values.push_back(65536); 163 vec.build(values); 164 165 ASSERT(vec.num_bits_per_int() == 17); 166 ASSERT(vec.mask() == 0x1FFFF); 167 ASSERT(vec.size() == 3); 168 ASSERT(vec[0] == 0); 169 ASSERT(vec[1] == 255); 170 ASSERT(vec[2] == 65536); 171 172 vec.save("vector-test.dat"); 173 vec.clear(); 174 175 ASSERT(vec.num_bits_per_int() == 0); 176 ASSERT(vec.mask() == 0); 177 ASSERT(vec.size() == 0); 178 179 marisa_alpha::Mapper mapper; 180 vec.mmap(&mapper, "vector-test.dat"); 181 182 ASSERT(mapper.is_open()); 183 ASSERT(vec.num_bits_per_int() == 17); 184 ASSERT(vec.mask() == 0x1FFFF); 185 ASSERT(vec.size() == 3); 186 ASSERT(vec[0] == 0); 187 ASSERT(vec[1] == 255); 188 ASSERT(vec[2] == 65536); 189 190 vec.clear(); 191 vec.load("vector-test.dat"); 192 193 ASSERT(vec.num_bits_per_int() == 17); 194 ASSERT(vec.mask() == 0x1FFFF); 195 ASSERT(vec.size() == 3); 196 ASSERT(vec[0] == 0); 197 ASSERT(vec[1] == 255); 198 ASSERT(vec[2] == 65536); 199 200 values.clear(); 201 for (std::size_t i = 0; i < 500; ++i) { 202 values.push_back(std::rand()); 203 } 204 vec.build(values); 205 206 ASSERT(vec.size() == values.size()); 207 for (std::size_t i = 0; i < vec.size(); ++i) { 208 ASSERT(vec[i] == values[i]); 209 } 210 211 TEST_END(); 212 } 213 214 void TestBitVector(marisa_alpha::UInt32 size) { 215 marisa_alpha::BitVector bv; 216 217 ASSERT(bv.size() == 0); 218 ASSERT(bv.empty()); 219 ASSERT(bv.total_size() == sizeof(marisa_alpha::UInt32) * 5); 220 221 std::vector<bool> bits(size); 222 std::vector<marisa_alpha::UInt32> zeros, ones; 223 for (marisa_alpha::UInt32 i = 0; i < size; ++i) { 224 const bool bit = (std::rand() % 2) == 0; 225 bits[i] = bit; 226 bv.push_back(bit); 227 (bit ? ones : zeros).push_back(i); 228 ASSERT(bv[i] == bits[i]); 229 } 230 231 ASSERT(bv.size() == bits.size()); 232 ASSERT((size == 0) || !bv.empty()); 233 234 bv.build(); 235 236 marisa_alpha::UInt32 num_zeros = 0, num_ones = 0; 237 for (marisa_alpha::UInt32 i = 0; i < bits.size(); ++i) { 238 ASSERT(bv[i] == bits[i]); 239 ASSERT(bv.rank0(i) == num_zeros); 240 ASSERT(bv.rank1(i) == num_ones); 241 ++(bv[i] ? num_ones : num_zeros); 242 } 243 for (marisa_alpha::UInt32 i = 0; i < zeros.size(); ++i) { 244 ASSERT(bv.select0(i) == zeros[i]); 245 } 246 for (marisa_alpha::UInt32 i = 0; i < ones.size(); ++i) { 247 ASSERT(bv.select1(i) == ones[i]); 248 } 249 250 std::stringstream stream; 251 bv.write(stream); 252 bv.clear(); 253 254 ASSERT(bv.size() == 0); 255 ASSERT(bv.empty()); 256 ASSERT(bv.total_size() == sizeof(marisa_alpha::UInt32) * 5); 257 258 bv.read(stream); 259 260 ASSERT(bv.size() == bits.size()); 261 262 num_zeros = 0, num_ones = 0; 263 for (marisa_alpha::UInt32 i = 0; i < bits.size(); ++i) { 264 ASSERT(bv[i] == bits[i]); 265 ASSERT(bv.rank0(i) == num_zeros); 266 ASSERT(bv.rank1(i) == num_ones); 267 ++(bv[i] ? num_ones : num_zeros); 268 } 269 for (marisa_alpha::UInt32 i = 0; i < zeros.size(); ++i) { 270 ASSERT(bv.select0(i) == zeros[i]); 271 } 272 for (marisa_alpha::UInt32 i = 0; i < ones.size(); ++i) { 273 ASSERT(bv.select1(i) == ones[i]); 274 } 275 } 276 277 void TestBitVector() { 278 TEST_START(); 279 280 TestBitVector(0); 281 TestBitVector(1); 282 TestBitVector(511); 283 TestBitVector(512); 284 TestBitVector(513); 285 286 for (marisa_alpha::UInt32 i = 0; i < 100; ++i) { 287 TestBitVector(std::rand() % 4096); 288 } 289 290 TEST_END(); 291 } 292 293 } // namespace 294 295 int main() { 296 std::srand((unsigned int)time(NULL)); 297 298 TestVector(); 299 TestIntVector(); 300 TestBitVector(); 301 302 return 0; 303 } 304