Home | History | Annotate | Download | only in include
      1 /*
      2  *  Copyright (c) 2012 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 SYSTEM_WRAPPERS_INCLUDE_REF_COUNT_H_
     12 #define SYSTEM_WRAPPERS_INCLUDE_REF_COUNT_H_
     13 
     14 #include "webrtc/system_wrappers/include/atomic32.h"
     15 
     16 namespace webrtc {
     17 
     18 // This class can be used for instantiating
     19 // reference counted objects.
     20 // int32_t AddRef() and int32_t Release().
     21 // Usage:
     22 // RefCountImpl<T>* implementation = new RefCountImpl<T>(p);
     23 //
     24 // Example:
     25 // class MyInterface {
     26 //  public:
     27 //   virtual void DoSomething() = 0;
     28 //   virtual int32_t AddRef() = 0;
     29 //   virtual int32_t Release() = 0:
     30 //  private:
     31 //   virtual ~MyInterface(){};
     32 // }
     33 // class MyImplementation : public MyInterface {
     34 //  public:
     35 //   virtual DoSomething() { printf("hello"); };
     36 // };
     37 // MyImplementation* CreateMyImplementation() {
     38 //   RefCountImpl<MyImplementation>* implementation =
     39 //       new RefCountImpl<MyImplementation>();
     40 //   return implementation;
     41 // }
     42 
     43 template <class T>
     44 class RefCountImpl : public T {
     45  public:
     46   RefCountImpl() : ref_count_(0) {}
     47 
     48   template<typename P>
     49   explicit RefCountImpl(P p) : T(p), ref_count_(0) {}
     50 
     51   template<typename P1, typename P2>
     52   RefCountImpl(P1 p1, P2 p2) : T(p1, p2), ref_count_(0) {}
     53 
     54   template<typename P1, typename P2, typename P3>
     55   RefCountImpl(P1 p1, P2 p2, P3 p3) : T(p1, p2, p3), ref_count_(0) {}
     56 
     57   template<typename P1, typename P2, typename P3, typename P4>
     58   RefCountImpl(P1 p1, P2 p2, P3 p3, P4 p4) : T(p1, p2, p3, p4), ref_count_(0) {}
     59 
     60   template<typename P1, typename P2, typename P3, typename P4, typename P5>
     61   RefCountImpl(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
     62       : T(p1, p2, p3, p4, p5), ref_count_(0) {}
     63 
     64   int32_t AddRef() const override {
     65     return ++ref_count_;
     66   }
     67 
     68   int32_t Release() const override {
     69     int32_t ref_count;
     70     ref_count = --ref_count_;
     71     if (ref_count == 0)
     72       delete this;
     73     return ref_count;
     74   }
     75 
     76  protected:
     77   mutable Atomic32 ref_count_;
     78 };
     79 
     80 }  // namespace webrtc
     81 
     82 #endif  // SYSTEM_WRAPPERS_INCLUDE_REF_COUNT_H_
     83