/* * Copyright (c) 2012 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 "webrtc/system_wrappers/interface/atomic32.h" namespace webrtc { // This class can be used for instantiating // reference counted objects. // int32_t AddRef() and int32_t Release(). // Usage: // RefCountImpl* implementation = new RefCountImpl(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* implementation = // new RefCountImpl(); // return implementation; // } template class RefCountImpl : public T { public: RefCountImpl() : ref_count_(0) {} template explicit RefCountImpl(P p) : T(p), ref_count_(0) {} template RefCountImpl(P1 p1, P2 p2) : T(p1, p2), ref_count_(0) {} template RefCountImpl(P1 p1, P2 p2, P3 p3) : T(p1, p2, p3), ref_count_(0) {} template RefCountImpl(P1 p1, P2 p2, P3 p3, P4 p4) : T(p1, p2, p3, p4), ref_count_(0) {} template 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: Atomic32 ref_count_; }; } // namespace webrtc #endif // SYSTEM_WRAPPERS_INTERFACE_REF_COUNT_H_