Analytics Template Library
 All Classes Namespaces Functions Variables Pages
compressed_vector.hpp
1 // -*- C++ -*-
2 /*
3  * File: compressed_vector.hpp
4  * Author: matthewsupernaw
5  *
6  * Created on November 24, 2015, 1:40 PM
7  */
8 
9 #ifndef COMPRESSED_VECTOR_HPP
10 #define COMPRESSED_VECTOR_HPP
11 
12 #include <vector>
13 #include <algorithm>
14 #include <utility>
15 #include "flat_map.hpp"
16 
17 namespace util {
18 
19  template<typename T>
21  std::vector<std::pair<size_t, T> > data_m;
22  size_t size_m;
23  size_t allocated_size_m;
24  size_t max_held;
25 
26  inline const size_t lower_bound(const size_t& index) {
27  size_t start = 0;
28  size_t end = size_m;
29  size_t guess;
30  typename std::vector<std::pair<size_t, T> >::iterator it;
31  while (end > start) {
32  guess = (end + start) >> 1;
33  if (data_m[guess].first < index) {
34  start = guess + 1;
35  } else {
36  end = guess;
37  }
38  }
39  return (start);
40  }
41 
42  T value(const size_t& index) {
43 
44  size_t id = lower_bound(index);
45  if (id >= size_m || data_m[id].first != index) {
46  return T();
47  }
48 
49  return data_m[id].second;
50  }
51 
52  T& ref(size_t index) {
53  size_t id = lower_bound(index);
54  if (id >= size_m || data_m[id].first != index) {
55  resize(size_m + 1, 1);
56  for (size_t j = size_m - 1; j > id; --j) {
57  data_m[j] = data_m[j - 1];
58  }
59  data_m[id] = std::pair<size_t, T>(index, T());
60  }
61  return data_m[id].second;
62  }
63 
64  inline void reallocate(size_t size) {
65  data_m.resize(size);
66  allocated_size_m = size;
67  }
68 
69  public:
70  typedef typename std::vector<std::pair<size_t, T> >::iterator iterator;
71  typedef typename std::vector<std::pair<size_t, T> >::const_iterator const_iterator;
72  typedef typename std::vector<std::pair<size_t, T> >::reverse_iterator reverse_iterator;
73  typedef typename std::vector<std::pair<size_t, T> >::const_reverse_iterator const_reverse_iterator;
74 
75  compressed_vector(size_t size = 0) : size_m(0), allocated_size_m(0), max_held(0) {
76 // this->reserve(32);
77  if (size)
78  this->resize(size);
79  }
80 
88  inline T& operator[](size_t index) {
89  return ref(index);
90  }
91 
99  inline T& at(size_t index) {
100  return ref(index);
101  }
102 
111  inline T get(size_t index) {
112  return value(index);
113  }
114 
123  inline T operator()(size_t index) {
124  return value(index);
125  }
126 
127  inline void clear() {
128  this->allocated_size_m = 0;
129  this->size_m = 0;
130  this->data_m.clear();
131  }
132 
133  size_t size() {
134  return size_m;
135  }
136 
137  void reserve(size_t size) {
138  data_m.reserve(size);
139  }
140 
141  void resize(size_t size, double factor = 1) {
142  if (allocated_size_m < size) {
143  reallocate(size + size_t(factor * double(size)));
144  }
145  size_m = size;
146  }
147 
148  iterator find(size_t index) {
149  size_t id = lower_bound(index);
150  if (id >= size_m || data_m[id].first != index) {
151  return end();
152  }
153  return data_m.begin() + id;
154  }
155 
156  iterator begin() {
157  return data_m.begin();
158  }
159 
160  const_iterator begin() const {
161  return data_m.begin();
162  }
163 
164  iterator end() {
165  return data_m.end();
166  }
167 
168  const_iterator end() const {
169  return data_m.end();
170  }
171 
172  reverse_iterator rbegin() {
173  return data_m.rbegin();
174  }
175 
176  const_reverse_iterator rbegin() const {
177  return data_m.rbegin();
178  }
179 
180  reverse_iterator rend() {
181  return data_m.rend();
182  }
183 
184  const_reverse_iterator rend() const {
185  return data_m.rend();
186  }
187 
188  };
189 }
190 
191 
192 #endif /* COMPRESSED_VECTOR_HPP */
193 
T operator()(size_t index)
Definition: compressed_vector.hpp:123
Definition: Combinations.hpp:17
Definition: compressed_vector.hpp:20
T & operator[](size_t index)
Definition: compressed_vector.hpp:88
T & at(size_t index)
Definition: compressed_vector.hpp:99