A trait describing smart reference counted pointers.
Note that in a way
Option<Arc<T>> is also a smart reference counted pointer, just
one that can hold NULL.
The trait is unsafe, because a wrong implementation will break the ArcSwapAny implementation and lead to UB.
This is not actually expected for downstream crate to implement, this is just means to reuse
code for Arc and
Option<Arc> variants. However, it is theoretically possible (if
you have your own Arc implementation).
Aside from the obvious properties (like that incrementing and decrementing a reference count
cancel each out and that having less references tracked than how many things actually point to
the value is fine as long as the count doesn't drop to 0), it also must satisfy that if two
pointers have the same value, they point to the same object. This is specifically not true for
ZSTs, but it is true for
Arcs of ZSTs, because they have the reference counts just after the
value. It would be fine to point to a type-erased version of the same object, though (if one
could use this trait with unsized types in the first place).
Furthermore, the type should be Pin (eg. if the type is cloned or moved, it should still point/deref to the same place in memory).
The base type the pointer points to.
Converts the smart pointer into a raw pointer, without affecting the reference count.
This can be seen as kind of freezing the pointer ‒ it'll be later converted back using
The pointer must point to the value stored (and the value must be the same as one returned
Provides a view into the smart pointer as a raw pointer.
This must not affect the reference count ‒ the pointer is only borrowed.
Converts a raw pointer back into the smart pointer, without affecting the reference count.
This is only called on values previously returned by
However, it is not guaranteed to be 1:1 relation ‒
from_ptr may be called more times than
into_ptr temporarily provided the reference count never drops under 1 during that time
(the implementation sometimes owes a reference). These extra pointers will either be
converted back using
into_ptr or forgotten.
This must not be called by code outside of this crate.
Increments the reference count by one.