10#include "vecmem/utils/memmove.hpp"
17template <
typename TYPE, std::
size_t MAX_SIZE>
19 : m_size(0), m_elements() {}
21template <
typename TYPE, std::
size_t MAX_SIZE>
24 : m_size(size), m_elements() {
29template <
typename TYPE, std::
size_t MAX_SIZE>
37 return *(
reinterpret_cast<pointer>(m_elements) +
pos);
40template <
typename TYPE, std::
size_t MAX_SIZE>
51template <
typename TYPE, std::
size_t MAX_SIZE>
56 return *(
reinterpret_cast<pointer>(m_elements) +
pos);
59template <
typename TYPE, std::
size_t MAX_SIZE>
67template <
typename TYPE, std::
size_t MAX_SIZE>
75 return *(
reinterpret_cast<pointer>(m_elements));
78template <
typename TYPE, std::
size_t MAX_SIZE>
89template <
typename TYPE, std::
size_t MAX_SIZE>
96 return *(
reinterpret_cast<pointer>(m_elements) + m_size - 1);
99template <
typename TYPE, std::
size_t MAX_SIZE>
107 return *(
reinterpret_cast<const_pointer>(m_elements) + m_size - 1);
110template <
typename TYPE, std::
size_t MAX_SIZE>
113 return reinterpret_cast<pointer>(m_elements);
116template <
typename TYPE, std::
size_t MAX_SIZE>
123template <
typename TYPE, std::
size_t MAX_SIZE>
128 assert(array_max_size >= count);
142template <
typename TYPE, std::
size_t MAX_SIZE>
147 assert(m_size < array_max_size);
150 auto id = element_id(
pos);
154 static_cast<const void*
>(
id.m_ptr),
155 (m_size -
id.m_index) * value_size);
158 construct(
id.m_index, value);
167template <
typename TYPE, std::
size_t MAX_SIZE>
172 assert(m_size + count <= array_max_size);
175 auto id = element_id(
pos);
179 static_cast<const void*
>(
id.m_ptr),
180 (m_size -
id.m_index) * value_size);
184 construct(
id.m_index +
i, value);
194template <
typename TYPE, std::
size_t MAX_SIZE>
195template <
typename...
Args>
200 assert(m_size < array_max_size);
203 auto id = element_id(
pos);
207 static_cast<const void*
>(
id.m_ptr),
208 (m_size -
id.m_index) * value_size);
211 new (
id.m_ptr) value_type(std::forward<Args>(
args)...);
220template <
typename TYPE, std::
size_t MAX_SIZE>
221template <
typename... Args>
223 Args&&... args) -> reference {
225 return *(emplace(end(), std::forward<Args>(args)...));
228template <
typename TYPE, std::
size_t MAX_SIZE>
232 insert(end(), value);
235template <
typename TYPE, std::
size_t MAX_SIZE>
240 auto id = element_id(
pos);
244 static_cast<const void*
>(
id.m_ptr + 1),
245 (m_size -
id.m_index - 1) * value_size);
254template <
typename TYPE, std::
size_t MAX_SIZE>
265 static_cast<const void*
>(
last_id.m_ptr),
266 (m_size -
last_id.m_index) * value_size);
275template <
typename TYPE, std::
size_t MAX_SIZE>
281template <
typename TYPE, std::
size_t MAX_SIZE>
287template <
typename TYPE, std::
size_t MAX_SIZE>
294template <
typename TYPE, std::
size_t MAX_SIZE>
313 insert(end(),
new_size - m_size, value);
317template <
typename TYPE, std::
size_t MAX_SIZE>
320 return reinterpret_cast<iterator>(m_elements);
323template <
typename TYPE, std::
size_t MAX_SIZE>
330template <
typename TYPE, std::
size_t MAX_SIZE>
337template <
typename TYPE, std::
size_t MAX_SIZE>
340 return (
reinterpret_cast<iterator>(m_elements) + m_size);
343template <
typename TYPE, std::
size_t MAX_SIZE>
350template <
typename TYPE, std::
size_t MAX_SIZE>
357template <
typename TYPE, std::
size_t MAX_SIZE>
364template <
typename TYPE, std::
size_t MAX_SIZE>
371template <
typename TYPE, std::
size_t MAX_SIZE>
378template <
typename TYPE, std::
size_t MAX_SIZE>
385template <
typename TYPE, std::
size_t MAX_SIZE>
392template <
typename TYPE, std::
size_t MAX_SIZE>
399template <
typename TYPE, std::
size_t MAX_SIZE>
405template <
typename TYPE, std::
size_t MAX_SIZE>
412template <
typename TYPE, std::
size_t MAX_SIZE>
416 return array_max_size;
419template <
typename TYPE, std::
size_t MAX_SIZE>
423 return array_max_size;
426template <
typename TYPE, std::
size_t MAX_SIZE>
435template <
typename TYPE, std::
size_t MAX_SIZE>
437 size_type
pos, const_reference value) {
443 pointer ptr =
reinterpret_cast<pointer
>(m_elements) +
pos;
444 new (ptr) value_type(value);
447template <
typename TYPE, std::
size_t MAX_SIZE>
448VECMEM_HOST_AND_DEVICE
typename static_vector<TYPE, MAX_SIZE>::ElementId
449static_vector<TYPE, MAX_SIZE>::element_id(const_iterator pos) {
451 size_type
const index =
static_cast<size_type
>(pos - begin());
452 assert(index <= m_size);
453 pointer
const ptr =
reinterpret_cast<pointer
>(m_elements) + index;
An allocator class that wraps a memory resource.
Definition allocator.hpp:37
Type mimicking std::reverse_iterator.
Definition reverse_iterator.hpp:25
Class mimicking std::vector on top of a fixed sized array.
Definition static_vector.hpp:30
VECMEM_HOST_AND_DEVICE size_type capacity() const
Return the current (fixed) capacity of the vector.
Definition static_vector.ipp:420
VECMEM_HOST_AND_DEVICE void assign(size_type count, const_reference value)
Assign new values to the vector.
Definition static_vector.ipp:124
VECMEM_HOST_AND_DEVICE const_iterator cend() const
Return a constant forward iterator pointing at the end of the vector.
Definition static_vector.ipp:351
std::add_lvalue_reference_t< value_type > reference
Value reference type.
Definition static_vector.hpp:67
VECMEM_HOST_AND_DEVICE reference at(size_type pos)
Return a specific element of the vector in a "safe way" (non-const)
Definition static_vector.ipp:31
VECMEM_HOST_AND_DEVICE void resize(std::size_t new_size)
Resize the vector.
Definition static_vector.ipp:288
VECMEM_HOST_AND_DEVICE bool empty() const
Check whether the vector is empty.
Definition static_vector.ipp:400
std::size_t size_type
Size type for the array.
Definition static_vector.hpp:53
std::add_pointer_t< value_type > pointer
Value pointer type.
Definition static_vector.hpp:72
VECMEM_HOST_AND_DEVICE size_type size() const
Return the number of elements in the vector.
Definition static_vector.ipp:406
VECMEM_HOST_AND_DEVICE iterator erase(const_iterator pos)
Remove one element from the vector.
Definition static_vector.ipp:236
VECMEM_HOST_AND_DEVICE static_vector()
Default constructor.
Definition static_vector.ipp:18
VECMEM_HOST_AND_DEVICE iterator begin()
Return a forward iterator pointing at the beginning of the vector.
Definition static_vector.ipp:318
VECMEM_HOST_AND_DEVICE reference operator[](size_type pos)
Return a specific element of the vector (non-const)
Definition static_vector.ipp:52
VECMEM_HOST_AND_DEVICE void clear()
Clear the vector.
Definition static_vector.ipp:282
VECMEM_HOST_AND_DEVICE const_reverse_iterator crend() const
Return a constant reverse iterator pointing at the beginning of the vector.
Definition static_vector.ipp:393
VECMEM_HOST_AND_DEVICE pointer data()
Access the underlying memory array (non-const)
Definition static_vector.ipp:111
VECMEM_HOST_AND_DEVICE reference emplace_back(Args &&... args)
Add a new element at the end of the vector.
VECMEM_HOST_AND_DEVICE void push_back(const_reference value)
Add a new element at the end of the vector.
Definition static_vector.ipp:229
VECMEM_HOST_AND_DEVICE iterator emplace(const_iterator pos, Args &&... args)
Insert a new element into the vector.
VECMEM_HOST_AND_DEVICE iterator end()
Return a forward iterator pointing at the end of the vector.
Definition static_vector.ipp:338
std::add_lvalue_reference_t< std::add_const_t< value_type > > const_reference
Constant value reference type.
Definition static_vector.hpp:70
VECMEM_HOST_AND_DEVICE const_reverse_iterator crbegin() const
Return a constant reverse iterator pointing at the end of the vector.
Definition static_vector.ipp:372
VECMEM_HOST_AND_DEVICE reference back()
Return the last element of the vector (non-const)
Definition static_vector.ipp:90
VECMEM_HOST_AND_DEVICE reverse_iterator rend()
Return a reverse iterator pointing at the beginning of the vector.
Definition static_vector.ipp:379
pointer iterator
Forward iterator type.
Definition static_vector.hpp:77
VECMEM_HOST_AND_DEVICE void reserve(size_type new_cap)
Reserve additional storage for the vector.
Definition static_vector.ipp:427
VECMEM_HOST_AND_DEVICE const_iterator cbegin() const
Return a constant forward iterator pointing at the beginning of the vector.
Definition static_vector.ipp:331
const_pointer const_iterator
Constant forward iterator type.
Definition static_vector.hpp:79
VECMEM_HOST_AND_DEVICE iterator insert(const_iterator pos, const_reference value)
Insert a new element into the vector.
Definition static_vector.ipp:143
VECMEM_HOST_AND_DEVICE reverse_iterator rbegin()
Return a reverse iterator pointing at the end of the vector.
Definition static_vector.ipp:358
VECMEM_HOST_AND_DEVICE size_type max_size() const
Return the maximum (fixed) number of elements in the vector.
Definition static_vector.ipp:413
std::add_pointer_t< std::add_const_t< value_type > > const_pointer
Constant value pointer type.
Definition static_vector.hpp:74
VECMEM_HOST_AND_DEVICE reference front()
Return the first element of the vector (non-const)
Definition static_vector.ipp:68
VECMEM_HOST_AND_DEVICE void pop_back()
Remove the last element of the vector.
Definition static_vector.ipp:276
VECMEM_HOST_AND_DEVICE void memmove(void *dest, const void *src, std::size_t bytes)
Hand-written implementation of a memmove function.
Definition memmove.ipp:13
Main namespace for the vecmem classes/functions.
Definition atomic_ref.hpp:16