| #include <cstdlib> |
| #include <ctime> |
| #include <sstream> |
| #include <string> |
| #include <vector> |
| |
| #include <marisa/vector.h> |
| #include <marisa/intvector.h> |
| #include <marisa/bitvector.h> |
| |
| #include "assert.h" |
| |
| namespace { |
| |
| void TestVector() { |
| TEST_START(); |
| |
| std::vector<int> values; |
| for (std::size_t i = 0; i < 1000; ++i) { |
| values.push_back(std::rand()); |
| } |
| |
| marisa::Vector<int> vec; |
| |
| ASSERT(vec.max_size() == MARISA_UINT32_MAX); |
| ASSERT(vec.size() == 0); |
| ASSERT(vec.capacity() == 0); |
| ASSERT(!vec.fixed()); |
| ASSERT(vec.empty()); |
| ASSERT(vec.total_size() == sizeof(marisa::UInt32)); |
| |
| for (std::size_t i = 0; i < values.size(); ++i) { |
| vec.push_back(values[i]); |
| ASSERT(vec[i] == values[i]); |
| ASSERT(static_cast<const marisa::Vector<int> &>(vec)[i] == values[i]); |
| } |
| |
| ASSERT(vec.size() == values.size()); |
| ASSERT(vec.capacity() >= vec.size()); |
| ASSERT(!vec.empty()); |
| ASSERT(vec.total_size() == sizeof(marisa::UInt32) |
| + ((sizeof(int) * values.size()))); |
| |
| ASSERT(static_cast<const marisa::Vector<int> &>(vec).front() |
| == values.front()); |
| ASSERT(static_cast<const marisa::Vector<int> &>(vec).back() |
| == values.back()); |
| ASSERT(vec.front() == values.front()); |
| ASSERT(vec.back() == values.back()); |
| |
| vec.shrink(); |
| |
| ASSERT(vec.size() == values.size()); |
| ASSERT(vec.capacity() == vec.size()); |
| for (std::size_t i = 0; i < values.size(); ++i) { |
| ASSERT(vec[i] == values[i]); |
| ASSERT(static_cast<const marisa::Vector<int> &>(vec)[i] == values[i]); |
| } |
| |
| vec.save("vector-test.dat"); |
| vec.clear(); |
| |
| ASSERT(vec.empty()); |
| ASSERT(vec.capacity() == 0); |
| |
| marisa::Mapper mapper; |
| vec.mmap(&mapper, "vector-test.dat"); |
| |
| ASSERT(mapper.is_open()); |
| ASSERT(vec.size() == values.size()); |
| ASSERT(vec.capacity() == 0); |
| ASSERT(vec.fixed()); |
| ASSERT(!vec.empty()); |
| ASSERT(vec.total_size() == sizeof(marisa::UInt32) |
| + ((sizeof(int) * values.size()))); |
| |
| for (std::size_t i = 0; i < values.size(); ++i) { |
| ASSERT(static_cast<const marisa::Vector<int> &>(vec)[i] == values[i]); |
| } |
| |
| vec.clear(); |
| vec.load("vector-test.dat"); |
| |
| ASSERT(vec.size() == values.size()); |
| ASSERT(vec.capacity() == vec.size()); |
| ASSERT(!vec.fixed()); |
| ASSERT(!vec.empty()); |
| ASSERT(vec.total_size() == sizeof(marisa::UInt32) |
| + ((sizeof(int) * values.size()))); |
| |
| for (std::size_t i = 0; i < values.size(); ++i) { |
| ASSERT(vec[i] == values[i]); |
| ASSERT(static_cast<const marisa::Vector<int> &>(vec)[i] == values[i]); |
| } |
| |
| vec.clear(); |
| |
| vec.push_back(0); |
| ASSERT(vec.capacity() == 1); |
| vec.push_back(1); |
| ASSERT(vec.capacity() == 2); |
| vec.push_back(2); |
| ASSERT(vec.capacity() == 4); |
| vec.resize(5); |
| ASSERT(vec.capacity() == 8); |
| vec.resize(100); |
| ASSERT(vec.capacity() == 100); |
| |
| vec.fix(); |
| ASSERT(vec.fixed()); |
| EXCEPT(vec.fix(), MARISA_STATE_ERROR); |
| EXCEPT(vec.push_back(0), MARISA_STATE_ERROR); |
| EXCEPT(vec.resize(0), MARISA_STATE_ERROR); |
| EXCEPT(vec.reserve(0), MARISA_STATE_ERROR); |
| |
| TEST_END(); |
| } |
| |
| void TestIntVector() { |
| TEST_START(); |
| |
| marisa::IntVector vec; |
| |
| ASSERT(vec.num_bits_per_int() == 0); |
| ASSERT(vec.mask() == 0); |
| ASSERT(vec.size() == 0); |
| ASSERT(vec.empty()); |
| ASSERT(vec.total_size() == sizeof(marisa::UInt32) * 4); |
| |
| marisa::Vector<marisa::UInt32> values; |
| vec.build(values); |
| |
| ASSERT(vec.num_bits_per_int() == 1); |
| ASSERT(vec.mask() == 1); |
| ASSERT(vec.size() == 0); |
| ASSERT(vec.empty()); |
| ASSERT(vec.total_size() == sizeof(marisa::UInt32) * 4); |
| |
| values.push_back(0); |
| vec.build(values); |
| |
| ASSERT(vec.num_bits_per_int() == 1); |
| ASSERT(vec.mask() == 1); |
| ASSERT(vec.size() == 1); |
| ASSERT(!vec.empty()); |
| ASSERT(vec.total_size() == sizeof(marisa::UInt32) * 5); |
| ASSERT(vec[0] == 0); |
| |
| values.push_back(255); |
| vec.build(values); |
| |
| ASSERT(vec.num_bits_per_int() == 8); |
| ASSERT(vec.mask() == 0xFF); |
| ASSERT(vec.size() == 2); |
| ASSERT(vec[0] == 0); |
| ASSERT(vec[1] == 255); |
| |
| values.push_back(65536); |
| vec.build(values); |
| |
| ASSERT(vec.num_bits_per_int() == 17); |
| ASSERT(vec.mask() == 0x1FFFF); |
| ASSERT(vec.size() == 3); |
| ASSERT(vec[0] == 0); |
| ASSERT(vec[1] == 255); |
| ASSERT(vec[2] == 65536); |
| |
| vec.save("vector-test.dat"); |
| vec.clear(); |
| |
| ASSERT(vec.num_bits_per_int() == 0); |
| ASSERT(vec.mask() == 0); |
| ASSERT(vec.size() == 0); |
| |
| marisa::Mapper mapper; |
| vec.mmap(&mapper, "vector-test.dat"); |
| |
| ASSERT(mapper.is_open()); |
| ASSERT(vec.num_bits_per_int() == 17); |
| ASSERT(vec.mask() == 0x1FFFF); |
| ASSERT(vec.size() == 3); |
| ASSERT(vec[0] == 0); |
| ASSERT(vec[1] == 255); |
| ASSERT(vec[2] == 65536); |
| |
| vec.clear(); |
| vec.load("vector-test.dat"); |
| |
| ASSERT(vec.num_bits_per_int() == 17); |
| ASSERT(vec.mask() == 0x1FFFF); |
| ASSERT(vec.size() == 3); |
| ASSERT(vec[0] == 0); |
| ASSERT(vec[1] == 255); |
| ASSERT(vec[2] == 65536); |
| |
| values.clear(); |
| for (std::size_t i = 0; i < 500; ++i) { |
| values.push_back(std::rand()); |
| } |
| vec.build(values); |
| |
| ASSERT(vec.size() == values.size()); |
| for (std::size_t i = 0; i < vec.size(); ++i) { |
| ASSERT(vec[i] == values[i]); |
| } |
| |
| TEST_END(); |
| } |
| |
| void TestBitVector(marisa::UInt32 size) { |
| marisa::BitVector bv; |
| |
| ASSERT(bv.size() == 0); |
| ASSERT(bv.empty()); |
| ASSERT(bv.total_size() == sizeof(marisa::UInt32) * 5); |
| |
| std::vector<bool> bits(size); |
| std::vector<marisa::UInt32> zeros, ones; |
| for (marisa::UInt32 i = 0; i < size; ++i) { |
| const bool bit = (std::rand() % 2) == 0; |
| bits[i] = bit; |
| bv.push_back(bit); |
| (bit ? ones : zeros).push_back(i); |
| ASSERT(bv[i] == bits[i]); |
| } |
| |
| ASSERT(bv.size() == bits.size()); |
| ASSERT((size == 0) || !bv.empty()); |
| |
| bv.build(); |
| |
| marisa::UInt32 num_zeros = 0, num_ones = 0; |
| for (marisa::UInt32 i = 0; i < bits.size(); ++i) { |
| ASSERT(bv[i] == bits[i]); |
| ASSERT(bv.rank0(i) == num_zeros); |
| ASSERT(bv.rank1(i) == num_ones); |
| ++(bv[i] ? num_ones : num_zeros); |
| } |
| for (marisa::UInt32 i = 0; i < zeros.size(); ++i) { |
| ASSERT(bv.select0(i) == zeros[i]); |
| } |
| for (marisa::UInt32 i = 0; i < ones.size(); ++i) { |
| ASSERT(bv.select1(i) == ones[i]); |
| } |
| |
| std::stringstream stream; |
| bv.write(stream); |
| bv.clear(); |
| |
| ASSERT(bv.size() == 0); |
| ASSERT(bv.empty()); |
| ASSERT(bv.total_size() == sizeof(marisa::UInt32) * 5); |
| |
| bv.read(stream); |
| |
| ASSERT(bv.size() == bits.size()); |
| |
| num_zeros = 0, num_ones = 0; |
| for (marisa::UInt32 i = 0; i < bits.size(); ++i) { |
| ASSERT(bv[i] == bits[i]); |
| ASSERT(bv.rank0(i) == num_zeros); |
| ASSERT(bv.rank1(i) == num_ones); |
| ++(bv[i] ? num_ones : num_zeros); |
| } |
| for (marisa::UInt32 i = 0; i < zeros.size(); ++i) { |
| ASSERT(bv.select0(i) == zeros[i]); |
| } |
| for (marisa::UInt32 i = 0; i < ones.size(); ++i) { |
| ASSERT(bv.select1(i) == ones[i]); |
| } |
| } |
| |
| void TestBitVector() { |
| TEST_START(); |
| |
| TestBitVector(0); |
| TestBitVector(1); |
| TestBitVector(511); |
| TestBitVector(512); |
| TestBitVector(513); |
| |
| for (marisa::UInt32 i = 0; i < 100; ++i) { |
| TestBitVector(std::rand() % 4096); |
| } |
| |
| TEST_END(); |
| } |
| |
| } // namespace |
| |
| int main() { |
| std::srand((unsigned int)time(NULL)); |
| |
| TestVector(); |
| TestIntVector(); |
| TestBitVector(); |
| |
| return 0; |
| } |