1 #include "intvector.h" 2 3 namespace marisa_alpha { 4 5 IntVector::IntVector() 6 : units_(), num_bits_per_int_(0), mask_(0), size_(0) {} 7 8 void IntVector::build(const Vector<UInt32> &ints) { 9 UInt32 max_int = 0; 10 for (UInt32 i = 0; i < ints.size(); ++i) { 11 if (ints[i] > max_int) { 12 max_int = ints[i]; 13 } 14 } 15 build(max_int, ints.size()); 16 for (UInt32 i = 0; i < ints.size(); ++i) { 17 set(i, ints[i]); 18 } 19 } 20 21 void IntVector::build(UInt32 max_int, std::size_t size) { 22 UInt32 num_bits_per_int = 0; 23 do { 24 ++num_bits_per_int; 25 max_int >>= 1; 26 } while (max_int != 0); 27 28 const std::size_t new_size = (std::size_t)( 29 (((UInt64)num_bits_per_int * size) + 31) / 32); 30 31 Vector<UInt32> temp_units; 32 temp_units.resize(new_size, 0); 33 units_.swap(&temp_units); 34 35 num_bits_per_int_ = num_bits_per_int; 36 mask_ = ~0U; 37 if (num_bits_per_int != 32) { 38 mask_ = (1U << num_bits_per_int) - 1; 39 } 40 size_ = (UInt32)size; 41 } 42 43 void IntVector::mmap(Mapper *mapper, const char *filename, 44 long offset, int whence) { 45 MARISA_ALPHA_THROW_IF(mapper == NULL, MARISA_ALPHA_PARAM_ERROR); 46 Mapper temp_mapper; 47 temp_mapper.open(filename, offset, whence); 48 map(temp_mapper); 49 temp_mapper.swap(mapper); 50 } 51 52 void IntVector::map(const void *ptr, std::size_t size) { 53 Mapper mapper(ptr, size); 54 map(mapper); 55 } 56 57 void IntVector::map(Mapper &mapper) { 58 IntVector temp; 59 temp.units_.map(mapper); 60 mapper.map(&temp.num_bits_per_int_); 61 mapper.map(&temp.mask_); 62 mapper.map(&temp.size_); 63 temp.swap(this); 64 } 65 66 void IntVector::load(const char *filename, 67 long offset, int whence) { 68 Reader reader; 69 reader.open(filename, offset, whence); 70 read(reader); 71 } 72 73 void IntVector::fread(std::FILE *file) { 74 Reader reader(file); 75 read(reader); 76 } 77 78 void IntVector::read(int fd) { 79 Reader reader(fd); 80 read(reader); 81 } 82 83 void IntVector::read(std::istream &stream) { 84 Reader reader(&stream); 85 read(reader); 86 } 87 88 void IntVector::read(Reader &reader) { 89 IntVector temp; 90 temp.units_.read(reader); 91 reader.read(&temp.num_bits_per_int_); 92 reader.read(&temp.mask_); 93 reader.read(&temp.size_); 94 temp.swap(this); 95 } 96 97 void IntVector::save(const char *filename, bool trunc_flag, 98 long offset, int whence) const { 99 Writer writer; 100 writer.open(filename, trunc_flag, offset, whence); 101 write(writer); 102 } 103 104 void IntVector::fwrite(std::FILE *file) const { 105 Writer writer(file); 106 write(writer); 107 } 108 109 void IntVector::write(int fd) const { 110 Writer writer(fd); 111 write(writer); 112 } 113 114 void IntVector::write(std::ostream &stream) const { 115 Writer writer(&stream); 116 write(writer); 117 } 118 119 void IntVector::write(Writer &writer) const { 120 units_.write(writer); 121 writer.write(num_bits_per_int_); 122 writer.write(mask_); 123 writer.write(size_); 124 } 125 126 void IntVector::clear() { 127 IntVector().swap(this); 128 } 129 130 void IntVector::swap(IntVector *rhs) { 131 MARISA_ALPHA_THROW_IF(rhs == NULL, MARISA_ALPHA_PARAM_ERROR); 132 units_.swap(&rhs->units_); 133 Swap(&num_bits_per_int_, &rhs->num_bits_per_int_); 134 Swap(&mask_, &rhs->mask_); 135 Swap(&size_, &rhs->size_); 136 } 137 138 } // namespace marisa_alpha 139