• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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