| #include "intvector.h" |
| |
| namespace marisa { |
| |
| IntVector::IntVector() |
| : units_(), num_bits_per_int_(0), mask_(0), size_(0) {} |
| |
| void IntVector::build(const Vector<UInt32> &ints) { |
| UInt32 max_int = 0; |
| for (UInt32 i = 0; i < ints.size(); ++i) { |
| if (ints[i] > max_int) { |
| max_int = ints[i]; |
| } |
| } |
| build(max_int, ints.size()); |
| for (UInt32 i = 0; i < ints.size(); ++i) { |
| set(i, ints[i]); |
| } |
| } |
| |
| void IntVector::build(UInt32 max_int, std::size_t size) { |
| UInt32 num_bits_per_int = 0; |
| do { |
| ++num_bits_per_int; |
| max_int >>= 1; |
| } while (max_int != 0); |
| |
| const std::size_t new_size = (std::size_t)( |
| (((UInt64)num_bits_per_int * size) + 31) / 32); |
| |
| Vector<UInt32> temp_units; |
| temp_units.resize(new_size, 0); |
| units_.swap(&temp_units); |
| |
| num_bits_per_int_ = num_bits_per_int; |
| mask_ = ~0U; |
| if (num_bits_per_int != 32) { |
| mask_ = (1U << num_bits_per_int) - 1; |
| } |
| size_ = (UInt32)size; |
| } |
| |
| void IntVector::mmap(Mapper *mapper, const char *filename, |
| long offset, int whence) { |
| MARISA_THROW_IF(mapper == NULL, MARISA_PARAM_ERROR); |
| Mapper temp_mapper; |
| temp_mapper.open(filename, offset, whence); |
| map(temp_mapper); |
| temp_mapper.swap(mapper); |
| } |
| |
| void IntVector::map(const void *ptr, std::size_t size) { |
| Mapper mapper(ptr, size); |
| map(mapper); |
| } |
| |
| void IntVector::map(Mapper &mapper) { |
| IntVector temp; |
| temp.units_.map(mapper); |
| mapper.map(&temp.num_bits_per_int_); |
| mapper.map(&temp.mask_); |
| mapper.map(&temp.size_); |
| temp.swap(this); |
| } |
| |
| void IntVector::load(const char *filename, |
| long offset, int whence) { |
| Reader reader; |
| reader.open(filename, offset, whence); |
| read(reader); |
| } |
| |
| void IntVector::fread(std::FILE *file) { |
| Reader reader(file); |
| read(reader); |
| } |
| |
| void IntVector::read(int fd) { |
| Reader reader(fd); |
| read(reader); |
| } |
| |
| void IntVector::read(std::istream &stream) { |
| Reader reader(&stream); |
| read(reader); |
| } |
| |
| void IntVector::read(Reader &reader) { |
| IntVector temp; |
| temp.units_.read(reader); |
| reader.read(&temp.num_bits_per_int_); |
| reader.read(&temp.mask_); |
| reader.read(&temp.size_); |
| temp.swap(this); |
| } |
| |
| void IntVector::save(const char *filename, bool trunc_flag, |
| long offset, int whence) const { |
| Writer writer; |
| writer.open(filename, trunc_flag, offset, whence); |
| write(writer); |
| } |
| |
| void IntVector::fwrite(std::FILE *file) const { |
| Writer writer(file); |
| write(writer); |
| } |
| |
| void IntVector::write(int fd) const { |
| Writer writer(fd); |
| write(writer); |
| } |
| |
| void IntVector::write(std::ostream &stream) const { |
| Writer writer(&stream); |
| write(writer); |
| } |
| |
| void IntVector::write(Writer &writer) const { |
| units_.write(writer); |
| writer.write(num_bits_per_int_); |
| writer.write(mask_); |
| writer.write(size_); |
| } |
| |
| void IntVector::clear() { |
| IntVector().swap(this); |
| } |
| |
| void IntVector::swap(IntVector *rhs) { |
| MARISA_THROW_IF(rhs == NULL, MARISA_PARAM_ERROR); |
| units_.swap(&rhs->units_); |
| Swap(&num_bits_per_int_, &rhs->num_bits_per_int_); |
| Swap(&mask_, &rhs->mask_); |
| Swap(&size_, &rhs->size_); |
| } |
| |
| } // namespace marisa |