1 #include "intvector.h"
2
3 namespace marisa {
4
IntVector()5 IntVector::IntVector()
6 : units_(), num_bits_per_int_(0), mask_(0), size_(0) {}
7
build(const Vector<UInt32> & ints)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
build(UInt32 max_int,std::size_t size)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
mmap(Mapper * mapper,const char * filename,long offset,int whence)43 void IntVector::mmap(Mapper *mapper, const char *filename,
44 long offset, int whence) {
45 MARISA_THROW_IF(mapper == NULL, MARISA_PARAM_ERROR);
46 Mapper temp_mapper;
47 temp_mapper.open(filename, offset, whence);
48 map(temp_mapper);
49 temp_mapper.swap(mapper);
50 }
51
map(const void * ptr,std::size_t size)52 void IntVector::map(const void *ptr, std::size_t size) {
53 Mapper mapper(ptr, size);
54 map(mapper);
55 }
56
map(Mapper & mapper)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
load(const char * filename,long offset,int whence)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
fread(std::FILE * file)73 void IntVector::fread(std::FILE *file) {
74 Reader reader(file);
75 read(reader);
76 }
77
read(int fd)78 void IntVector::read(int fd) {
79 Reader reader(fd);
80 read(reader);
81 }
82
read(std::istream & stream)83 void IntVector::read(std::istream &stream) {
84 Reader reader(&stream);
85 read(reader);
86 }
87
read(Reader & reader)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
save(const char * filename,bool trunc_flag,long offset,int whence) const97 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
fwrite(std::FILE * file) const104 void IntVector::fwrite(std::FILE *file) const {
105 Writer writer(file);
106 write(writer);
107 }
108
write(int fd) const109 void IntVector::write(int fd) const {
110 Writer writer(fd);
111 write(writer);
112 }
113
write(std::ostream & stream) const114 void IntVector::write(std::ostream &stream) const {
115 Writer writer(&stream);
116 write(writer);
117 }
118
write(Writer & writer) const119 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
clear()126 void IntVector::clear() {
127 IntVector().swap(this);
128 }
129
swap(IntVector * rhs)130 void IntVector::swap(IntVector *rhs) {
131 MARISA_THROW_IF(rhs == NULL, MARISA_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
139