• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2011 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 
11 #ifndef TALK_APP_BASE_REFCOUNT_H_
12 #define TALK_APP_BASE_REFCOUNT_H_
13 
14 #include <string.h>
15 
16 #include "webrtc/base/criticalsection.h"
17 
18 namespace rtc {
19 
20 // Reference count interface.
21 class RefCountInterface {
22  public:
23   virtual int AddRef() = 0;
24   virtual int Release() = 0;
25  protected:
~RefCountInterface()26   virtual ~RefCountInterface() {}
27 };
28 
29 template <class T>
30 class RefCountedObject : public T {
31  public:
RefCountedObject()32   RefCountedObject() : ref_count_(0) {
33   }
34 
35   template<typename P>
RefCountedObject(P p)36   explicit RefCountedObject(P p) : T(p), ref_count_(0) {
37   }
38 
39   template<typename P1, typename P2>
RefCountedObject(P1 p1,P2 p2)40   RefCountedObject(P1 p1, P2 p2) : T(p1, p2), ref_count_(0) {
41   }
42 
43   template<typename P1, typename P2, typename P3>
RefCountedObject(P1 p1,P2 p2,P3 p3)44   RefCountedObject(P1 p1, P2 p2, P3 p3) : T(p1, p2, p3), ref_count_(0) {
45   }
46 
47   template<typename P1, typename P2, typename P3, typename P4>
RefCountedObject(P1 p1,P2 p2,P3 p3,P4 p4)48   RefCountedObject(P1 p1, P2 p2, P3 p3, P4 p4)
49       : T(p1, p2, p3, p4), ref_count_(0) {
50   }
51 
52   template<typename P1, typename P2, typename P3, typename P4, typename P5>
RefCountedObject(P1 p1,P2 p2,P3 p3,P4 p4,P5 p5)53   RefCountedObject(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
54       : T(p1, p2, p3, p4, p5), ref_count_(0) {
55   }
56 
AddRef()57   virtual int AddRef() {
58     return rtc::AtomicOps::Increment(&ref_count_);
59   }
60 
Release()61   virtual int Release() {
62     int count = rtc::AtomicOps::Decrement(&ref_count_);
63     if (!count) {
64       delete this;
65     }
66     return count;
67   }
68 
69  protected:
~RefCountedObject()70   virtual ~RefCountedObject() {
71   }
72 
73   int ref_count_;
74 };
75 
76 }  // namespace rtc
77 
78 #endif  // TALK_APP_BASE_REFCOUNT_H_
79