17#include "vecmem/memory/details/unique_alloc_deleter.hpp"
18#include "vecmem/memory/details/unique_obj_deleter.hpp"
19#include "vecmem/memory/memory_resource.hpp"
20#include "vecmem/vecmem_core_export.hpp"
32 return reinterpret_cast<T>(0xf000U);
93template <
typename T,
typename...
Args>
100 std::size_t
s =
sizeof(
T);
102 std::max(
static_cast<std::size_t
>(alignment),
alignof(
T));
109 new (
p)
T(std::forward<Args>(
a)...);
134template <
typename T,
typename... Args>
135typename std::enable_if_t<!std::is_array_v<T>, unique_obj_ptr<T>>
138 std::forward<Args>(
a)...);
160typename std::enable_if_t<std::is_array_v<T> && std::extent_v<T> == 0,
174 std::size_t
s =
n *
sizeof(std::remove_extent_t<T>);
175 std::size_t
align = std::max(
static_cast<std::size_t
>(alignment),
176 alignof(std::remove_extent_t<T>));
177 pointer_t
p =
static_cast<pointer_t
>(
m.allocate(
s,
align));
182 for (std::size_t
i = 0;
i <
n; ++
i) {
183 new (&
p[
i]) std::remove_extent_t<T>();
210typename std::enable_if_t<std::is_array_v<T> && std::extent_v<T> == 0,
214 m,
n, std::align_val_t{
alignof(std::remove_extent_t<T>)});
234 std::align_val_t alignment) {
238 static_assert(!(std::is_array_v<T> && std::extent_v<T> == 0),
239 "Allocation pointer type cannot be an unbounded array.");
246 static_assert(std::is_trivially_constructible_v<std::remove_extent_t<T>>,
247 "Allocation pointer type must be trivially constructible.");
250 std::conditional_t<std::is_array_v<T>, std::decay_t<T>,
T*>;
256 std::size_t
s =
sizeof(
T);
257 std::size_t
align = std::max(
static_cast<std::size_t
>(alignment),
258 alignof(std::remove_extent_t<T>));
259 pointer_t
p =
static_cast<pointer_t
>(
m.allocate(
s,
align));
297 m, std::align_val_t{
alignof(std::remove_extent_t<T>)});
319 std::align_val_t alignment) {
323 static_assert(std::is_array_v<T>,
324 "Allocation pointer type must be an array type.");
325 static_assert(std::extent_v<T> == 0,
326 "Allocation pointer type must be unbounded.");
333 static_assert(std::is_trivially_constructible_v<std::remove_extent_t<T>>,
334 "Allocation pointer type must be trivially constructible.");
337 std::conditional_t<std::is_array_v<T>, std::decay_t<T>,
T*>;
342 details::get_nonexistent_pointer<pointer_t>());
349 std::size_t
s =
n *
sizeof(std::remove_extent_t<T>);
350 std::size_t
align = std::max(
static_cast<std::size_t
>(alignment),
351 alignof(std::remove_extent_t<T>));
352 pointer_t
p =
static_cast<pointer_t
>(
m.allocate(
s,
align));
391 m,
n, std::align_val_t{
alignof(std::remove_extent_t<T>)});
432template <
typename T,
typename C>
433typename std::enable_if_t<!(std::is_array_v<T> && std::extent_v<T> == 0),
448 static_assert(std::is_trivially_copyable_v<std::remove_extent_t<T>>,
449 "Allocation pointer type must be trivially copyable.");
452 std::conditional_t<std::is_array_v<T>, std::decay_t<T>,
T*>;
458 std::size_t
s =
sizeof(
T);
459 std::size_t
align =
alignof(std::remove_extent_t<T>);
460 pointer_t
p =
static_cast<pointer_t
>(
m.allocate(
s,
align));
509template <
typename T,
typename C>
511 const std::remove_extent_t<T>*
f,
516 static_assert(std::is_array_v<T>,
517 "Allocation pointer type must be an array type.");
518 static_assert(std::extent_v<T> == 0,
519 "Allocation pointer type must be unbounded.");
527 static_assert(std::is_trivially_copyable_v<std::remove_extent_t<T>>,
528 "Allocation pointer type must be trivially copyable.");
531 std::conditional_t<std::is_array_v<T>, std::decay_t<T>,
T*>;
536 details::get_nonexistent_pointer<pointer_t>());
543 std::size_t
s =
n *
sizeof(std::remove_extent_t<T>);
544 std::size_t
align =
alignof(std::remove_extent_t<T>);
545 pointer_t
p =
static_cast<pointer_t
>(
m.allocate(
s,
align));
An allocator class that wraps a memory resource.
Definition allocator.hpp:37
T get_nonexistent_pointer()
Helper function for generating a nonexistent, but still "aligned" pointer.
Definition unique_ptr.hpp:31
Main namespace for the vecmem classes/functions.
Definition atomic_ref.hpp:16
std::unique_ptr< T, details::unique_obj_deleter< T > > unique_obj_ptr
A unique pointer type for non-trivial objects.
Definition unique_ptr.hpp:54
std::unique_ptr< T, details::unique_alloc_deleter< T > > unique_alloc_ptr
A unique pointer type for trivial types.
Definition unique_ptr.hpp:72
std::enable_if_t<!std::is_array_v< T >, unique_obj_ptr< T > > make_unique_obj(memory_resource &m, std::align_val_t alignment, Args &&... a)
Create a unique object pointer to a newly constructed object, with a minimum alignment.
Definition unique_ptr.hpp:95
unique_alloc_ptr< T > make_unique_alloc(memory_resource &m, std::align_val_t alignment)
Create a unique allocation pointer to a type, with a minimum alignment.
Definition unique_ptr.hpp:233
A deleter class for trivial allocations.
Definition unique_alloc_deleter.hpp:33
A deleter class for non-trivial objects.
Definition unique_obj_deleter.hpp:44