protected: // Provided for internal webrtc subclasses for corner cases where it's // necessary to know whether or not a reference is exclusively held. bool HasOneRef() const { return ref_count_.HasOneRef(); }
// Template based version of `RefCountedBase` for simple implementations that do // not need (or want) destruction via virtual destructor or the overhead of a // vtable. // // To use: // struct MyInt : public RefCountedNonVirtual<MyInt> { // int foo_ = 0; // }; // // scoped_refptr<MyInt> my_int(new MyInt()); // // sizeof(MyInt) on a 32 bit system would then be 8, int + refcount and no // vtable generated. template <typename T> class RefCountedNonVirtual { public:
RefCountedNonVirtual() = default;
void AddRef() const { ref_count_.IncRef(); }
RefCountReleaseStatus Release() const { // If you run into this assert, T has virtual methods. There are two // options: // 1) The class doesn't actually need virtual methods, the type is complete // so the virtual attribute(s) can be removed. // 2) The virtual methods are a part of the design of the class. In this // case you can consider using `RefCountedBase` instead or alternatively // use `RefCountedObject`.
static_assert(!std::is_polymorphic<T>::value, "T has virtual methods. RefCountedBase is a better fit."); constauto status = ref_count_.DecRef();
if (status == RefCountReleaseStatus::kDroppedLastRef) { deletestatic_cast<const T*>(this);
} return status;
}
protected: // Provided for internal webrtc subclasses for corner cases where it's // necessary to know whether or not a reference is exclusively held. bool HasOneRef() const { return ref_count_.HasOneRef(); }
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.