00001 #ifndef _IT_BUS_REF_COUNTED_BASE_H_
00002 #define _IT_BUS_REF_COUNTED_BASE_H_
00003
00004
00005
00006 #include <it_tsdsa/atomic_counter.h>
00007 #include <it_bus/api_defines.h>
00008
00009 namespace IT_Bus
00010 {
00014 class IT_AFC_API RefCountedBase
00015 {
00016 public:
00017 void
00018 _add_ref() const
00019 IT_THROW_DECL(())
00020 {
00021 ++ IT_CONST_CAST(IT_AtomicCounter&, m_ref_count);
00022 }
00023
00024 void
00025 _remove_ref() const
00026 IT_THROW_DECL(())
00027 {
00028 if (-- IT_CONST_CAST(IT_AtomicCounter&, m_ref_count) == 0)
00029 {
00030 destroy();
00031 }
00032 }
00033
00034 IT_ULong
00035 _ref_count() const
00036 IT_THROW_DECL(())
00037 {
00038 IT_AtomicCounter& ref_count = IT_CONST_CAST(IT_AtomicCounter&, m_ref_count);
00039 return ref_count;
00040 }
00041
00042 protected:
00043 RefCountedBase(
00044 ) IT_THROW_DECL(()) :
00045 m_ref_count(1)
00046 {}
00047
00048 virtual ~RefCountedBase();
00049
00050 virtual void
00051 destroy() const IT_THROW_DECL(());
00052
00053 private:
00054 IT_AtomicCounter m_ref_count;
00055 };
00056 }
00057
00058 #endif