dune-common  2.11
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>
23 
24 #ifdef CHECK_RESERVEDVECTOR
25 #define CHECKSIZE(X) assert(X)
26 #else
27 #define CHECKSIZE(X) {}
28 #endif
29 
30 namespace Dune
31 {
47  template<class T, int n>
49  {
50  using storage_type = std::array<T,n>;
51 
52  public:
53 
56  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 
83  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()))
115  : 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 
133  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 
154  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 void push_back(const value_type& t)
169  noexcept(std::is_nothrow_copy_assignable_v<value_type>)
170  {
171  CHECKSIZE(size_<n);
172  storage_[size_++] = t;
173  }
174 
176  constexpr void push_back(value_type&& t)
177  noexcept(std::is_nothrow_move_assignable_v<value_type>)
178  {
179  CHECKSIZE(size_<n);
180  storage_[size_++] = std::move(t);
181  }
182 
184  template<class... Args>
185  reference emplace_back(Args&&... args)
186  noexcept(std::is_nothrow_constructible_v<value_type,decltype(args)...>)
187  {
188  CHECKSIZE(size_<n);
189  value_type* p = &storage_[size_++];
190  // first destroy any previously (default) constructed element at that location
191  p->~value_type();
192  // construct the value_type in place
193  // NOTE: This is not an integral constant expression.
194  // With c++20 we could use std::construct_at
195  ::new (const_cast<void*>(static_cast<const volatile void*>(p)))
196  value_type(std::forward<Args>(args)...);
197  return *p;
198  }
199 
201  constexpr void pop_back() noexcept
202  {
203  if (! empty()) size_--;
204  }
205 
210  constexpr iterator begin() noexcept
212  {
213  return storage_.begin();
214  }
215 
217  constexpr const_iterator begin() const noexcept
218  {
219  return storage_.begin();
220  }
221 
223  constexpr const_iterator cbegin() const noexcept
224  {
225  return storage_.cbegin();
226  }
227 
229  constexpr reverse_iterator rbegin() noexcept
230  {
231  return reverse_iterator{begin()+size()};
232  }
233 
235  constexpr const_reverse_iterator rbegin() const noexcept
236  {
237  return const_reverse_iterator{begin()+size()};
238  }
239 
241  constexpr const_reverse_iterator crbegin() const noexcept
242  {
243  return const_reverse_iterator{begin()+size()};
244  }
245 
247  constexpr iterator end() noexcept
248  {
249  return storage_.begin()+size();
250  }
251 
253  constexpr const_iterator end() const noexcept
254  {
255  return storage_.begin()+size();
256  }
257 
259  constexpr const_iterator cend() const noexcept
260  {
261  return storage_.cbegin()+size();
262  }
263 
265  constexpr reverse_iterator rend() noexcept
266  {
267  return reverse_iterator{begin()};
268  }
269 
271  constexpr const_reverse_iterator rend() const noexcept
272  {
273  return const_reverse_iterator{begin()};
274  }
275 
277  constexpr const_reverse_iterator crend() const noexcept
278  {
279  return const_reverse_iterator{begin()};
280  }
281 
286  constexpr reference at(size_type i)
288  {
289  if (!(i < size()))
290  throw std::out_of_range("Index out of range");
291  return storage_[i];
292  }
293 
295  constexpr const_reference at(size_type i) const
296  {
297  if (!(i < size()))
298  throw std::out_of_range("Index out of range");
299  return storage_[i];
300  }
301 
303  constexpr reference operator[] (size_type i) noexcept
304  {
305  CHECKSIZE(size_>i);
306  return storage_[i];
307  }
308 
310  constexpr const_reference operator[] (size_type i) const noexcept
311  {
312  CHECKSIZE(size_>i);
313  return storage_[i];
314  }
315 
317  constexpr reference front() noexcept
318  {
319  CHECKSIZE(size_>0);
320  return storage_[0];
321  }
322 
324  constexpr const_reference front() const noexcept
325  {
326  CHECKSIZE(size_>0);
327  return storage_[0];
328  }
329 
331  constexpr reference back() noexcept
332  {
333  CHECKSIZE(size_>0);
334  return storage_[size_-1];
335  }
336 
338  constexpr const_reference back() const noexcept
339  {
340  CHECKSIZE(size_>0);
341  return storage_[size_-1];
342  }
343 
345  constexpr pointer data() noexcept
346  {
347  return storage_.data();
348  }
349 
351  constexpr const_pointer data() const noexcept
352  {
353  return storage_.data();
354  }
355 
360  constexpr size_type size() const noexcept
362  {
363  return size_;
364  }
365 
367  constexpr bool empty() const noexcept
368  {
369  return size_==0;
370  }
371 
373  static constexpr size_type capacity() noexcept
374  {
375  return n;
376  }
377 
379  static constexpr size_type max_size() noexcept
380  {
381  return n;
382  }
383 
388  constexpr void fill(const value_type& value)
390  noexcept(std::is_nothrow_copy_assignable_v<value_type>)
391  {
392  for (size_type i=0; i<size(); ++i)
393  storage_[i] = value;
394  }
395 
397  void swap(ReservedVector& other)
398  noexcept(std::is_nothrow_swappable_v<value_type>)
399  {
400  using std::swap;
401  swap(storage_, other.storage_);
402  swap(size_, other.size_);
403  }
404 
407  friend std::ostream& operator<< (std::ostream& s, const ReservedVector& v)
409  {
410  for (size_type i=0; i<v.size(); i++)
411  s << v[i] << " ";
412  return s;
413  }
414 
415  inline friend std::size_t hash_value(const ReservedVector& v) noexcept
416  {
417  return hash_range(v.storage_.data(),v.storage_.data()+v.size_);
418  }
419 
420  private:
421  storage_type storage_;
422  size_type size_;
423  };
424 
425 }
426 
428 
429 #undef CHECKSIZE
430 
431 #endif // DUNE_COMMON_RESERVEDVECTOR_HH
constexpr const_iterator cbegin() const noexcept
Returns a const_iterator pointing to the beginning of the vector.
Definition: reservedvector.hh:223
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 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:168
static constexpr size_type max_size() noexcept
Returns the maximum length of the vector.
Definition: reservedvector.hh:379
constexpr void pop_back() noexcept
Erases the last element of the vector, O(1) time.
Definition: reservedvector.hh:201
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 clear() noexcept
Erases all elements.
Definition: reservedvector.hh:155
static constexpr size_type capacity() noexcept
Returns current capacity (allocated memory) of the vector.
Definition: reservedvector.hh:373
constexpr reference at(size_type i)
Returns reference to the i&#39;th element.
Definition: reservedvector.hh:287
This file provides some concepts introduced in the C++20 standard library <compare> and <concepts> no...
constexpr const_pointer data() const noexcept
Returns const pointer to the underlying memory.
Definition: reservedvector.hh:351
constexpr pointer data() noexcept
Returns pointer to the underlying memory.
Definition: reservedvector.hh:345
constexpr const_reference at(size_type i) const
Returns a const reference to the i&#39;th element.
Definition: reservedvector.hh:295
std::reverse_iterator< const_iterator > const_reverse_iterator
Const reverse iterator.
Definition: reservedvector.hh:77
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
storage_type::reference reference
Reference to T.
Definition: reservedvector.hh:63
constexpr const_reference back() const noexcept
Returns const reference to last element of vector.
Definition: reservedvector.hh:338
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 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:176
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
storage_type::pointer pointer
Pointer to T.
Definition: reservedvector.hh:59
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 front() noexcept
Returns reference to first element of vector.
Definition: reservedvector.hh:317
constexpr const_reverse_iterator crbegin() const noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition: reservedvector.hh:241
constexpr reference back() noexcept
Returns reference to last element of vector.
Definition: reservedvector.hh:331
constexpr void resize(size_type s) noexcept
Specifies a new size for the vector.
Definition: reservedvector.hh:161
constexpr const_iterator end() const noexcept
Returns a const_iterator pointing to the end of the vector.
Definition: reservedvector.hh:253
constexpr bool empty() const noexcept
Returns true if vector has no elements.
Definition: reservedvector.hh:367
I i
Definition: hybridmultiindex.hh:328
void swap(ReservedVector &other) noexcept(std::is_nothrow_swappable_v< value_type >)
Swap the content with another vector.
Definition: reservedvector.hh:397
constexpr iterator begin() noexcept
Returns a iterator pointing to the beginning of the vector.
Definition: reservedvector.hh:211
A Vector class with statically reserved memory.
Definition: reservedvector.hh:48
constexpr const_iterator begin() const noexcept
Returns a const_iterator pointing to the beginning of the vector.
Definition: reservedvector.hh:217
Dune namespace
Definition: alignedallocator.hh:12
std::reverse_iterator< iterator > reverse_iterator
Reverse iterator.
Definition: reservedvector.hh:75
constexpr const_reference front() const noexcept
Returns const reference to first element of vector.
Definition: reservedvector.hh:324
storage_type::const_iterator const_iterator
Const iterator used to iterate through a vector.
Definition: reservedvector.hh:73
storage_type::size_type size_type
An unsigned integral type.
Definition: reservedvector.hh:67
storage_type::iterator iterator
Iterator used to iterate through a vector.
Definition: reservedvector.hh:71
constexpr reference operator[](size_type i) noexcept
Returns reference to the i&#39;th element.
Definition: reservedvector.hh:303
Support for calculating hash values of objects.
constexpr const_iterator cend() const noexcept
Returns a const_iterator pointing to the end of the vector.
Definition: reservedvector.hh:259
storage_type::value_type value_type
The type of object, T, stored in the vector.
Definition: reservedvector.hh:57
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:185
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:389
storage_type::const_reference const_reference
Const reference to T.
Definition: reservedvector.hh:65
constexpr const_reverse_iterator rend() const noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition: reservedvector.hh:271
storage_type::difference_type difference_type
A signed integral type.
Definition: reservedvector.hh:69
constexpr reverse_iterator rbegin() noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition: reservedvector.hh:229
constexpr size_type size() const noexcept
Returns number of elements in the vector.
Definition: reservedvector.hh:361
constexpr reverse_iterator rend() noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition: reservedvector.hh:265
friend std::ostream & operator<<(std::ostream &s, const ReservedVector &v)
Send ReservedVector to an output stream.
Definition: reservedvector.hh:408
constexpr const_reverse_iterator rbegin() const noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition: reservedvector.hh:235
#define CHECKSIZE(X)
Definition: reservedvector.hh:27
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
constexpr iterator end() noexcept
Returns an iterator pointing to the end of the vector.
Definition: reservedvector.hh:247
#define DUNE_HASH_TYPE(...)
Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.
Definition: hash.hh:117
void swap(T &v1, T &v2, bool mask)
Definition: simd.hh:472
constexpr const_reverse_iterator crend() const noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition: reservedvector.hh:277
STL namespace.
constexpr ReservedVector() noexcept(std::is_nothrow_default_constructible_v< value_type >)
Constructs an empty vector.
Definition: reservedvector.hh:84
#define DUNE_DEFINE_HASH(template_args, type)
Defines the required struct specialization to make type hashable via Dune::hash.
Definition: hash.hh:100
storage_type::const_pointer const_pointer
Const pointer to T.
Definition: reservedvector.hh:61
friend std::size_t hash_value(const ReservedVector &v) noexcept
Definition: reservedvector.hh:415
#define DUNE_HASH_TEMPLATE_ARGS(...)
Wrapper macro for the template arguments in DUNE_DEFINE_HASH.
Definition: hash.hh:109