| #ifndef MARISA_VECTOR_H_ |
| #define MARISA_VECTOR_H_ |
| |
| #include "io.h" |
| |
| namespace marisa { |
| |
| template <typename T> |
| class Vector { |
| public: |
| Vector(); |
| ~Vector(); |
| |
| void mmap(Mapper *mapper, const char *filename, |
| long offset = 0, int whence = SEEK_SET); |
| void map(const void *ptr, std::size_t size); |
| void map(Mapper &mapper); |
| |
| void load(const char *filename, |
| long offset = 0, int whence = SEEK_SET); |
| void fread(std::FILE *file); |
| void read(int fd); |
| void read(std::istream &stream); |
| void read(Reader &reader); |
| |
| void save(const char *filename, bool trunc_flag = false, |
| long offset = 0, int whence = SEEK_SET) const; |
| void fwrite(std::FILE *file) const; |
| void write(int fd) const; |
| void write(std::ostream &stream) const; |
| void write(Writer &writer) const; |
| |
| void push_back(const T &x); |
| void pop_back(); |
| |
| void resize(std::size_t size); |
| void resize(std::size_t size, const T &x); |
| void reserve(std::size_t capacity); |
| void shrink(); |
| |
| void fix(); |
| |
| const T *begin() const { |
| return objs_; |
| } |
| const T *end() const { |
| return objs_ + size_; |
| } |
| const T &operator[](std::size_t i) const { |
| MARISA_DEBUG_IF(i > size_, MARISA_PARAM_ERROR); |
| return objs_[i]; |
| } |
| const T &front() const { |
| MARISA_DEBUG_IF(size_ == 0, MARISA_STATE_ERROR); |
| return objs_[0]; |
| } |
| const T &back() const { |
| MARISA_DEBUG_IF(size_ == 0, MARISA_STATE_ERROR); |
| return objs_[size_ - 1]; |
| } |
| |
| T *begin() { |
| MARISA_DEBUG_IF(fixed_, MARISA_STATE_ERROR); |
| return buf_; |
| } |
| T *end() { |
| MARISA_DEBUG_IF(fixed_, MARISA_STATE_ERROR); |
| return buf_ + size_; |
| } |
| T &operator[](std::size_t i) { |
| MARISA_DEBUG_IF(fixed_, MARISA_STATE_ERROR); |
| MARISA_DEBUG_IF(i > size_, MARISA_PARAM_ERROR); |
| return buf_[i]; |
| } |
| T &front() { |
| MARISA_DEBUG_IF(fixed_ || (size_ == 0), MARISA_STATE_ERROR); |
| return buf_[0]; |
| } |
| T &back() { |
| MARISA_DEBUG_IF(fixed_ || (size_ == 0), MARISA_STATE_ERROR); |
| return buf_[size_ - 1]; |
| } |
| |
| bool empty() const { |
| return size_ == 0; |
| } |
| std::size_t size() const { |
| return size_; |
| } |
| std::size_t capacity() const { |
| return capacity_; |
| } |
| bool fixed() const { |
| return fixed_; |
| } |
| std::size_t total_size() const { |
| return (sizeof(T) * size_) + sizeof(size_); |
| } |
| |
| void clear() { |
| Vector().swap(this); |
| } |
| void swap(Vector *rhs); |
| |
| static std::size_t max_size() { |
| return MARISA_UINT32_MAX; |
| } |
| |
| private: |
| T *buf_; |
| const T *objs_; |
| UInt32 size_; |
| UInt32 capacity_; |
| bool fixed_; |
| |
| void realloc(std::size_t new_capacity); |
| |
| // Disallows copy and assignment. |
| Vector(const Vector &); |
| Vector &operator=(const Vector &); |
| }; |
| |
| } // namespace marisa |
| |
| #include "vector-inline.h" |
| |
| #endif // MARISA_VECTOR_H_ |