3#ifndef poplar_SSOPointer_hpp
4#define poplar_SSOPointer_hpp
14template <
typename T, std::
size_t N = 8, std::
size_t A = 8>
15class SSOPointer final {
21 SSOPointer(
const SSOPointer &) =
delete;
22 SSOPointer &operator=(
const SSOPointer &) =
delete;
24 SSOPointer(SSOPointer &&o)
noexcept {
27 auto &src = *
reinterpret_cast<T **
>(&o.buf);
28 auto &dst = *
reinterpret_cast<T **
>(b);
32 new (b) T(std::move(*
reinterpret_cast<T *
>(&o.buf)));
36 SSOPointer &operator=(SSOPointer &&o)
noexcept {
39 auto &src = *
reinterpret_cast<T **
>(&o.buf);
40 auto &dst = *
reinterpret_cast<T **
>(&buf);
45 *
reinterpret_cast<T *
>(&buf) =
46 std::move(*
reinterpret_cast<T *
>(&o.buf));
54 delete *
reinterpret_cast<T **
>(&buf);
56 reinterpret_cast<T *
>(&buf)->~T();
60 template <
typename... Args>
static SSOPointer make(Args &&...args) {
64 new (b) T *(
new T(std::forward<Args>(args)...));
66 new (b) T(std::forward<Args>(args)...);
73 return *
reinterpret_cast<T **
>(&buf);
75 return reinterpret_cast<T *
>(&buf);
79 const T *get() const noexcept {
81 return *
reinterpret_cast<T *
const *
>(&buf);
83 return reinterpret_cast<const T *
>(&buf);
87 T *operator->() noexcept {
return get(); }
88 const T *operator->() const noexcept {
return get(); }
90 T &operator*() noexcept {
return *get(); }
91 const T &operator*() const noexcept {
return *get(); }
93 constexpr static bool isPtr() noexcept {
94 return sizeof(T) > N || A %
alignof(T) != 0;
98 SSOPointer() =
default;
100 static_assert(N >=
sizeof(T *),
"Must be at least as big as a pointer");
101 static_assert(A %
alignof(T *) == 0,
102 "Alignment must be a valid alignment of a pointer");
103 typename std::aligned_storage<N, A>::type buf;
Poplar classes and functions.
Definition: ArrayRef.hpp:14