1 /* 2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 #ifndef RTC_BASE_REF_COUNTED_OBJECT_H_ 11 #define RTC_BASE_REF_COUNTED_OBJECT_H_ 12 13 #include "api/scoped_refptr.h" 14 #include "rtc_base/ref_count.h" 15 #include "rtc_base/ref_counter.h" 16 17 namespace rtc { 18 19 template <class T> 20 class RefCountedObject : public T { 21 public: RefCountedObject()22 RefCountedObject() {} 23 24 RefCountedObject(const RefCountedObject&) = delete; 25 RefCountedObject& operator=(const RefCountedObject&) = delete; 26 27 template <class P0> RefCountedObject(P0 && p0)28 explicit RefCountedObject(P0&& p0) : T(std::forward<P0>(p0)) {} 29 30 template <class P0, class P1, class... Args> RefCountedObject(P0 && p0,P1 && p1,Args &&...args)31 RefCountedObject(P0&& p0, P1&& p1, Args&&... args) 32 : T(std::forward<P0>(p0), 33 std::forward<P1>(p1), 34 std::forward<Args>(args)...) {} 35 AddRef()36 void AddRef() const override { ref_count_.IncRef(); } 37 Release()38 RefCountReleaseStatus Release() const override { 39 const auto status = ref_count_.DecRef(); 40 if (status == RefCountReleaseStatus::kDroppedLastRef) { 41 delete this; 42 } 43 return status; 44 } 45 46 // Return whether the reference count is one. If the reference count is used 47 // in the conventional way, a reference count of 1 implies that the current 48 // thread owns the reference and no other thread shares it. This call 49 // performs the test for a reference count of one, and performs the memory 50 // barrier needed for the owning thread to act on the object, knowing that it 51 // has exclusive access to the object. HasOneRef()52 virtual bool HasOneRef() const { return ref_count_.HasOneRef(); } 53 54 protected: ~RefCountedObject()55 ~RefCountedObject() override {} 56 57 mutable webrtc::webrtc_impl::RefCounter ref_count_{0}; 58 }; 59 60 template <class T> 61 class FinalRefCountedObject final : public T { 62 public: 63 using T::T; 64 // Above using declaration propagates a default move constructor 65 // FinalRefCountedObject(FinalRefCountedObject&& other), but we also need 66 // move construction from T. FinalRefCountedObject(T && other)67 explicit FinalRefCountedObject(T&& other) : T(std::move(other)) {} 68 FinalRefCountedObject(const FinalRefCountedObject&) = delete; 69 FinalRefCountedObject& operator=(const FinalRefCountedObject&) = delete; 70 AddRef()71 void AddRef() const { ref_count_.IncRef(); } Release()72 RefCountReleaseStatus Release() const { 73 const auto status = ref_count_.DecRef(); 74 if (status == RefCountReleaseStatus::kDroppedLastRef) { 75 delete this; 76 } 77 return status; 78 } HasOneRef()79 bool HasOneRef() const { return ref_count_.HasOneRef(); } 80 81 private: 82 ~FinalRefCountedObject() = default; 83 84 mutable webrtc::webrtc_impl::RefCounter ref_count_{0}; 85 }; 86 87 } // namespace rtc 88 89 #endif // RTC_BASE_REF_COUNTED_OBJECT_H_ 90