21 inline PolyVal<I>::PolyVal(PolyVal&& that)
noexcept {
22 that.vptr_->ops_(Op::eMove, &that, static_cast<Data*>(
this));
27 inline PolyVal<I>::PolyVal(PolyOrNonesuch
const& that) {
34 inline PolyVal<I>::~PolyVal() {
35 vptr_->ops_(Op::eNuke,
this,
nullptr);
39 inline Poly<I>& PolyVal<I>::operator=(PolyVal that) noexcept {
40 vptr_->ops_(Op::eNuke, _data_(),
nullptr);
41 that.vptr_->ops_(Op::eMove, that._data_(), _data_());
43 return static_cast<Poly<I>&
>(*this);
48 inline PolyVal<I>::PolyVal(
T&&
t) {
49 using U = std::decay_t<T>;
52 "This Poly<> requires copyability, and the source object is not " 55 assert(
typeid(
t) ==
typeid(
_t<std::decay<T>>) ||
56 !
"Dynamic and static exception types don't match. Object would " 57 "be sliced when storing in Poly.");
59 ::new (static_cast<void*>(&_data_()->buff_)) U(static_cast<
T&&>(
t));
61 _data_()->pobj_ =
new U(static_cast<T&&>(t));
63 vptr_ = vtableFor<I, U>();
68 inline PolyVal<I>::PolyVal(Poly<I2> that) {
71 "This Poly<> requires copyability, and the source object is not " 73 auto* that_vptr = PolyAccess::vtable(that);
74 if (that_vptr->state_ != State::eEmpty) {
76 vptr_ = &select<I>(*
std::exchange(that_vptr, vtable<std::decay_t<I2>>()));
82 inline Poly<I>& PolyVal<I>::operator=(
T&&
t) {
83 *
this = PolyVal(static_cast<T&&>(
t));
84 return static_cast<Poly<I>&
>(*this);
88 template <class I2, std::enable_if_t<ValueCompatible<I, I2>::value,
int>>
89 inline Poly<I>& PolyVal<I>::operator=(Poly<I2> that) {
91 return static_cast<Poly<I>&
>(*this);
96 switch (vptr_->state_) {
101 if (State::eOnHeap == that.vptr_->state_) {
102 std::swap(_data_()->pobj_, that._data_()->pobj_);
109 *
this,
static_cast<PolyVal<I>&
>(that));
114 inline AddCvrefOf<PolyRoot<I>, I>& PolyRef<I>::_polyRoot_()
const noexcept {
115 return const_cast<AddCvrefOf<PolyRoot<I>, I
>&>(
116 static_cast<PolyRoot<I>
const&
>(*this));
120 constexpr RefType PolyRef<I>::refType() noexcept {
121 using J = std::remove_reference_t<I>;
128 template <
class That,
class I2>
129 inline PolyRef<I>::PolyRef(That&& that, Type<I2>) {
130 auto* that_vptr = PolyAccess::vtable(PolyAccess::root(that));
132 if (that_state == State::eEmpty) {
133 throw BadPolyAccess();
136 _data_()->pobj_ = that_state == State::eInSitu
137 ?
const_cast<void*
>(
static_cast<void const*
>(&that_data->buff_))
139 this->vptr_ = &select<std::decay_t<I>>(
140 *
static_cast<VTable<std::decay_t<I2>
> const*>(that_vptr->ops_(
141 Op::eRefr,
nullptr, reinterpret_cast<void*>(refType()))));
145 inline PolyRef<I>::PolyRef(PolyRef
const& that) noexcept {
146 _data_()->pobj_ = that._data_()->pobj_;
147 this->vptr_ = that.vptr_;
151 inline Poly<I>& PolyRef<I>::operator=(PolyRef
const& that) noexcept {
152 _data_()->pobj_ = that._data_()->pobj_;
153 this->vptr_ = that.vptr_;
154 return static_cast<Poly<I>&
>(*this);
158 template <class T, std::enable_if_t<ModelsInterface<T, I>::value,
int>>
159 inline PolyRef<I>::PolyRef(
T&&
t) noexcept {
161 const_cast<void*
>(
static_cast<void const*
>(std::addressof(
t)));
162 this->vptr_ = vtableFor<std::decay_t<I>, AddCvrefOf<std::decay_t<T>, I>>();
169 inline PolyRef<I>::PolyRef(Poly<I2>&& that) noexcept(
171 : PolyRef{that, Type<I2>{}} {
173 Disjunction<std::is_reference<I2>, std::is_rvalue_reference<I>>::
value,
174 "Attempting to construct a Poly that is a reference to a temporary. " 175 "This is probably a mistake.");
179 template <class T, std::enable_if_t<ModelsInterface<T, I>::value,
int>>
180 inline Poly<I>& PolyRef<I>::operator=(
T&&
t) noexcept {
181 *
this = PolyRef(static_cast<T&&>(
t));
182 return static_cast<Poly<I>&
>(*this);
188 std::enable_if_t<ReferenceCompatible<I, I2, I2&&>::value,
int>>
189 inline Poly<I>& PolyRef<I>::operator=(Poly<I2>&& that) noexcept(
192 return static_cast<Poly<I>&
>(*this);
199 inline Poly<I>& PolyRef<I>::operator=(Poly<I2>& that)
noexcept(
201 *
this = PolyRef(that);
202 return static_cast<Poly<I>&
>(*this);
209 inline Poly<I>& PolyRef<I>::operator=(Poly<I2>
const& that)
noexcept(
211 *
this = PolyRef(that);
212 return static_cast<Poly<I>&
>(*this);
217 std::swap(_data_()->pobj_, that._data_()->pobj_);
223 return const_cast<AddCvrefOf<PolyImpl<I>, I
>&>(
224 static_cast<PolyImpl<I>
const&
>(*this));
constexpr detail::Map< Move > move
—— Concurrent Priority Queue Implementation ——
requires E e noexcept(noexcept(s.error(std::move(e))))
State
See Core for details.
static const char *const value
T exchange(T &obj, U &&new_value)
uint64_t value(const typename LockFreeRingBuffer< T, Atom >::Cursor &rbcursor)
void swap(SwapTrackingAlloc< T > &, SwapTrackingAlloc< T > &)
PUSHMI_INLINE_VAR constexpr detail::get_fn< T > get
static constexpr uint64_t data[1]
#define FOLLY_FALLTHROUGH