6namespace Stroika::Foundation::Memory {
13 template <
typename T,
typename SHARED_IMLP>
14 inline SHARED_IMLP SharedByValue_CopyByDefault<T, SHARED_IMLP>::operator() (
const T& t)
const
16 if constexpr (same_as<SHARED_IMLP, shared_ptr<T>>) {
17 return make_shared<T> (t);
19 return SHARED_IMLP{
new T{t}};
27 template <
typename T,
typename TRAITS>
29 : fCopier_{element_copier_type{}}
33 template <
typename T,
typename TRAITS>
39 template <
typename T,
typename TRAITS>
42 , fSharedImpl_{copier (from)}
45 template <
typename T,
typename TRAITS>
47 : fCopier_{move (copier)}
48 , fSharedImpl_{move (from)}
51 template <
typename T,
typename TRAITS>
57 template <
typename T,
typename TRAITS>
58 inline SharedByValue<T, TRAITS>& SharedByValue<T, TRAITS>::operator= (
const shared_ptr_type& from)
noexcept
62 if (fSharedImpl_ != from) [[likely]] {
67 template <
typename T,
typename TRAITS>
68 inline SharedByValue<T, TRAITS>::operator bool () const noexcept
70 return fSharedImpl_.get () !=
nullptr;
72 template <
typename T,
typename TRAITS>
73 inline SharedByValue<T, TRAITS>& SharedByValue<T, TRAITS>::operator= (shared_ptr_type&& from)
noexcept
77 if (fSharedImpl_ != from) [[likely]] {
78 fSharedImpl_ = move (from);
82 template <
typename T,
typename TRAITS>
85 return fSharedImpl_.get ();
87 template <
typename T,
typename TRAITS>
92 template <
typename T,
typename TRAITS>
95 return rwget_ptr (fCopier_);
97 template <
typename T,
typename TRAITS>
98 template <
typename COPIER>
101 if (fSharedImpl_ !=
nullptr) [[likely]] {
102 auto result = forward<COPIER> (copier) (fSharedImpl_);
103 Assert (result.use_count () == 1);
108 template <
typename T,
typename TRAITS>
111 return rwget (fCopier_);
113 template <
typename T,
typename TRAITS>
114 template <
typename COPIER>
123 if (fSharedImpl_ !=
nullptr) [[likely]] {
124 AssureNOrFewerReferences (forward<COPIER> (copier));
125 Ensure (fSharedImpl_.use_count () == 1);
126 return fSharedImpl_.get ();
130 template <
typename T,
typename TRAITS>
133 return fSharedImpl_.get ();
135 template <
typename T,
typename TRAITS>
140 template <
typename T,
typename TRAITS>
143 const element_type* ptr = cget ();
147 template <
typename T,
typename TRAITS>
150 return fSharedImpl_ ==
nullptr;
152 template <
typename T,
typename TRAITS>
153 inline typename SharedByValue<T, TRAITS>::element_copier_type SharedByValue<T, TRAITS>::GetDefaultCopier ()
const
157 template <
typename T,
typename TRAITS>
160 switch (fSharedImpl_.use_count ()) {
162 Assert (fSharedImpl_.get () ==
nullptr);
163 return SharedByValue_State::eNull;
165 Assert (fSharedImpl_.get () !=
nullptr);
166 return SharedByValue_State::eSolo;
168 Assert (fSharedImpl_.get () !=
nullptr);
174 return SharedByValue_State::eShared;
177 template <
typename T,
typename TRAITS>
182 template <
typename T,
typename TRAITS>
187 template <
typename T,
typename TRAITS>
188 template <
typename COPIER>
192 if (
static_cast<unsigned int> (fSharedImpl_.use_count ()) > n) [[unlikely]] {
193 BreakReferences_ (forward<COPIER> (copier));
194 Assert (this->use_count () == 1);
197 template <
typename T,
typename TRAITS>
200 AssureNOrFewerReferences (fCopier_, n);
202 template <
typename T,
typename TRAITS>
203 template <
typename COPIER>
228 fSharedImpl_ = forward<COPIER> (copier) (*fSharedImpl_);
#define RequireNotNull(p)
SharedByValue is a utility class to implement Copy-On-Write (aka COW) - sort of halfway between uniqu...
nonvirtual unsigned int use_count() const
SharedByValue() noexcept=default