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
18namespace rtc {
19
20// Reference count interface.
21class RefCountInterface {
22 public:
23  virtual int AddRef() = 0;
24  virtual int Release() = 0;
25 protected:
26  virtual ~RefCountInterface() {}
27};
28
29template <class T>
30class RefCountedObject : public T {
31 public:
32  RefCountedObject() : ref_count_(0) {
33  }
34
35  template<typename P>
36  explicit RefCountedObject(P p) : T(p), ref_count_(0) {
37  }
38
39  template<typename P1, typename P2>
40  RefCountedObject(P1 p1, P2 p2) : T(p1, p2), ref_count_(0) {
41  }
42
43  template<typename P1, typename P2, typename 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>
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>
53  RefCountedObject(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
54      : T(p1, p2, p3, p4, p5), ref_count_(0) {
55  }
56
57  virtual int AddRef() {
58    return rtc::AtomicOps::Increment(&ref_count_);
59  }
60
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:
70  virtual ~RefCountedObject() {
71  }
72
73  int ref_count_;
74};
75
76}  // namespace rtc
77
78#endif  // TALK_APP_BASE_REFCOUNT_H_
79