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 throw(())
00020 {
00021 ++ IT_CONST_CAST(IT_AtomicCounter&, m_ref_count);
00022 }
00023
00024 void
00025 _remove_ref() const
00026 throw(())
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 throw(())
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 ) throw(()) :
00045 m_ref_count(1)
00046 {}
00047
00048 virtual ~RefCountedBase();
00049
00050 virtual void
00051 destroy() const throw(());
00052
00053 private:
00054 IT_AtomicCounter m_ref_count;
00055 };
00056 }
00057
00058 #endif
00059