跳转至

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