base/include/base/weak_ptr/weak_ptr_factory.h¶
Factory for producing WeakPtr instances for an exclusive owner. More...
Namespaces¶
| Name |
|---|
| cf |
Classes¶
| Name | |
|---|---|
| class | cf::WeakPtrFactory Factory for producing WeakPtr instances for an exclusive owner. |
Detailed Description¶
Factory for producing WeakPtr instances for an exclusive owner.
Author: N/A
Version: N/A
Since: N/A
Date: N/A
WeakPtrFactory should be declared as a member variable of the owner class, as the last member to ensure it is destroyed first (C++ destroys members in reverse declaration order).
Source code¶
#pragma once
#include "private/weak_ptr_internals.h"
#include "weak_ptr.h"
#include <cassert>
#include <memory>
namespace cf {
template <typename T> class WeakPtrFactory {
public:
// ------------------------------------------------------------
// Construction / Destruction
// ------------------------------------------------------------
explicit WeakPtrFactory(T* owner) noexcept
: owner_(owner), flag_(std::make_shared<internal::WeakReferenceFlag>()) {
assert(owner_ && "WeakPtrFactory owner must not be null");
}
~WeakPtrFactory() { InvalidateWeakPtrs(); }
WeakPtrFactory(const WeakPtrFactory&) = delete;
WeakPtrFactory& operator=(const WeakPtrFactory&) = delete;
WeakPtrFactory(WeakPtrFactory&&) = delete;
WeakPtrFactory& operator=(WeakPtrFactory&&) = delete;
// ------------------------------------------------------------
// Core Interface
// ------------------------------------------------------------
[[nodiscard]] WeakPtr<T> GetWeakPtr() const noexcept {
assert(flag_->IsAlive() && "GetWeakPtr() called after InvalidateWeakPtrs()");
return WeakPtr<T>(owner_, flag_);
}
void InvalidateWeakPtrs() noexcept {
if (flag_->IsAlive()) {
flag_->Invalidate();
// Allocate a new flag to support continued use after invalidation
flag_ = std::make_shared<internal::WeakReferenceFlag>();
}
}
[[nodiscard]] bool HasWeakPtrs() const noexcept { return flag_.use_count() > 1; }
private:
T* owner_;
// mutable allows GetWeakPtr() to be const
mutable internal::WeakReferenceFlagPtr flag_;
};
} // namespace cf
Updated on 2026-03-09 at 10:14:01 +0000