1 #ifndef MARISA_VECTOR_H_ 2 #define MARISA_VECTOR_H_ 3 4 #include "io.h" 5 6 namespace marisa { 7 8 template <typename T> 9 class Vector { 10 public: 11 Vector(); 12 ~Vector(); 13 14 void mmap(Mapper *mapper, const char *filename, 15 long offset = 0, int whence = SEEK_SET); 16 void map(const void *ptr, std::size_t size); 17 void map(Mapper &mapper); 18 19 void load(const char *filename, 20 long offset = 0, int whence = SEEK_SET); 21 void fread(std::FILE *file); 22 void read(int fd); 23 void read(std::istream &stream); 24 void read(Reader &reader); 25 26 void save(const char *filename, bool trunc_flag = false, 27 long offset = 0, int whence = SEEK_SET) const; 28 void fwrite(std::FILE *file) const; 29 void write(int fd) const; 30 void write(std::ostream &stream) const; 31 void write(Writer &writer) const; 32 33 void push_back(const T &x); 34 void pop_back(); 35 36 void resize(std::size_t size); 37 void resize(std::size_t size, const T &x); 38 void reserve(std::size_t capacity); 39 void shrink(); 40 41 void fix(); 42 begin()43 const T *begin() const { 44 return objs_; 45 } end()46 const T *end() const { 47 return objs_ + size_; 48 } 49 const T &operator[](std::size_t i) const { 50 MARISA_DEBUG_IF(i > size_, MARISA_PARAM_ERROR); 51 return objs_[i]; 52 } front()53 const T &front() const { 54 MARISA_DEBUG_IF(size_ == 0, MARISA_STATE_ERROR); 55 return objs_[0]; 56 } back()57 const T &back() const { 58 MARISA_DEBUG_IF(size_ == 0, MARISA_STATE_ERROR); 59 return objs_[size_ - 1]; 60 } 61 begin()62 T *begin() { 63 MARISA_DEBUG_IF(fixed_, MARISA_STATE_ERROR); 64 return buf_; 65 } end()66 T *end() { 67 MARISA_DEBUG_IF(fixed_, MARISA_STATE_ERROR); 68 return buf_ + size_; 69 } 70 T &operator[](std::size_t i) { 71 MARISA_DEBUG_IF(fixed_, MARISA_STATE_ERROR); 72 MARISA_DEBUG_IF(i > size_, MARISA_PARAM_ERROR); 73 return buf_[i]; 74 } front()75 T &front() { 76 MARISA_DEBUG_IF(fixed_ || (size_ == 0), MARISA_STATE_ERROR); 77 return buf_[0]; 78 } back()79 T &back() { 80 MARISA_DEBUG_IF(fixed_ || (size_ == 0), MARISA_STATE_ERROR); 81 return buf_[size_ - 1]; 82 } 83 empty()84 bool empty() const { 85 return size_ == 0; 86 } size()87 std::size_t size() const { 88 return size_; 89 } capacity()90 std::size_t capacity() const { 91 return capacity_; 92 } fixed()93 bool fixed() const { 94 return fixed_; 95 } total_size()96 std::size_t total_size() const { 97 return (sizeof(T) * size_) + sizeof(size_); 98 } 99 clear()100 void clear() { 101 Vector().swap(this); 102 } 103 void swap(Vector *rhs); 104 max_size()105 static std::size_t max_size() { 106 return MARISA_UINT32_MAX; 107 } 108 109 private: 110 T *buf_; 111 const T *objs_; 112 UInt32 size_; 113 UInt32 capacity_; 114 bool fixed_; 115 116 void realloc(std::size_t new_capacity); 117 118 // Disallows copy and assignment. 119 Vector(const Vector &); 120 Vector &operator=(const Vector &); 121 }; 122 123 } // namespace marisa 124 125 #include "vector-inline.h" 126 127 #endif // MARISA_VECTOR_H_ 128