import CppUtils.Thread.SharedPtr;
import CppUtils;
constexpr SharedPtr::SharedPtr() noexcept = default;
constexpr SharedPtr::SharedPtr(std::nullptr_t) noexcept;
constexpr SharedPtr::SharedPtr(const WeakPtr<T>& weak) noexcept;
constexpr SharedPtr::~SharedPtr();
constexpr SharedPtr::SharedPtr(const SharedPtr& other) noexcept;
constexpr SharedPtr::SharedPtr(SharedPtr&& other) noexcept;
constexpr auto SharedPtr::operator=(const SharedPtr& other) noexcept -> SharedPtr&;
constexpr auto SharedPtr::operator=(SharedPtr&& other) noexcept -> SharedPtr&;
constexpr auto SharedPtr::operator=(std::nullptr_t) noexcept -> SharedPtr&;
constexpr auto SharedPtr::reset() noexcept -> void;
constexpr auto SharedPtr::reset(ControlBlock* controlBlock) noexcept -> void;
[[nodiscard]] constexpr auto SharedPtr::use_count() const noexcept -> std::size_t;
[[nodiscard]] explicit constexpr SharedPtr::operator bool() const noexcept;
[[nodiscard]] constexpr auto SharedPtr::get(this auto&& self [[clang::lifetimebound, msvc::lifetimebound]]) noexcept -> auto*;
[[nodiscard]] constexpr auto SharedPtr::operator*(this auto&& self [[clang::lifetimebound, msvc::lifetimebound]]) noexcept -> decltype(auto);
[[nodiscard]] constexpr auto SharedPtr::operator->(this auto&& self [[clang::lifetimebound, msvc::lifetimebound]]) noexcept -> auto*;
[[nodiscard]] constexpr auto SharedPtr::owner_equal(const auto& other) const noexcept -> bool;
[[nodiscard]] constexpr auto SharedPtr::owner_before(const auto& other) const noexcept -> bool;