diff options
Diffstat (limited to 'src/system_wrappers/interface/ref_count.h')
-rw-r--r-- | src/system_wrappers/interface/ref_count.h | 82 |
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_ |