intrusive_ptr.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef ADCHPP_INTRUSIVE_PTR_H
00020 #define ADCHPP_INTRUSIVE_PTR_H
00021
00022 namespace std {
00023
00024 template<typename T>
00025 struct hash<boost::intrusive_ptr<T> > {
00026 size_t operator()(const boost::intrusive_ptr<T>& t) const { return hash<T*>()(t.get()); }
00027 };
00028
00029 }
00030
00031 namespace adchpp {
00032
00033 template<typename T>
00034 class intrusive_ptr_base
00035 {
00036 public:
00037 bool unique() throw() {
00038 return (refs == 1);
00039 }
00040
00041 boost::intrusive_ptr<T> from_this() { return boost::intrusive_ptr<T>(static_cast<T*>(this)); }
00042 protected:
00043 intrusive_ptr_base() throw() : refs(0) { }
00044 ~intrusive_ptr_base() { }
00045
00046 private:
00047 friend void intrusive_ptr_add_ref(T* p) {
00048 p->refs++;
00049 }
00050
00051 friend void intrusive_ptr_release(T* p) {
00052 if(!--p->refs)
00053 delete p;
00054 }
00055
00056 size_t refs;
00057 };
00058
00059 }
00060
00061 #endif