1#ifndef AMREX_PODVECTOR_H_
2#define AMREX_PODVECTOR_H_
3#include <AMReX_Config.H>
25 template <
typename T,
typename Size,
template<
class>
class Allocator>
27 Allocator<T>& allocator)
30 return allocator.allocate_in_place(p, nmin, nmax);
32 T* pnew = allocator.allocate(nmax);
37 template <
typename T,
typename Size,
template<
class>
class Allocator>
41 return allocator.shrink_in_place(p, n);
43 return allocator.allocate(n);
47 template <
typename T,
typename Size,
template<
class>
class Allocator>
49 [[maybe_unused]] Allocator<T>
const& allocator)
70 if (allocator.arena()->isManaged() ||
71 allocator.arena()->isDevice())
82 std::uninitialized_fill_n(data, count, value);
85 template <
typename T,
template<
class>
class Allocator>
87 [[maybe_unused]] Allocator<T>
const & allocator)
89 auto count = list.size() *
sizeof(T);
99 if (allocator.arena()->isManaged() ||
100 allocator.arena()->isDevice())
108 std::memcpy(data, std::data(list), count);
111 template <
typename T,
typename Size,
template<
class>
class Allocator>
113 [[maybe_unused]] Allocator<T>
const& allocator)
134 if (allocator.arena()->isManaged() ||
135 allocator.arena()->isDevice())
149 for (Size i = 0; i < count; ++i) { dst[i] = src[i]; }
153 template <
typename Allocator>
155 [[maybe_unused]] Allocator
const& dst_allocator,
156 [[maybe_unused]] Allocator
const& src_allocator,
157 [[maybe_unused]]
bool sync =
true)
168 bool dst_on_device = dst_allocator.arena()->isManaged() ||
169 dst_allocator.arena()->isDevice();
170 bool src_on_device = src_allocator.arena()->isManaged() ||
171 src_allocator.arena()->isDevice();
172 if (dst_on_device || src_on_device)
174 if (dst_on_device && src_on_device) {
176 }
else if (dst_on_device) {
186 std::memcpy(dst, src, count);
189 template <
typename Allocator>
191 [[maybe_unused]] Allocator
const& allocator)
205 if (allocator.arena()->isManaged() ||
206 allocator.arena()->isDevice())
217 std::memmove(dst, src, count);
220 template <
typename T,
typename Size,
template<
class>
class Allocator>
224 if constexpr (std::is_same_v<float, std::remove_cv_t<T>> ||
225 std::is_same_v<double, std::remove_cv_t<T>>) {
229 amrex::fill_snan<RunOn::Device>(data, count);
233 if (allocator.arena()->isManaged() ||
234 allocator.arena()->isDevice())
236 amrex::fill_snan<RunOn::Device>(data, count);
242 amrex::fill_snan<RunOn::Host>(data, count);
250 namespace VectorGrowthStrategy
265 std::size_t old_capacity, std::size_t sizeof_T)
269 if (new_size <= 900) {
274 return new_size + new_size/10;
276 return new_size + std::size_t(3*std::sqrt(new_size));
281 if (old_capacity == 0) {
282 return std::max(64/sizeof_T, new_size);
286 return std::max((old_capacity*3+1)/2, new_size);
288 return std::max(std::size_t(gf*Real(old_capacity+1)), new_size);
295 template <
class T,
class Allocator = std::allocator<T> >
299 static_assert(std::is_trivially_copyable<T>(),
"PODVector can only hold trivially copyable types");
302 using Allocator::allocate;
303 using Allocator::deallocate;
329 : Allocator(a_allocator)
346 : Allocator(a_allocator),
m_size(a_size),
353 (Allocator
const&)(*
this));
360 : Allocator(a_allocator),
367 if (a_initializer_list.size() != 0) {
369 (Allocator
const&)(*
this));
375 : Allocator(a_vector),
381 if (a_vector.
size() != 0) {
383 (Allocator
const&)(*
this),
384 (Allocator
const&)a_vector);
390 : Allocator(
static_cast<Allocator&&
>(a_vector)),
395 a_vector.m_data =
nullptr;
397 a_vector.m_capacity = 0;
403 static_assert(std::is_same<Allocator,std::allocator<T>>::value ||
412 if (
this == &a_vector) {
return *
this; }
414 if ((Allocator
const&)(*
this) != (Allocator
const&)a_vector) {
421 (Allocator&)(*
this) = (Allocator
const&)a_vector;
424 const auto other_size = a_vector.
size();
433 (Allocator
const&)(*
this),
434 (Allocator
const&)a_vector);
441 if (
this == &a_vector) {
return *
this; }
443 if (
static_cast<Allocator const&
>(a_vector) ==
444 static_cast<Allocator const&
>(*
this))
454 a_vector.m_data =
nullptr;
456 a_vector.m_capacity = 0;
469 auto* pos =
const_cast<iterator>(a_pos);
472 (Allocator
const&)(*
this));
478 size_type num_to_erase = a_last - a_first;
479 auto* first =
const_cast<iterator>(a_first);
480 if (num_to_erase > 0) {
483 (Allocator
const&)(*
this));
490 return insert(a_pos, 1, a_item);
495 auto* pos =
const_cast<iterator>(a_pos);
499 std::size_t insert_index = std::distance(
m_data, pos);
501 pos =
m_data + insert_index;
506 (Allocator
const&)(*
this));
510 (Allocator
const&)(*
this));
518 return insert(a_pos, 1, std::move(a_item));
522 std::initializer_list<T> a_initializer_list)
524 auto* pos =
const_cast<iterator>(a_pos);
525 size_type count = a_initializer_list.size();
529 std::size_t insert_index = std::distance(
m_data, pos);
531 pos =
m_data + insert_index;
536 (Allocator
const&)(*
this));
540 (Allocator
const&)(*
this));
545 template <class InputIt, class bar = typename std::iterator_traits<InputIt>::difference_type>
548 auto* pos =
const_cast<iterator>(a_pos);
549 size_type count = std::distance(a_first, a_last);
553 std::size_t insert_index = std::distance(
m_data, pos);
555 pos =
m_data + insert_index;
560 (Allocator
const&)(*
this));
567 (Allocator
const&)(*
this));
580 (Allocator
const&)(*
this));
583 void assign (std::initializer_list<T> a_initializer_list)
587 reserve(a_initializer_list.size());
589 m_size = a_initializer_list.size();
591 (Allocator
const&)(*
this));
594 template <class InputIt, class bar = typename std::iterator_traits<InputIt>::difference_type>
595 void assign (InputIt a_first, InputIt a_last)
597 std::size_t count = std::distance(a_first, a_last);
604 (Allocator
const&)(*
this));
625 (Allocator
const&)(*
this));
649 [[nodiscard]]
const T&
front () const noexcept {
return *
m_data; }
657 [[nodiscard]]
const T*
data () const noexcept {
return m_data; }
722 if (old_size < a_new_size) {
724 m_size - old_size, (Allocator
const&)(*
this));
763 if (old_size < a_new_size)
767 (Allocator
const&)(*
this));
816 (Allocator&)(*
this));
819 (Allocator
const&)(*
this),
820 (Allocator
const&)(*
this));
831 std::swap(
m_data, a_vector.m_data);
832 std::swap(
m_size, a_vector.m_size);
834 std::swap(
static_cast<Allocator&
>(a_vector),
static_cast<Allocator&
>(*
this));
861 (Allocator&)(*
this));
880 auto* new_data = fp.
ptr();
881 auto new_capacity = fp.
size();
885 (Allocator
const&)(*
this),
886 (Allocator
const&)(*
this));
899 (Allocator&)(*
this));
911 (Allocator&)(*
this));
912 auto* new_data = fp.ptr();
913 new_capacity = fp.size();
919 (
m_size-a_index)*
sizeof(T),
920 (Allocator
const&)(*
this));
926 (Allocator
const&)(*
this),
927 (Allocator
const&)(*
this),
false);
931 (
m_size-a_index)*
sizeof(T),
932 (Allocator
const&)(*
this),
933 (Allocator
const&)(*
this),
false);
#define AMREX_ENUM(CLASS,...)
Definition AMReX_Enum.H:206
#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:750
Definition AMReX_PODVector.H:297
PODVector(std::initializer_list< T > a_initializer_list, const allocator_type &a_allocator=Allocator())
Definition AMReX_PODVector.H:358
iterator insert(const_iterator a_pos, T &&a_item)
Definition AMReX_PODVector.H:515
void reserve(size_type a_capacity, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_PODVector.H:800
const_iterator begin() const noexcept
Definition AMReX_PODVector.H:665
const_iterator cbegin() const noexcept
Definition AMReX_PODVector.H:679
iterator insert(const_iterator a_pos, const T &a_item)
Definition AMReX_PODVector.H:488
PODVector & operator=(const PODVector< T, Allocator > &a_vector)
Definition AMReX_PODVector.H:410
iterator erase(const_iterator a_pos)
Definition AMReX_PODVector.H:467
iterator insert(const_iterator a_pos, size_type a_count, const T &a_value)
Definition AMReX_PODVector.H:493
size_type size() const noexcept
Definition AMReX_PODVector.H:637
const T * const_pointer
Definition AMReX_PODVector.H:317
void swap(PODVector< T, Allocator > &a_vector) noexcept
Definition AMReX_PODVector.H:829
void UpdateDataPtr(FatPtr< T > const &fp)
Definition AMReX_PODVector.H:878
const_reverse_iterator crbegin() const noexcept
Definition AMReX_PODVector.H:683
PODVector(const PODVector< T, Allocator > &a_vector)
Definition AMReX_PODVector.H:374
std::reverse_iterator< iterator > reverse_iterator
Definition AMReX_PODVector.H:314
T * pointer
Definition AMReX_PODVector.H:312
void shrink_to_fit()
Definition AMReX_PODVector.H:807
void assign(const T &a_value)
Definition AMReX_PODVector.H:611
void pop_back() noexcept
Definition AMReX_PODVector.H:633
size_type nBytes() const noexcept
Definition AMReX_PODVector.H:866
iterator insert(const_iterator a_pos, std::initializer_list< T > a_initializer_list)
Definition AMReX_PODVector.H:521
iterator insert(const_iterator a_pos, InputIt a_first, InputIt a_last)
Definition AMReX_PODVector.H:546
T * iterator
Definition AMReX_PODVector.H:313
void AllocateBufferForPush(size_type target_capacity)
Definition AMReX_PODVector.H:896
size_type GetNewCapacityForPush() const noexcept
Definition AMReX_PODVector.H:872
reverse_iterator rend() noexcept
Definition AMReX_PODVector.H:675
PODVector(size_type a_size)
Definition AMReX_PODVector.H:332
allocator_type get_allocator() const noexcept
Definition AMReX_PODVector.H:616
iterator begin() noexcept
Definition AMReX_PODVector.H:663
void resize(size_type a_new_size, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_PODVector.H:717
void free_async() noexcept
Definition AMReX_PODVector.H:842
void reserve_doit(size_type a_capacity)
Definition AMReX_PODVector.H:858
void assign(std::initializer_list< T > a_initializer_list)
Definition AMReX_PODVector.H:583
iterator end() noexcept
Definition AMReX_PODVector.H:667
T value_type
Definition AMReX_PODVector.H:306
const T * dataPtr() const noexcept
Definition AMReX_PODVector.H:661
constexpr PODVector() noexcept=default
void assign(size_type a_count, const T &a_value)
Definition AMReX_PODVector.H:572
const_reverse_iterator rbegin() const noexcept
Definition AMReX_PODVector.H:673
void resize_without_init_snan(size_type a_new_size, GrowthStrategy strategy)
Definition AMReX_PODVector.H:945
std::size_t size_type
Definition AMReX_PODVector.H:308
const_reverse_iterator rend() const noexcept
Definition AMReX_PODVector.H:677
size_type m_size
Definition AMReX_PODVector.H:323
void assign(InputIt a_first, InputIt a_last)
Definition AMReX_PODVector.H:595
T & front() noexcept
Definition AMReX_PODVector.H:647
pointer m_data
Definition AMReX_PODVector.H:322
const_reverse_iterator crend() const noexcept
Definition AMReX_PODVector.H:685
reverse_iterator rbegin() noexcept
Definition AMReX_PODVector.H:671
iterator erase(const_iterator a_first, const_iterator a_last)
Definition AMReX_PODVector.H:476
void clear() noexcept
Definition AMReX_PODVector.H:635
size_type capacity() const noexcept
Definition AMReX_PODVector.H:639
const_iterator cend() const noexcept
Definition AMReX_PODVector.H:681
size_type m_capacity
Definition AMReX_PODVector.H:323
T * dataPtr() noexcept
Definition AMReX_PODVector.H:659
PODVector(PODVector< T, Allocator > &&a_vector) noexcept
Definition AMReX_PODVector.H:389
T & reference
Definition AMReX_PODVector.H:311
const T * data() const noexcept
Definition AMReX_PODVector.H:657
const T * const_iterator
Definition AMReX_PODVector.H:318
~PODVector()
Definition AMReX_PODVector.H:400
const_iterator end() const noexcept
Definition AMReX_PODVector.H:669
void resize(size_type a_new_size, const T &a_val, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_PODVector.H:758
const T & const_reference
Definition AMReX_PODVector.H:316
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition AMReX_PODVector.H:319
T & back() noexcept
Definition AMReX_PODVector.H:651
std::ptrdiff_t difference_type
Definition AMReX_PODVector.H:309
const T & back() const noexcept
Definition AMReX_PODVector.H:653
T & operator[](size_type a_index) noexcept
Definition AMReX_PODVector.H:643
PODVector(size_type a_size, const value_type &a_value, const allocator_type &a_allocator=Allocator())
Definition AMReX_PODVector.H:344
T * data() noexcept
Definition AMReX_PODVector.H:655
const T & front() const noexcept
Definition AMReX_PODVector.H:649
bool empty() const noexcept
Definition AMReX_PODVector.H:641
void AllocateBufferForInsert(size_type a_index, size_type a_count)
Definition AMReX_PODVector.H:906
void push_back(const T &a_value)
Definition AMReX_PODVector.H:618
Allocator allocator_type
Definition AMReX_PODVector.H:307
void dtod_memcpy_async(void *p_d_dst, const void *p_d_src, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:317
void freeAsync(Arena *arena, void *mem) noexcept
Definition AMReX_GpuDevice.H:281
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:260
void dtoh_memcpy_async(void *p_h, const void *p_d, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:303
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:289
void ValidateUserInput()
Definition AMReX_PODVector.cpp:15
void Initialize()
Definition AMReX_PODVector.cpp:34
Real growth_factor
Definition AMReX_PODVector.cpp:7
Real GetGrowthFactor()
Definition AMReX_PODVector.H:253
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:154
void fillValuesImpl(T *dst, T const *src, Size count, Allocator< T > const &allocator)
Definition AMReX_PODVector.H:112
void uninitializedFillNImpl(T *data, Size count, const T &value, Allocator< T > const &allocator)
Definition AMReX_PODVector.H:48
T * shrink_in_place(T *p, Size n, Allocator< T > &allocator)
Definition AMReX_PODVector.H:38
void memMoveImpl(void *dst, const void *src, std::size_t count, Allocator const &allocator)
Definition AMReX_PODVector.H:190
FatPtr< T > allocate_in_place(T *p, Size nmin, Size nmax, Allocator< T > &allocator)
Definition AMReX_PODVector.H:26
void maybe_init_snan(T *data, Size count, Allocator< T > const &allocator)
Definition AMReX_PODVector.H:221
void initFromListImpl(T *data, std::initializer_list< T > const &list, Allocator< T > const &allocator)
Definition AMReX_PODVector.H:86
Definition AMReX_Amr.cpp:49
__host__ __device__ void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:138
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
GrowthStrategy
Definition AMReX_PODVector.H:248
__host__ __device__ std::enable_if_t< std::is_floating_point_v< T >, bool > almostEqual(T x, T y, int ulp=2)
Definition AMReX_Algorithm.H:93
std::size_t grow_podvector_capacity(GrowthStrategy strategy, std::size_t new_size, std::size_t old_capacity, std::size_t sizeof_T)
Definition AMReX_PODVector.H:264
Arena * The_Arena()
Definition AMReX_Arena.cpp:705
Definition AMReX_FabArrayCommI.H:1000
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