| /* |
| * 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_ |