00001
00002
00003
00004 #ifndef DEV_W3_ORG__2001_BLINDFOLD_SRC_REFERENCECOUNTEDOBJECT_H
00005 #define DEV_W3_ORG__2001_BLINDFOLD_SRC_REFERENCECOUNTEDOBJECT_H
00006 #include "config.h"
00007
00008 #include <cassert>
00009
00016 class ReferenceCountedObject {
00017
00018 public:
00019
00020
00021 ReferenceCountedObject();
00022 ReferenceCountedObject(const ReferenceCountedObject& other);
00023 const ReferenceCountedObject& operator=(const ReferenceCountedObject& other);
00024 bool operator==(const ReferenceCountedObject& other) const;
00025 bool operator<(const ReferenceCountedObject& other) const;
00026 size_t hash() const;
00027 friend std::ostream& operator<<(std::ostream& s, const ReferenceCountedObject& me);
00028 std::ostream& print_to(std::ostream& stream) const;
00029 virtual ~ReferenceCountedObject();
00030
00031
00032
00036 void keep();
00037
00041 void release();
00042
00043
00044 private:
00045
00046 int reference_count;
00047
00048 };
00049
00050
00051
00052
00053 inline ReferenceCountedObject::ReferenceCountedObject()
00054 :reference_count(1)
00055 {
00056 }
00057
00058 inline ReferenceCountedObject::~ReferenceCountedObject()
00059 {
00060 assert(reference_count == 0);
00061 }
00062
00063 inline void ReferenceCountedObject::keep()
00064 {
00065 assert(reference_count > 0);
00066 reference_count++;
00067 }
00068
00069 inline void ReferenceCountedObject::release()
00070 {
00071 assert(reference_count > 0);
00072 reference_count--;
00073 if (reference_count == 0) delete this;
00074 }
00075
00076 STANDARD_EXTERNAL(ReferenceCountedObject)
00077
00078 #endif