/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkWeakRefCnt_DEFINED #define SkWeakRefCnt_DEFINED #include "include/core/SkRefCnt.h" #include "include/core/SkTypes.h" #include <atomic> #include <cstdint> /** \class SkWeakRefCnt SkWeakRefCnt is the base class for objects that may be shared by multiple objects. When an existing strong owner wants to share a reference, it calls ref(). When a strong owner wants to release its reference, it calls unref(). When the shared object's strong reference count goes to zero as the result of an unref() call, its (virtual) weak_dispose method is called. It is an error for the destructor to be called explicitly (or via the object going out of scope on the stack or calling delete) if getRefCnt() > 1. In addition to strong ownership, an owner may instead obtain a weak reference by calling weak_ref(). A call to weak_ref() must be balanced by a call to weak_unref(). To obtain a strong reference from a weak reference, call try_ref(). If try_ref() returns true, the owner's pointer is now also a strong reference on which unref() must be called. Note that this does not affect the original weak reference, weak_unref() must still be called. When the weak reference count goes to zero, the object is deleted. While the weak reference count is positive and the strong reference count is zero the object still exists, but will be in the disposed state. It is up to the object to define what this means. Note that a strong reference implicitly implies a weak reference. As a result, it is allowable for the owner of a strong ref to call try_ref(). This will have the same effect as calling ref(), but may be more expensive. Example: SkWeakRefCnt myRef = strongRef.weak_ref(); ... // strongRef.unref() may or may not be called if (myRef.try_ref()) { ... // use myRef myRef.unref(); } else { // myRef is in the disposed state } myRef.weak_unref(); */ class SK_API SkWeakRefCnt : public SkRefCnt { … }; #endif