9#ifndef LIBPMEMOBJ_CPP_DESTROYER_HPP
10#define LIBPMEMOBJ_CPP_DESTROYER_HPP
38struct if_not_array<T[]>;
43template <
typename T,
size_t N>
44struct if_not_array<T[N]>;
56struct if_size_array<T[]>;
61template <
typename T,
size_t N>
62struct if_size_array<T[N]> {
71template <
typename T,
typename... Args>
73create(
typename if_not_array<T>::type *ptr, Args &&... args)
75#if __cpp_lib_is_aggregate
76 if constexpr (std::is_aggregate_v<T>)
77 new (
static_cast<void *
>(ptr)) T{std::forward<Args>(args)...};
79 new (
static_cast<void *
>(ptr)) T(std::forward<Args>(args)...);
81 new (
static_cast<void *
>(ptr)) T(std::forward<Args>(args)...);
88template <
typename T,
typename... Args>
90create(
typename if_size_array<T>::type *ptr, Args &&... args)
92 typedef typename detail::pp_array_type<T>::type I;
93 enum { N = pp_array_elems<T>::elems };
95 for (std::size_t i = 0; i < N; ++i)
96 create<I>(&(*ptr)[i], std::forward<Args>(args)...);
104template <
typename T,
size_t... Indices,
typename Tuple>
106create_from_tuple(
void *ptr, index_sequence<Indices...>, Tuple tuple)
108 new (ptr) T(std::get<Indices>(std::move(tuple))...);
116template <
typename T,
typename Tuple,
typename... Args>
118c_style_construct(
void *ptr,
void *arg)
120 auto *arg_pack =
static_cast<Tuple *
>(arg);
122 typedef typename make_index_sequence<Args...>::type index;
124 create_from_tuple<T>(ptr, index(), std::move(*arg_pack));
136 typename =
typename std::enable_if<
137 !std::is_trivially_destructible<T>::value>::type>
139destroy(
typename if_not_array<T>::type &arg)
147template <
typename T,
typename dummy = void,
148 typename =
typename std::enable_if<
149 std::is_trivially_destructible<T>::value>::type>
151destroy(
typename if_not_array<T>::type &)
160destroy(
typename if_size_array<T>::type &arg)
162 typedef typename detail::pp_array_type<T>::type I;
163 enum { N = pp_array_elems<T>::elems };
165 for (std::size_t i = 0; i < N; ++i)
166 destroy<I>(arg[N - 1 - i]);
Create c++14 style index sequence.
Persistent memory namespace.
Definition: allocation_flag.hpp:15