b-tree-plus-alpha
Loading...
Searching...
No Matches
plain_spsi_container.hpp
1#pragma once
2#include "../bp_tree.hpp"
3
4namespace stool
5{
6 namespace bptree
7 {
13 {
14 std::vector<uint64_t> items;
15
16 public:
18 {
19 }
20 PlainSPSIContainer(std::vector<uint64_t> &_items)
21 {
22 for(uint64_t x : _items){
23 this->items.push_back(x);
24 }
25 }
26
27
28 uint64_t size() const
29 {
30 return this->items.size();
31 }
32 uint64_t size_in_bytes() const
33 {
34 return sizeof(std::vector<uint64_t>) + (this->items.capacity() * sizeof(uint64_t));
35 }
36
37 uint64_t at(uint64_t pos) const
38 {
39 return this->items[pos];
40 }
41 void print() const
42 {
43 }
44
45 void clear()
46 {
47 this->items.clear();
48 this->items.shrink_to_fit();
49 }
50 void swap(PlainSPSIContainer &item)
51 {
52 this->items.swap(item.items);
53 }
54 static std::string name()
55 {
56 return "plain integers";
57 }
58 uint64_t psum(uint64_t i) const noexcept
59 {
60 uint64_t _sum = 0;
61 assert(i < this->items.size());
62
63 for (uint64_t j = 0; j < this->items.size(); j++)
64 {
65 _sum += this->items[j];
66
67 if (j == i)
68 {
69 // stool::psum_count += i;
70 return _sum;
71 }
72 }
73 return _sum;
74 }
75 uint64_t psum() const noexcept
76 {
77 if (this->items.size() == 0)
78 {
79 return 0;
80 }
81 else
82 {
83 return this->psum(this->items.size() - 1);
84 }
85 }
86 int64_t search(uint64_t x) const noexcept
87 {
88 uint64_t _sum = 0;
89 for (uint64_t i = 0; i < this->items.size(); i++)
90 {
91 _sum += this->items[i];
92
93 if (_sum >= x)
94 {
95 // stool::search_count += i;
96
97 return i;
98 }
99 }
100 return -1;
101 }
102
103 std::string to_string() const
104 {
105 std::string s;
106 s.push_back('[');
107 for (uint64_t i = 0; i < this->items.size(); i++)
108 {
109 s += std::to_string(this->items[i]);
110 if (i + 1 < this->items.size())
111 {
112 s += ", ";
113 }
114 }
115 s.push_back(']');
116 return s;
117 }
118 std::vector<uint64_t> to_value_vector() const
119 {
120 std::vector<uint64_t> r;
121 for (uint64_t i : this->items)
122 {
123 r.push_back(i);
124 }
125 return r;
126 }
127 std::vector<uint64_t> to_packed_vector() const
128 {
129 return this->to_value_vector();
130 }
131
132 template<typename VEC>
133 void to_values(VEC &output_vec) const{
134 output_vec.clear();
135 output_vec.resize(this->size());
136 for (uint64_t i = 0; i < this->size(); i++)
137 {
138 output_vec[i] = this->items[i];
139 }
140 }
141
142
143 void insert(uint64_t pos, uint64_t value)
144 {
145 assert(pos <= this->size());
146 this->items.insert(this->items.begin() + pos, value);
147 }
148 void remove(uint64_t pos)
149 {
150 assert(pos < this->size());
151
152 this->items.erase(this->items.begin() + pos);
153 }
154 void push_front(std::vector<uint64_t> &new_items)
155 {
156 std::vector<uint64_t> tmp;
157 for (uint64_t v : new_items)
158 {
159 tmp.push_back(v);
160 }
161 for (uint64_t v : this->items)
162 {
163 tmp.push_back(v);
164 }
165 this->items.swap(tmp);
166 }
167 void push_front(uint64_t new_item)
168 {
169
170 std::vector<uint64_t> tmp;
171 tmp.push_back(new_item);
172 for (uint64_t v : this->items)
173 {
174 tmp.push_back(v);
175 }
176 this->items.swap(tmp);
177 }
178
179 void push_back(std::vector<uint64_t> &new_items)
180 {
181 for (uint64_t v : new_items)
182 {
183 this->items.push_back(v);
184 }
185 }
186 void push_back(uint64_t value)
187 {
188 this->items.push_back(value);
189 }
190 std::vector<uint64_t> pop_front(uint64_t len)
191 {
192
193 std::vector<uint64_t> tmp1, tmp2;
194 for (uint64_t i = 0; i < len; i++)
195 {
196 tmp1.push_back(this->items[i]);
197 }
198 for (uint64_t i = len; i < this->items.size(); i++)
199 {
200 tmp2.push_back(this->items[i]);
201 }
202 this->items.swap(tmp2);
203 return tmp1;
204 }
205 std::vector<uint64_t> pop_back(uint64_t len)
206 {
207
208 std::vector<uint64_t> tmp1;
209 tmp1.resize(len);
210 int64_t k = len - 1;
211 while (k >= 0)
212 {
213 assert(this->items.size() > 0);
214 tmp1[k--] = this->items[this->items.size() - 1];
215 this->items.pop_back();
216 }
217 return tmp1;
218 }
219
220 uint64_t reverse_psum(uint64_t i) const
221 {
222 size_t len = i + 1;
223 uint64_t sum = 0;
224 size_t size = this->items.size();
225 for (size_t x = 0; x < len; x++)
226 {
227 sum += this->items[size - 1 - x];
228 }
229 return sum;
230 }
231
232 uint64_t psum(uint64_t i, uint64_t j) const
233 {
234 if (i == j)
235 {
236 return this->at(i);
237 }
238 else
239 {
240 throw std::runtime_error("No implementation");
241 }
242 }
243
244 void increment(uint64_t i, int64_t delta)
245 {
246 this->items[i] += delta;
247 }
248
249 std::vector<uint64_t>::const_iterator begin() const {
250 return this->items.begin();
251 }
252
253 std::vector<uint64_t>::const_iterator end() const {
254 return this->items.end();
255 }
256
257 int64_t one_based_rank(uint64_t i, uint64_t c) const {
258 return stool::StringFunctions::one_based_rank_query(this->items, i, c);
259 }
260 int64_t one_based_rank0(uint64_t i) const {
261 return this->one_based_rank(0, i);
262 }
263 int64_t one_based_rank1(uint64_t i) const {
264 return this->one_based_rank(1, i);
265 }
266
267 int64_t select(uint64_t i, uint64_t c) const {
268 return stool::StringFunctions::select_query(this->items, i, c);
269 }
270 int64_t select0(uint64_t i) const {
271 return this->select(0, i);
272 }
273 int64_t select1(uint64_t i) const {
274 return this->select(1, i);
275 }
276 void sort_leaf_containers()
277 {
278 }
279 void verify() const{
280
281 }
282
283
284
285 };
286 }
287
288}
A container stored in the BPTree of SPSI. The values of this container are stored in a vector....
Definition plain_spsi_container.hpp:13