1#ifndef AMREX_PODVECTOR_H_
2#define AMREX_PODVECTOR_H_
3#include <AMReX_Config.H>
23 template <
typename T,
typename Size,
template<
class>
class Allocator>
25 Allocator<T>& allocator)
28 return allocator.allocate_in_place(p, nmin, nmax);
30 T* pnew = allocator.allocate(nmax);
35 template <
typename T,
typename Size,
template<
class>
class Allocator>
39 return allocator.shrink_in_place(p, n);
41 return allocator.allocate(n);
45 template <
typename T,
typename Size,
template<
class>
class Allocator>
47 [[maybe_unused]] Allocator<T>
const& allocator)
68 if (allocator.arena()->isManaged() ||
69 allocator.arena()->isDevice())
80 std::uninitialized_fill_n(data, count, value);
83 template <
typename T,
template<
class>
class Allocator>
85 [[maybe_unused]] Allocator<T>
const & allocator)
87 auto count = list.size() *
sizeof(T);
97 if (allocator.arena()->isManaged() ||
98 allocator.arena()->isDevice())
106 std::memcpy(data, std::data(list), count);
109 template <
typename T,
typename Size,
template<
class>
class Allocator>
111 [[maybe_unused]] Allocator<T>
const& allocator)
132 if (allocator.arena()->isManaged() ||
133 allocator.arena()->isDevice())
147 for (Size i = 0; i < count; ++i) { dst[i] = src[i]; }
151 template <
typename Allocator>
153 [[maybe_unused]] Allocator
const& dst_allocator,
154 [[maybe_unused]] Allocator
const& src_allocator,
155 [[maybe_unused]]
bool sync =
true)
166 bool dst_on_device = dst_allocator.arena()->isManaged() ||
167 dst_allocator.arena()->isDevice();
168 bool src_on_device = src_allocator.arena()->isManaged() ||
169 src_allocator.arena()->isDevice();
170 if (dst_on_device || src_on_device)
172 if (dst_on_device && src_on_device) {
174 }
else if (dst_on_device) {
184 std::memcpy(dst, src, count);
187 template <
typename Allocator>
189 [[maybe_unused]] Allocator
const& allocator)
203 if (allocator.arena()->isManaged() ||
204 allocator.arena()->isDevice())
215 std::memmove(dst, src, count);
218 template <
typename T,
typename Size,
template<
class>
class Allocator>
222 if constexpr (std::is_same_v<float, std::remove_cv_t<T>> ||
223 std::is_same_v<double, std::remove_cv_t<T>>) {
227 amrex::fill_snan<RunOn::Device>(data, count);
231 if (allocator.arena()->isManaged() ||
232 allocator.arena()->isDevice())
234 amrex::fill_snan<RunOn::Device>(data, count);
240 amrex::fill_snan<RunOn::Host>(data, count);
246 namespace VectorGrowthStrategy
260 template <
class T,
class Allocator = std::allocator<T> >
264 static_assert(std::is_trivially_copyable<T>(),
"PODVector can only hold trivially copyable types");
267 using Allocator::allocate;
268 using Allocator::deallocate;
294 : Allocator(a_allocator)
313 (Allocator
const&)(*
this));
319 : Allocator(a_allocator),
323 if (a_initializer_list.size() != 0) {
326 (Allocator
const&)(*
this));
331 : Allocator(a_vector),
335 if (a_vector.
size() != 0) {
338 (Allocator
const&)(*
this),
339 (Allocator
const&)a_vector);
344 : Allocator(
static_cast<Allocator&&
>(a_vector)),
349 a_vector.m_data =
nullptr;
351 a_vector.m_capacity = 0;
357 static_assert(std::is_same<Allocator,std::allocator<T>>::value ||
366 if (
this == &a_vector) {
return *
this; }
368 if ((Allocator
const&)(*
this) != (Allocator
const&)a_vector) {
375 (Allocator&)(*
this) = (Allocator
const&)a_vector;
378 const auto other_size = a_vector.
size();
387 (Allocator
const&)(*
this),
388 (Allocator
const&)a_vector);
395 if (
this == &a_vector) {
return *
this; }
397 if (
static_cast<Allocator const&
>(a_vector) ==
398 static_cast<Allocator const&
>(*
this))
408 a_vector.m_data =
nullptr;
410 a_vector.m_capacity = 0;
423 auto* pos =
const_cast<iterator>(a_pos);
426 (Allocator
const&)(*
this));
432 size_type num_to_erase = a_last - a_first;
433 auto* first =
const_cast<iterator>(a_first);
434 if (num_to_erase > 0) {
437 (Allocator
const&)(*
this));
444 return insert(a_pos, 1, a_item);
449 auto* pos =
const_cast<iterator>(a_pos);
453 std::size_t insert_index = std::distance(
m_data, pos);
455 pos =
m_data + insert_index;
460 (Allocator
const&)(*
this));
464 (Allocator
const&)(*
this));
472 return insert(a_pos, 1, std::move(a_item));
476 std::initializer_list<T> a_initializer_list)
478 auto* pos =
const_cast<iterator>(a_pos);
479 size_type count = a_initializer_list.size();
483 std::size_t insert_index = std::distance(
m_data, pos);
485 pos =
m_data + insert_index;
490 (Allocator
const&)(*
this));
494 (Allocator
const&)(*
this));
499 template <class InputIt, class bar = typename std::iterator_traits<InputIt>::difference_type>
502 auto* pos =
const_cast<iterator>(a_pos);
503 size_type count = std::distance(a_first, a_last);
507 std::size_t insert_index = std::distance(
m_data, pos);
509 pos =
m_data + insert_index;
514 (Allocator
const&)(*
this));
521 (Allocator
const&)(*
this));
534 (Allocator
const&)(*
this));
537 void assign (std::initializer_list<T> a_initializer_list)
541 reserve(a_initializer_list.size());
543 m_size = a_initializer_list.size();
545 (Allocator
const&)(*
this));
548 template <class InputIt, class bar = typename std::iterator_traits<InputIt>::difference_type>
549 void assign (InputIt a_first, InputIt a_last)
551 std::size_t count = std::distance(a_first, a_last);
558 (Allocator
const&)(*
this));
579 (Allocator
const&)(*
this));
595 [[nodiscard]]
bool empty () const noexcept {
return m_size == 0; }
603 [[nodiscard]]
const T&
front () const noexcept {
return *
m_data; }
611 [[nodiscard]]
const T*
data () const noexcept {
return m_data; }
645 if (old_size < a_new_size) {
647 m_size - old_size, (Allocator
const&)(*
this));
655 if (old_size < a_new_size)
659 (Allocator
const&)(*
this));
667 (Allocator&)(*
this));
681 (Allocator&)(*
this));
684 (Allocator
const&)(*
this),
685 (Allocator
const&)(*
this));
695 std::swap(
m_data, a_vector.m_data);
696 std::swap(
m_size, a_vector.m_size);
698 std::swap(
static_cast<Allocator&
>(a_vector),
static_cast<Allocator&
>(*
this));
712 return std::max(64/
sizeof(T),
size_type(1));
725 auto* new_data = fp.
ptr();
726 auto new_capacity = fp.
size();
730 (Allocator
const&)(*
this),
731 (Allocator
const&)(*
this));
744 (Allocator&)(*
this));
756 (Allocator&)(*
this));
757 auto* new_data = fp.ptr();
758 new_capacity = fp.size();
764 (
m_size-a_index)*
sizeof(T),
765 (Allocator
const&)(*
this));
771 (Allocator
const&)(*
this),
772 (Allocator
const&)(*
this),
false);
776 (
m_size-a_index)*
sizeof(T),
777 (Allocator
const&)(*
this),
778 (Allocator
const&)(*
this),
false);
#define AMREX_EXPORT
Definition AMReX_Extension.H:191
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
virtual void free(void *pt)=0
A pure virtual function for deleting the arena pointed to by pt.
virtual void * alloc(std::size_t sz)=0
static void streamSynchronize() noexcept
Definition AMReX_GpuDevice.cpp:681
Definition AMReX_PODVector.H:262
PODVector(std::initializer_list< T > a_initializer_list, const allocator_type &a_allocator=Allocator())
Definition AMReX_PODVector.H:317
iterator insert(const_iterator a_pos, T &&a_item)
Definition AMReX_PODVector.H:469
const_iterator begin() const noexcept
Definition AMReX_PODVector.H:619
void resize_without_init_snan(size_type a_new_size)
Definition AMReX_PODVector.H:790
const_iterator cbegin() const noexcept
Definition AMReX_PODVector.H:633
iterator insert(const_iterator a_pos, const T &a_item)
Definition AMReX_PODVector.H:442
PODVector & operator=(const PODVector< T, Allocator > &a_vector)
Definition AMReX_PODVector.H:364
iterator erase(const_iterator a_pos)
Definition AMReX_PODVector.H:421
void reserve(size_type a_capacity)
Definition AMReX_PODVector.H:663
iterator insert(const_iterator a_pos, size_type a_count, const T &a_value)
Definition AMReX_PODVector.H:447
size_type size() const noexcept
Definition AMReX_PODVector.H:591
const T * const_pointer
Definition AMReX_PODVector.H:282
void swap(PODVector< T, Allocator > &a_vector) noexcept
Definition AMReX_PODVector.H:693
void UpdateDataPtr(FatPtr< T > const &fp)
Definition AMReX_PODVector.H:723
const_reverse_iterator crbegin() const noexcept
Definition AMReX_PODVector.H:637
PODVector(const PODVector< T, Allocator > &a_vector)
Definition AMReX_PODVector.H:330
std::reverse_iterator< iterator > reverse_iterator
Definition AMReX_PODVector.H:279
T * pointer
Definition AMReX_PODVector.H:277
void shrink_to_fit()
Definition AMReX_PODVector.H:672
void assign(const T &a_value)
Definition AMReX_PODVector.H:565
void pop_back() noexcept
Definition AMReX_PODVector.H:587
size_type nBytes() const noexcept
Definition AMReX_PODVector.H:703
iterator insert(const_iterator a_pos, std::initializer_list< T > a_initializer_list)
Definition AMReX_PODVector.H:475
iterator insert(const_iterator a_pos, InputIt a_first, InputIt a_last)
Definition AMReX_PODVector.H:500
T * iterator
Definition AMReX_PODVector.H:278
void AllocateBufferForPush(size_type target_capacity)
Definition AMReX_PODVector.H:741
size_type GetNewCapacityForPush() const noexcept
Definition AMReX_PODVector.H:709
reverse_iterator rend() noexcept
Definition AMReX_PODVector.H:629
PODVector(size_type a_size)
Definition AMReX_PODVector.H:297
allocator_type get_allocator() const noexcept
Definition AMReX_PODVector.H:570
iterator begin() noexcept
Definition AMReX_PODVector.H:617
void assign(std::initializer_list< T > a_initializer_list)
Definition AMReX_PODVector.H:537
iterator end() noexcept
Definition AMReX_PODVector.H:621
T value_type
Definition AMReX_PODVector.H:271
const T * dataPtr() const noexcept
Definition AMReX_PODVector.H:615
constexpr PODVector() noexcept=default
void assign(size_type a_count, const T &a_value)
Definition AMReX_PODVector.H:526
const_reverse_iterator rbegin() const noexcept
Definition AMReX_PODVector.H:627
std::size_t size_type
Definition AMReX_PODVector.H:273
const_reverse_iterator rend() const noexcept
Definition AMReX_PODVector.H:631
size_type m_size
Definition AMReX_PODVector.H:288
void assign(InputIt a_first, InputIt a_last)
Definition AMReX_PODVector.H:549
T & front() noexcept
Definition AMReX_PODVector.H:601
pointer m_data
Definition AMReX_PODVector.H:287
const_reverse_iterator crend() const noexcept
Definition AMReX_PODVector.H:639
reverse_iterator rbegin() noexcept
Definition AMReX_PODVector.H:625
iterator erase(const_iterator a_first, const_iterator a_last)
Definition AMReX_PODVector.H:430
void clear() noexcept
Definition AMReX_PODVector.H:589
size_type capacity() const noexcept
Definition AMReX_PODVector.H:593
const_iterator cend() const noexcept
Definition AMReX_PODVector.H:635
size_type m_capacity
Definition AMReX_PODVector.H:288
T * dataPtr() noexcept
Definition AMReX_PODVector.H:613
PODVector(PODVector< T, Allocator > &&a_vector) noexcept
Definition AMReX_PODVector.H:343
T & reference
Definition AMReX_PODVector.H:276
const T * data() const noexcept
Definition AMReX_PODVector.H:611
const T * const_iterator
Definition AMReX_PODVector.H:283
void resize(size_type a_new_size)
Definition AMReX_PODVector.H:641
~PODVector()
Definition AMReX_PODVector.H:354
const_iterator end() const noexcept
Definition AMReX_PODVector.H:623
const T & const_reference
Definition AMReX_PODVector.H:281
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition AMReX_PODVector.H:284
T & back() noexcept
Definition AMReX_PODVector.H:605
void resize(size_type a_new_size, const T &a_val)
Definition AMReX_PODVector.H:651
std::ptrdiff_t difference_type
Definition AMReX_PODVector.H:274
const T & back() const noexcept
Definition AMReX_PODVector.H:607
T & operator[](size_type a_index) noexcept
Definition AMReX_PODVector.H:597
PODVector(size_type a_size, const value_type &a_value, const allocator_type &a_allocator=Allocator())
Definition AMReX_PODVector.H:306
T * data() noexcept
Definition AMReX_PODVector.H:609
const T & front() const noexcept
Definition AMReX_PODVector.H:603
bool empty() const noexcept
Definition AMReX_PODVector.H:595
void AllocateBufferForInsert(size_type a_index, size_type a_count)
Definition AMReX_PODVector.H:751
void push_back(const T &a_value)
Definition AMReX_PODVector.H:572
Allocator allocator_type
Definition AMReX_PODVector.H:272
void dtod_memcpy_async(void *p_d_dst, const void *p_d_src, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:279
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:237
void dtoh_memcpy_async(void *p_h, const void *p_d, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:265
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:251
void ValidateUserInput()
Definition AMReX_PODVector.cpp:15
Real growth_factor
Definition AMReX_PODVector.cpp:7
void Initialize()
Definition AMReX_PODVector.cpp:34
Real GetGrowthFactor()
Definition AMReX_PODVector.H:249
void SetGrowthFactor(Real a_factor)
Definition AMReX_PODVector.cpp:41
void memCopyImpl(void *dst, const void *src, std::size_t count, Allocator const &dst_allocator, Allocator const &src_allocator, bool sync=true)
Definition AMReX_PODVector.H:152
void fillValuesImpl(T *dst, T const *src, Size count, Allocator< T > const &allocator)
Definition AMReX_PODVector.H:110
void uninitializedFillNImpl(T *data, Size count, const T &value, Allocator< T > const &allocator)
Definition AMReX_PODVector.H:46
T * shrink_in_place(T *p, Size n, Allocator< T > &allocator)
Definition AMReX_PODVector.H:36
void memMoveImpl(void *dst, const void *src, std::size_t count, Allocator const &allocator)
Definition AMReX_PODVector.H:188
FatPtr< T > allocate_in_place(T *p, Size nmin, Size nmax, Allocator< T > &allocator)
Definition AMReX_PODVector.H:24
void maybe_init_snan(T *data, Size count, Allocator< T > const &allocator)
Definition AMReX_PODVector.H:219
void initFromListImpl(T *data, std::initializer_list< T > const &list, Allocator< T > const &allocator)
Definition AMReX_PODVector.H:84
Definition AMReX_Amr.cpp:49
std::enable_if_t< std::is_integral_v< T > > ParallelFor(TypeList< CTOs... > ctos, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
Definition AMReX_CTOParallelForImpl.H:191
bool InitSNaN() noexcept
Definition AMReX.cpp:173
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:127
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE std::enable_if_t< std::is_floating_point_v< T >, bool > almostEqual(T x, T y, int ulp=2)
Definition AMReX_Algorithm.H:93
Arena * The_Arena()
Definition AMReX_Arena.cpp:616
Definition AMReX_FabArrayCommI.H:896
Definition AMReX_GpuAllocators.H:24
constexpr T * ptr() const noexcept
Definition AMReX_GpuAllocators.H:27
constexpr std::size_t size() const noexcept
Definition AMReX_GpuAllocators.H:28
Definition AMReX_GpuAllocators.H:161
Definition AMReX_GpuAllocators.H:172
Definition AMReX_GpuAllocators.H:158