20#ifndef SHAREDPOINTER_H
21#define SHAREDPOINTER_H
23#include "pedigree/kernel/processor/types.h"
24#include "pedigree/kernel/utilities/utility.h"
99 explicit operator bool()
const;
114 template <
class... Args>
118 template <
class... Args>
161 m_Control = other.m_Control;
163 other.m_Control =
nullptr;
174 __atomic_add_fetch(&p.m_Control->refcount, 1, __ATOMIC_SEQ_CST);
179 m_Control = p.m_Control;
192 m_Control->refcount = 1;
193 m_Control->ptr = ptr;
201 return m_Control->ptr;
225 __atomic_add_fetch(&p.m_Control->refcount, 1, __ATOMIC_SEQ_CST);
230 m_Control = p.m_Control;
238 m_Control = p.m_Control;
239 p.m_Control =
nullptr;
251 return refcount() == 1;
259 return __atomic_load_n(&m_Control->refcount, __ATOMIC_SEQ_CST);
263template <
class... Args>
266 result.
reset(
new T(args...));
267 return pedigree_std::move(result);
271template <
class... Args>
274 result.m_Control =
new Control{
nullptr, 1};
275 if (!result.m_Control)
279 result.m_Control->ptr =
new T(args...);
280 if (!result.m_Control->ptr)
290 result.m_Control =
new Control{ptr, 1};
291 if (!result.m_Control)
301 size_t rc = __atomic_sub_fetch(&m_Control->refcount, 1, __ATOMIC_SEQ_CST);
304 delete m_Control->ptr;
317 return get() == p.
get();
322 return get() != p.
get();
327 return get() < p.
get();
332 return get() <= p.
get();
337 return get() > p.
get();
342 return get() >= p.
get();
static SharedPointer< T > tryAdopt(T *ptr)
SharedPointer< T > & operator=(SharedPointer< T > &&p) noexcept
static SharedPointer< T > tryAllocate(Args...)
SharedPointer(SharedPointer< T > &&other) noexcept
SharedPointer< T > & operator=(const SharedPointer< T > &p)
bool operator==(const SharedPointer &p) const
SharedPointer(const SharedPointer< T > &p)
static SharedPointer< T > allocate(Args...)