mdds
Loading...
Searching...
No Matches
delayed_delete_vector.hpp
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*************************************************************************
3 *
4 * Copyright (c) 2025 Kohei Yoshida
5 *
6 * Permission is hereby granted, free of charge, to any person
7 * obtaining a copy of this software and associated documentation
8 * files (the "Software"), to deal in the Software without
9 * restriction, including without limitation the rights to use,
10 * copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following
13 * conditions:
14 *
15 * The above copyright notice and this permission notice shall be
16 * included in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25 * OTHER DEALINGS IN THE SOFTWARE.
26 *
27 ************************************************************************/
28
29#pragma once
30
31#include <vector>
32#include <algorithm>
33#include <type_traits>
34
35namespace mdds { namespace mtv {
36
42template<typename T, typename Allocator = std::allocator<T>>
44{
45 typedef std::vector<T, Allocator> store_type;
46 store_type m_vec;
47 size_t m_front_offset = 0; // number of elements removed from front of array
48public:
49 typedef typename store_type::value_type value_type;
50 typedef typename store_type::size_type size_type;
51 typedef typename store_type::difference_type difference_type;
52 typedef typename store_type::reference reference;
53 typedef typename store_type::const_reference const_reference;
54 typedef typename store_type::pointer pointer;
55 typedef typename store_type::const_pointer const_pointer;
56 typedef typename store_type::iterator iterator;
57 typedef typename store_type::reverse_iterator reverse_iterator;
58 typedef typename store_type::const_iterator const_iterator;
59 typedef typename store_type::const_reverse_iterator const_reverse_iterator;
60
61 delayed_delete_vector() : m_vec()
62 {}
63
64 delayed_delete_vector(size_t n, const T& val) : m_vec(n, val)
65 {}
66
67 delayed_delete_vector(size_t n) : m_vec(n)
68 {}
69
70 template<typename InputIt>
71 delayed_delete_vector(InputIt first, InputIt last) : m_vec(first, last)
72 {}
73
74 iterator begin() noexcept
75 {
76 return m_vec.begin() + m_front_offset;
77 }
78
79 iterator end() noexcept
80 {
81 return m_vec.end();
82 }
83
84 const_iterator begin() const noexcept
85 {
86 return m_vec.begin() + m_front_offset;
87 }
88
89 const_iterator end() const noexcept
90 {
91 return m_vec.end();
92 }
93
94 reverse_iterator rbegin() noexcept
95 {
96 return m_vec.rbegin();
97 }
98
99 const_reverse_iterator rbegin() const noexcept
100 {
101 return m_vec.rbegin();
102 }
103
104 reverse_iterator rend() noexcept
105 {
106 return m_vec.rend() - m_front_offset;
107 }
108
109 const_reverse_iterator rend() const noexcept
110 {
111 return m_vec.rend() - m_front_offset;
112 }
113
114 reference operator[](size_type pos)
115 {
116 return m_vec[pos + m_front_offset];
117 }
118
119 const_reference operator[](size_type pos) const
120 {
121 return m_vec[pos + m_front_offset];
122 }
123
124 reference at(size_type pos)
125 {
126 return m_vec.at(pos + m_front_offset);
127 }
128
129 const_reference at(size_type pos) const
130 {
131 return m_vec.at(pos + m_front_offset);
132 }
133
134 void push_back(const T& value)
135 {
136 m_vec.push_back(value);
137 }
138
139 void push_back(T&& value)
140 {
141 m_vec.push_back(std::move(value));
142 }
143
144 template<typename... Args>
145 void emplace_back(Args&&... args)
146 {
147 m_vec.emplace_back(std::forward<Args>(args)...);
148 }
149
150 iterator insert(iterator pos, const T& value)
151 {
152 return m_vec.insert(pos, value);
153 }
154
155 iterator insert(const_iterator pos, T&& value)
156 {
157 return m_vec.insert(pos, std::move(value));
158 }
159
160 template<typename InputIt>
161 void insert(iterator pos, InputIt first, InputIt last)
162 {
163 m_vec.insert(pos, first, last);
164 }
165
166 void resize(size_type count)
167 {
168 clear_removed();
169 m_vec.resize(count);
170 }
171
172 iterator erase(iterator pos)
173 {
174 if (pos == m_vec.begin() + m_front_offset)
175 {
176 ++m_front_offset;
177 return m_vec.begin() + m_front_offset;
178 }
179 else
180 return m_vec.erase(pos);
181 }
182
183 iterator erase(iterator first, iterator last)
184 {
185 return m_vec.erase(first, last);
186 }
187
188 size_type capacity() const noexcept
189 {
190 return m_vec.capacity();
191 }
192
193 void shrink_to_fit()
194 {
195 clear_removed();
196 m_vec.shrink_to_fit();
197 }
198
199 void reserve(size_type new_cap)
200 {
201 clear_removed();
202 m_vec.reserve(new_cap);
203 }
204
205 size_type size() const
206 {
207 return m_vec.size() - m_front_offset;
208 }
209
210 template<typename InputIt>
211 void assign(InputIt first, InputIt last)
212 {
213 clear_removed();
214 m_vec.assign(first, last);
215 }
216
217 T* data()
218 {
219 return m_vec.data() + m_front_offset;
220 }
221
222 const T* data() const
223 {
224 return m_vec.data() + m_front_offset;
225 }
226
227private:
228 void clear_removed()
229 {
230 m_vec.erase(m_vec.begin(), m_vec.begin() + m_front_offset);
231 m_front_offset = 0;
232 }
233};
234
235template<typename T>
236bool operator==(const delayed_delete_vector<T>& lhs, const delayed_delete_vector<T>& rhs)
237{
238 return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
239}
240
241namespace detail {
242
243template<>
244struct is_std_vector_bool_store<delayed_delete_vector<bool>>
245{
246 using type = std::true_type;
247};
248
249} // namespace detail
250
251}} // namespace mdds::mtv
252
253/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Definition delayed_delete_vector.hpp:44