DUNE-FEM (unstable)

reservedvector.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
5#ifndef DUNE_COMMON_RESERVEDVECTOR_HH
6#define DUNE_COMMON_RESERVEDVECTOR_HH
7
12#include <algorithm>
13#include <array>
14#include <cassert>
15#include <iostream>
16#include <iterator>
17#include <cstddef>
18#include <initializer_list>
19
20#include <dune/common/hash.hh>
21#include <dune/common/std/algorithm.hh>
23
24#ifdef CHECK_RESERVEDVECTOR
25#define CHECKSIZE(X) assert(X)
26#else
27#define CHECKSIZE(X) {}
28#endif
29
30namespace Dune
31{
47 template<class T, int n>
49 {
50 using storage_type = std::array<T,n>;
51
52 public:
53
57 typedef typename storage_type::value_type value_type;
59 typedef typename storage_type::pointer pointer;
61 typedef typename storage_type::const_pointer const_pointer;
63 typedef typename storage_type::reference reference;
65 typedef typename storage_type::const_reference const_reference;
67 typedef typename storage_type::size_type size_type;
69 typedef typename storage_type::difference_type difference_type;
71 typedef typename storage_type::iterator iterator;
73 typedef typename storage_type::const_iterator const_iterator;
75 typedef std::reverse_iterator<iterator> reverse_iterator;
77 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
78
84 constexpr ReservedVector()
85 noexcept(std::is_nothrow_default_constructible_v<value_type>)
86 : storage_()
87 , size_(0)
88 {}
89
91 explicit constexpr ReservedVector(size_type count)
92 noexcept(std::is_nothrow_default_constructible_v<value_type>)
93 : storage_()
94 , size_(count)
95 {
96 assert(count <= n);
97 }
98
100 constexpr ReservedVector(size_type count, const value_type& value)
101 noexcept(std::is_nothrow_copy_assignable_v<value_type> &&
102 noexcept(ReservedVector(count)))
103 : ReservedVector(count)
104 {
105 for (size_type i=0; i<count; ++i)
106 storage_[i] = value;
107 }
108
110 template<class InputIt,
111 std::enable_if_t<std::is_convertible_v<typename std::iterator_traits<InputIt>::value_type, value_type>, int> = 0>
112 constexpr ReservedVector(InputIt first, InputIt last)
113 noexcept(std::is_nothrow_copy_assignable_v<value_type> &&
114 noexcept(ReservedVector()))
116 {
117 for (size_type i=0; i<n && first!=last; ++i,++size_)
118 storage_[i] = *first++;
119 assert(first == last);
120 }
121
123 constexpr ReservedVector(std::initializer_list<value_type> const& l)
124 noexcept(std::is_nothrow_copy_assignable_v<value_type> &&
125 noexcept(ReservedVector(l.begin(),l.end())))
126 : ReservedVector(l.begin(),l.end())
127 {}
128
134 constexpr bool operator== (const ReservedVector& that) const noexcept
135 {
136 if (size() != that.size())
137 return false;
138 for (size_type i=0; i<size(); ++i)
139 if (!(storage_[i]==that.storage_[i]))
140 return false;
141 return true;
142 }
143
145 constexpr auto operator<=> (const ReservedVector& that) const noexcept
146 {
147 return Std::lexicographical_compare_three_way(begin(), end(), that.begin(), that.end());
148 }
149
155 constexpr void clear() noexcept
156 {
157 size_ = 0;
158 }
159
161 constexpr void resize(size_type s) noexcept
162 {
163 CHECKSIZE(s<=n);
164 size_ = s;
165 }
166
168 constexpr iterator insert(const_iterator pos, const T& value)
169 {
170 CHECKSIZE(size_<n);
171 iterator it = begin() + std::distance(cbegin(), pos);
172 std::move_backward(it, end(), end()+1);
173 *it = value;
174 ++size_;
175 return it;
176 }
177
179 constexpr iterator insert(const_iterator pos, T&& value)
180 {
181 CHECKSIZE(size_<n);
182 iterator it = begin() + std::distance(cbegin(), pos);
183 std::move_backward(it, end(), end()+1);
184 *it = std::move(value);
185 ++size_;
186 return it;
187 }
188
190 constexpr iterator insert(const_iterator pos, size_type count, const T& value)
191 {
192 CHECKSIZE(size_+count<=n);
193 iterator it = begin() + std::distance(cbegin(), pos);
194 std::move_backward(it, end(), end()+count);
195 std::fill(it, it+count, value);
196 size_+=count;
197 return it;
198 }
199
201 template <std::forward_iterator InputIt>
202 constexpr iterator insert(const_iterator pos, InputIt first, InputIt last)
203 {
204 size_type count = std::distance(first,last);
205 CHECKSIZE(size_+count<=n);
206 iterator it = begin() + std::distance(cbegin(), pos);
207 std::move_backward(it, end(), end()+count);
208 std::copy(first, last, it);
209 size_+=count;
210 return it;
211 }
212
214 constexpr iterator insert(const_iterator pos, std::initializer_list<T> ilist)
215 {
216 return insert(pos, ilist.begin(), ilist.end());
217 }
218
220 constexpr void push_back(const value_type& t)
221 noexcept(std::is_nothrow_copy_assignable_v<value_type>)
222 {
223 CHECKSIZE(size_<n);
224 storage_[size_++] = t;
225 }
226
228 constexpr void push_back(value_type&& t)
229 noexcept(std::is_nothrow_move_assignable_v<value_type>)
230 {
231 CHECKSIZE(size_<n);
232 storage_[size_++] = std::move(t);
233 }
234
236 template<class... Args>
237 reference emplace_back(Args&&... args)
238 noexcept(std::is_nothrow_constructible_v<value_type,decltype(args)...>)
239 {
240 CHECKSIZE(size_<n);
241 value_type* p = &storage_[size_++];
242 // first destroy any previously (default) constructed element at that location
243 p->~value_type();
244 // construct the value_type in place
245 // NOTE: This is not an integral constant expression.
246 // With c++20 we could use std::construct_at
247 ::new (const_cast<void*>(static_cast<const volatile void*>(p)))
248 value_type(std::forward<Args>(args)...);
249 return *p;
250 }
251
253 constexpr void pop_back() noexcept
254 {
255 if (! empty()) size_--;
256 }
257
263 constexpr iterator begin() noexcept
264 {
265 return storage_.begin();
266 }
267
269 constexpr const_iterator begin() const noexcept
270 {
271 return storage_.begin();
272 }
273
275 constexpr const_iterator cbegin() const noexcept
276 {
277 return storage_.cbegin();
278 }
279
281 constexpr reverse_iterator rbegin() noexcept
282 {
283 return reverse_iterator{begin()+size()};
284 }
285
287 constexpr const_reverse_iterator rbegin() const noexcept
288 {
290 }
291
293 constexpr const_reverse_iterator crbegin() const noexcept
294 {
296 }
297
299 constexpr iterator end() noexcept
300 {
301 return storage_.begin()+size();
302 }
303
305 constexpr const_iterator end() const noexcept
306 {
307 return storage_.begin()+size();
308 }
309
311 constexpr const_iterator cend() const noexcept
312 {
313 return storage_.cbegin()+size();
314 }
315
317 constexpr reverse_iterator rend() noexcept
318 {
319 return reverse_iterator{begin()};
320 }
321
323 constexpr const_reverse_iterator rend() const noexcept
324 {
326 }
327
329 constexpr const_reverse_iterator crend() const noexcept
330 {
332 }
333
339 constexpr reference at(size_type i)
340 {
341 if (!(i < size()))
342 throw std::out_of_range("Index out of range");
343 return storage_[i];
344 }
345
347 constexpr const_reference at(size_type i) const
348 {
349 if (!(i < size()))
350 throw std::out_of_range("Index out of range");
351 return storage_[i];
352 }
353
355 constexpr reference operator[] (size_type i) noexcept
356 {
357 CHECKSIZE(size_>i);
358 return storage_[i];
359 }
360
362 constexpr const_reference operator[] (size_type i) const noexcept
363 {
364 CHECKSIZE(size_>i);
365 return storage_[i];
366 }
367
369 constexpr reference front() noexcept
370 {
371 CHECKSIZE(size_>0);
372 return storage_[0];
373 }
374
376 constexpr const_reference front() const noexcept
377 {
378 CHECKSIZE(size_>0);
379 return storage_[0];
380 }
381
383 constexpr reference back() noexcept
384 {
385 CHECKSIZE(size_>0);
386 return storage_[size_-1];
387 }
388
390 constexpr const_reference back() const noexcept
391 {
392 CHECKSIZE(size_>0);
393 return storage_[size_-1];
394 }
395
397 constexpr pointer data() noexcept
398 {
399 return storage_.data();
400 }
401
403 constexpr const_pointer data() const noexcept
404 {
405 return storage_.data();
406 }
407
413 constexpr size_type size() const noexcept
414 {
415 return size_;
416 }
417
419 constexpr bool empty() const noexcept
420 {
421 return size_==0;
422 }
423
425 static constexpr size_type capacity() noexcept
426 {
427 return n;
428 }
429
431 static constexpr size_type max_size() noexcept
432 {
433 return n;
434 }
435
441 constexpr void fill(const value_type& value)
442 noexcept(std::is_nothrow_copy_assignable_v<value_type>)
443 {
444 for (size_type i=0; i<size(); ++i)
445 storage_[i] = value;
446 }
447
449 void swap(ReservedVector& other)
450 noexcept(std::is_nothrow_swappable_v<value_type>)
451 {
452 using std::swap;
453 swap(storage_, other.storage_);
454 swap(size_, other.size_);
455 }
456
460 friend std::ostream& operator<< (std::ostream& s, const ReservedVector& v)
461 {
462 for (size_type i=0; i<v.size(); i++)
463 s << v[i] << " ";
464 return s;
465 }
466
467 inline friend std::size_t hash_value(const ReservedVector& v) noexcept
468 {
469 return hash_range(v.storage_.data(),v.storage_.data()+v.size_);
470 }
471
472 private:
473 storage_type storage_;
474 size_type size_;
475 };
476
477}
478
480
481#undef CHECKSIZE
482
483#endif // DUNE_COMMON_RESERVEDVECTOR_HH
A Vector class with statically reserved memory.
Definition: reservedvector.hh:49
constexpr const_reference front() const noexcept
Returns const reference to first element of vector.
Definition: reservedvector.hh:376
constexpr const_reverse_iterator crend() const noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition: reservedvector.hh:329
constexpr ReservedVector(size_type count) noexcept(std::is_nothrow_default_constructible_v< value_type >)
Constructs the vector with count elements that will be default-initialized.
Definition: reservedvector.hh:91
constexpr void fill(const value_type &value) noexcept(std::is_nothrow_copy_assignable_v< value_type >)
Fill the container with the value.
Definition: reservedvector.hh:441
storage_type::pointer pointer
Pointer to T.
Definition: reservedvector.hh:59
constexpr reverse_iterator rbegin() noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition: reservedvector.hh:281
constexpr iterator insert(const_iterator pos, InputIt first, InputIt last)
Inserts elements from range [first, last) before pos.
Definition: reservedvector.hh:202
constexpr const_reverse_iterator rend() const noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition: reservedvector.hh:323
static constexpr size_type max_size() noexcept
Returns the maximum length of the vector.
Definition: reservedvector.hh:431
constexpr const_reference at(size_type i) const
Returns a const reference to the i'th element.
Definition: reservedvector.hh:347
std::reverse_iterator< iterator > reverse_iterator
Reverse iterator.
Definition: reservedvector.hh:75
constexpr iterator end() noexcept
Returns an iterator pointing to the end of the vector.
Definition: reservedvector.hh:299
constexpr size_type size() const noexcept
Returns number of elements in the vector.
Definition: reservedvector.hh:413
constexpr bool empty() const noexcept
Returns true if vector has no elements.
Definition: reservedvector.hh:419
constexpr iterator begin() noexcept
Returns a iterator pointing to the beginning of the vector.
Definition: reservedvector.hh:263
constexpr void push_back(const value_type &t) noexcept(std::is_nothrow_copy_assignable_v< value_type >)
Appends an element to the end of a vector, up to the maximum size n, O(1) time.
Definition: reservedvector.hh:220
constexpr reverse_iterator rend() noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition: reservedvector.hh:317
storage_type::iterator iterator
Iterator used to iterate through a vector.
Definition: reservedvector.hh:71
constexpr const_iterator cbegin() const noexcept
Returns a const_iterator pointing to the beginning of the vector.
Definition: reservedvector.hh:275
std::reverse_iterator< const_iterator > const_reverse_iterator
Const reverse iterator.
Definition: reservedvector.hh:77
constexpr pointer data() noexcept
Returns pointer to the underlying memory.
Definition: reservedvector.hh:397
constexpr const_reference back() const noexcept
Returns const reference to last element of vector.
Definition: reservedvector.hh:390
friend std::ostream & operator<<(std::ostream &s, const ReservedVector &v)
Send ReservedVector to an output stream.
Definition: reservedvector.hh:460
constexpr bool operator==(const ReservedVector &that) const noexcept
Compares the values in the vector this with that for equality.
Definition: reservedvector.hh:134
constexpr void pop_back() noexcept
Erases the last element of the vector, O(1) time.
Definition: reservedvector.hh:253
storage_type::difference_type difference_type
A signed integral type.
Definition: reservedvector.hh:69
constexpr const_iterator end() const noexcept
Returns a const_iterator pointing to the end of the vector.
Definition: reservedvector.hh:305
constexpr void clear() noexcept
Erases all elements.
Definition: reservedvector.hh:155
constexpr ReservedVector() noexcept(std::is_nothrow_default_constructible_v< value_type >)
Constructs an empty vector.
Definition: reservedvector.hh:84
storage_type::const_iterator const_iterator
Const iterator used to iterate through a vector.
Definition: reservedvector.hh:73
constexpr iterator insert(const_iterator pos, const T &value)
Inserts a copy of value before pos.
Definition: reservedvector.hh:168
reference emplace_back(Args &&... args) noexcept(std::is_nothrow_constructible_v< value_type, decltype(args)... >)
Appends an element to the end of a vector by constructing it in place.
Definition: reservedvector.hh:237
storage_type::size_type size_type
An unsigned integral type.
Definition: reservedvector.hh:67
storage_type::const_reference const_reference
Const reference to T.
Definition: reservedvector.hh:65
void swap(ReservedVector &other) noexcept(std::is_nothrow_swappable_v< value_type >)
Swap the content with another vector.
Definition: reservedvector.hh:449
constexpr ReservedVector(InputIt first, InputIt last) noexcept(std::is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector()))
Constructs the vector from an iterator range [first,last)
Definition: reservedvector.hh:112
constexpr const_pointer data() const noexcept
Returns const pointer to the underlying memory.
Definition: reservedvector.hh:403
constexpr reference at(size_type i)
Returns reference to the i'th element.
Definition: reservedvector.hh:339
constexpr iterator insert(const_iterator pos, T &&value)
Inserts value before pos, possibly using move semantics.
Definition: reservedvector.hh:179
constexpr const_iterator cend() const noexcept
Returns a const_iterator pointing to the end of the vector.
Definition: reservedvector.hh:311
constexpr auto operator<=>(const ReservedVector &that) const noexcept
Lexicographically compares the values in the vector this with that
Definition: reservedvector.hh:145
constexpr reference back() noexcept
Returns reference to last element of vector.
Definition: reservedvector.hh:383
constexpr const_reverse_iterator rbegin() const noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition: reservedvector.hh:287
storage_type::value_type value_type
The type of object, T, stored in the vector.
Definition: reservedvector.hh:57
constexpr const_iterator begin() const noexcept
Returns a const_iterator pointing to the beginning of the vector.
Definition: reservedvector.hh:269
constexpr ReservedVector(size_type count, const value_type &value) noexcept(std::is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector(count)))
Constructs the vector with count copies of elements with value value.
Definition: reservedvector.hh:100
constexpr reference operator[](size_type i) noexcept
Returns reference to the i'th element.
Definition: reservedvector.hh:355
constexpr reference front() noexcept
Returns reference to first element of vector.
Definition: reservedvector.hh:369
constexpr iterator insert(const_iterator pos, std::initializer_list< T > ilist)
Inserts elements from initializer list ilist before pos.
Definition: reservedvector.hh:214
storage_type::const_pointer const_pointer
Const pointer to T.
Definition: reservedvector.hh:61
constexpr ReservedVector(std::initializer_list< value_type > const &l) noexcept(std::is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector(l.begin(), l.end())))
Constructs the vector from an initializer list.
Definition: reservedvector.hh:123
constexpr void resize(size_type s) noexcept
Specifies a new size for the vector.
Definition: reservedvector.hh:161
static constexpr size_type capacity() noexcept
Returns current capacity (allocated memory) of the vector.
Definition: reservedvector.hh:425
storage_type::reference reference
Reference to T.
Definition: reservedvector.hh:63
constexpr const_reverse_iterator crbegin() const noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition: reservedvector.hh:293
constexpr void push_back(value_type &&t) noexcept(std::is_nothrow_move_assignable_v< value_type >)
Appends an element to the end of a vector by moving the value, up to the maximum size n,...
Definition: reservedvector.hh:228
constexpr iterator insert(const_iterator pos, size_type count, const T &value)
Inserts count copies of the value before pos.
Definition: reservedvector.hh:190
This file provides some concepts introduced in the C++20 standard library <compare> and <concepts> no...
Support for calculating hash values of objects.
#define DUNE_DEFINE_HASH(template_args, type)
Defines the required struct specialization to make type hashable via Dune::hash.
Definition: hash.hh:100
#define DUNE_HASH_TYPE(...)
Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.
Definition: hash.hh:117
#define DUNE_HASH_TEMPLATE_ARGS(...)
Wrapper macro for the template arguments in DUNE_DEFINE_HASH.
Definition: hash.hh:109
constexpr auto lexicographical_compare_three_way(I1 f1, I1 l1, I2 f2, I2 l2, Cmp comp={}) -> decltype(comp(*f1, *f2))
Lexicographically compares two ranges [first1, last1) and [first2, last2) using three-way comparison ...
Definition: algorithm.hh:37
Dune namespace
Definition: alignedallocator.hh:13
std::size_t hash_range(It first, It last)
Hashes all elements in the range [first,last) and returns the combined hash.
Definition: hash.hh:322
STL namespace.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Feb 16, 23:40, 2026)