aboutsummaryrefslogtreecommitdiff
path: root/src/system_wrappers/interface/ref_count.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/system_wrappers/interface/ref_count.h')
-rw-r--r--src/system_wrappers/interface/ref_count.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/system_wrappers/interface/ref_count.h b/src/system_wrappers/interface/ref_count.h
new file mode 100644
index 0000000000..f90b0b3609
--- /dev/null
+++ b/src/system_wrappers/interface/ref_count.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef SYSTEM_WRAPPERS_INTERFACE_REF_COUNT_H_
+#define SYSTEM_WRAPPERS_INTERFACE_REF_COUNT_H_
+
+#include "system_wrappers/interface/atomic32_wrapper.h"
+
+namespace webrtc {
+
+// This class can be used for instantiating
+// reference counted objects.
+// int32_t AddRef() and int32_t Release().
+// Usage:
+// RefCountImpl<T>* implementation = new RefCountImpl<T>(p);
+//
+// Example:
+// class MyInterface {
+// public:
+// virtual void DoSomething() = 0;
+// virtual int32_t AddRef() = 0;
+// virtual int32_t Release() = 0:
+// private:
+// virtual ~MyInterface(){};
+// }
+// class MyImplementation : public MyInterface {
+// public:
+// virtual DoSomething() { printf("hello"); };
+// };
+// MyImplementation* CreateMyImplementation() {
+// RefCountImpl<MyImplementation>* implementation =
+// new RefCountImpl<MyImplementation>();
+// return implementation;
+// }
+
+template <class T>
+class RefCountImpl : public T {
+ public:
+ RefCountImpl() : ref_count_(0) {}
+
+ template<typename P>
+ explicit RefCountImpl(P p) : T(p), ref_count_(0) {}
+
+ template<typename P1, typename P2>
+ RefCountImpl(P1 p1, P2 p2) : T(p1, p2), ref_count_(0) {}
+
+ template<typename P1, typename P2, typename P3>
+ RefCountImpl(P1 p1, P2 p2, P3 p3) : T(p1, p2, p3), ref_count_(0) {}
+
+ template<typename P1, typename P2, typename P3, typename P4>
+ RefCountImpl(P1 p1, P2 p2, P3 p3, P4 p4) : T(p1, p2, p3, p4), ref_count_(0) {}
+
+ template<typename P1, typename P2, typename P3, typename P4, typename P5>
+ RefCountImpl(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
+ : T(p1, p2, p3, p4, p5), ref_count_(0) {}
+
+ virtual int32_t AddRef() {
+ return ++ref_count_;
+ }
+
+ virtual int32_t Release() {
+ int32_t ref_count;
+ ref_count = --ref_count_;
+ if (ref_count == 0)
+ delete this;
+ return ref_count;
+ }
+
+ protected:
+ Atomic32Wrapper ref_count_;
+};
+
+} // namespace webrtc
+
+#endif // SYSTEM_WRAPPERS_INTERFACE_REF_COUNT_H_