YOrch 1.0.0
Loading...
Searching...
No Matches
typed_slot.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <memory>
5#include <new>
6#include <type_traits>
7#include <utility>
8
9#include "../storage/maybe_storage.hpp"
10#include "policy.hpp"
11
12namespace yorch::detail {
13
14template <typename T, slot_logical_policy Policy = slot_logical_policy::maybe_payload>
15struct typed_slot {
16 static_assert(!std::is_void_v<T>,
17 "yorch::detail::typed_slot<T> requires a non-void type");
20 "yorch::detail::typed_slot<T> only supports maybe_payload or must_payload policies");
21
26
27 typed_slot() = default;
28 typed_slot(const typed_slot&) = delete;
29 typed_slot& operator=(const typed_slot&) = delete;
32
33 ~typed_slot() = default;
34
35 template <typename... Args>
36 constexpr T& emplace(Args&&... args)
37 noexcept(noexcept(storage_.emplace(std::forward<Args>(args)...))) {
38 return storage_.emplace(std::forward<Args>(args)...);
39 }
40
41 [[nodiscard]] constexpr T& get() & noexcept {
42 return storage_.get();
43 }
44
45 [[nodiscard]] constexpr const T& get() const& noexcept {
46 return storage_.get();
47 }
48
49 constexpr void destroy() noexcept {
50 storage_.destroy();
51 }
52
53 [[nodiscard]] constexpr bool has_value() const noexcept {
54 return storage_.has_value();
55 }
56
57 [[nodiscard]] constexpr std::byte* raw_storage() noexcept {
58 return reinterpret_cast<std::byte*>(storage_.raw_ptr());
59 }
60
61 [[nodiscard]] constexpr const std::byte* raw_storage() const noexcept {
62 return reinterpret_cast<const std::byte*>(storage_.raw_ptr());
63 }
64
65 [[nodiscard]] constexpr bool* engaged_ptr() noexcept {
66 return storage_.engaged_ptr();
67 }
68
69 [[nodiscard]] constexpr const bool* engaged_ptr() const noexcept {
70 return storage_.engaged_ptr();
71 }
72
73 [[nodiscard]] static constexpr std::size_t* owner_node_ptr() noexcept {
74 return nullptr;
75 }
76
77private:
78 detail::maybe_storage<T> storage_ {};
79};
80
81template <>
84
85 typed_slot() = default;
86 typed_slot(const typed_slot&) = delete;
87 typed_slot& operator=(const typed_slot&) = delete;
90 ~typed_slot() = default;
91
92 constexpr void destroy() noexcept {}
93
94 // NOLINTNEXTLINE(readability-convert-member-functions-to-static)
95 [[nodiscard]] constexpr bool has_value() const noexcept {
96 return false;
97 }
98};
99
100template <typename T>
102 static_assert(!std::is_void_v<T>,
103 "yorch::detail::typed_slot<T, must_payload> requires a non-void type");
104
106
107 typed_slot() = default;
108 typed_slot(const typed_slot&) = delete;
109 typed_slot& operator=(const typed_slot&) = delete;
112
113 ~typed_slot() = default;
114
115 template <typename... Args>
116 constexpr T& emplace(Args&&... args)
117 noexcept(std::is_nothrow_constructible_v<T, Args&&...>) {
118 return *std::construct_at(ptr(), std::forward<Args>(args)...);
119 }
120
121 [[nodiscard]] constexpr T& get() & noexcept {
122 return *ptr();
123 }
124
125 [[nodiscard]] constexpr const T& get() const& noexcept {
126 return *ptr();
127 }
128
129 constexpr void destroy() noexcept {
130 std::destroy_at(ptr());
131 }
132
133 [[nodiscard]] constexpr std::byte* raw_storage() noexcept {
134 return storage_;
135 }
136
137 [[nodiscard]] constexpr const std::byte* raw_storage() const noexcept {
138 return storage_;
139 }
140
141 [[nodiscard]] static constexpr bool* engaged_ptr() noexcept {
142 return nullptr;
143 }
144
145 [[nodiscard]] static constexpr std::size_t* owner_node_ptr() noexcept {
146 return nullptr;
147 }
148
149private:
150 [[nodiscard]] constexpr T* ptr() noexcept {
151 return std::launder(reinterpret_cast<T*>(storage_));
152 }
153
154 [[nodiscard]] constexpr const T* ptr() const noexcept {
155 return std::launder(reinterpret_cast<const T*>(storage_));
156 }
157
158 // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays, modernize-avoid-c-arrays)
159 alignas(T) std::byte storage_[sizeof(T)] {};
160};
161
162} // namespace yorch::detail
slot_physical_policy
Storage-level policy for a physical slot after layout selection.
Definition policy.hpp:32
slot_logical_policy
Node-local slot semantics inferred from a task's result protocol.
Definition policy.hpp:17
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63
Manual-lifetime storage for an optional in-place T.
constexpr const std::byte * raw_storage() const noexcept
static constexpr std::size_t * owner_node_ptr() noexcept
constexpr T & emplace(Args &&... args) noexcept(std::is_nothrow_constructible_v< T, Args &&... >)
typed_slot & operator=(const typed_slot &)=delete
constexpr T & get() &noexcept
static constexpr std::size_t * owner_node_ptr() noexcept
constexpr const T & get() const &noexcept
typed_slot & operator=(typed_slot &&)=delete
typed_slot & operator=(const typed_slot &)=delete
typed_slot(const typed_slot &)=delete
constexpr bool * engaged_ptr() noexcept
constexpr std::byte * raw_storage() noexcept
static constexpr slot_physical_policy physical_policy
constexpr T & emplace(Args &&... args) noexcept(noexcept(storage_.emplace(std::forward< Args >(args)...)))
typed_slot(typed_slot &&)=delete
constexpr void destroy() noexcept
constexpr const std::byte * raw_storage() const noexcept
constexpr bool has_value() const noexcept
constexpr const bool * engaged_ptr() const noexcept