00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00030
00031 #ifndef NET_INSTAWEB_UTIL_PUBLIC_REF_COUNTED_PTR_H_
00032 #define NET_INSTAWEB_UTIL_PUBLIC_REF_COUNTED_PTR_H_
00033
00034 #include "net/instaweb/util/public/basictypes.h"
00035
00036 #include "base/memory/ref_counted.h"
00037
00038 namespace net_instaweb {
00039
00040
00041 template<class T>
00042 class RefCounted : public base::RefCountedThreadSafe<T> {
00043 };
00044
00048 template<class T>
00049 class RefCountedPtr : public scoped_refptr<T> {
00050 public:
00051 RefCountedPtr() : scoped_refptr<T>(NULL) {}
00052 explicit RefCountedPtr(T* t) : scoped_refptr<T>(t) {}
00053
00054 template<class U>
00055 explicit RefCountedPtr(const RefCountedPtr<U>& src)
00056 : scoped_refptr<T>(src) {
00057 }
00058
00062 bool unique() const { return !this->ptr_ || this->ptr_->HasOneRef(); }
00063
00064 void clear() {
00065 *this = RefCountedPtr();
00066 }
00067 void reset(T* ptr) {
00068 *this = RefCountedPtr(ptr);
00069 }
00070 void reset(const RefCountedPtr& src) {
00071 *this = src;
00072 }
00073
00074 private:
00075 operator void*() const;
00076 operator T*() const;
00077
00080 };
00081
00087 template<class T>
00088 class RefCountedObj {
00089 public:
00090 RefCountedObj() : data_ptr_(new Data()) {}
00091 explicit RefCountedObj(const T& val) : data_ptr_(new Data(val)) {}
00092
00096 bool unique() const { return data_ptr_.unique(); }
00097
00098 T* get() { return &data_ptr_->value; }
00099 const T* get() const { return &data_ptr_->value; }
00100 T* operator->() { return &data_ptr_->value; }
00101 const T* operator->() const { return &data_ptr_->value; }
00102 T& operator*() { return data_ptr_->value; }
00103 const T& operator*() const { return data_ptr_->value; }
00104
00105 protected:
00106 struct Data : public RefCounted<Data> {
00107 Data() {}
00108 explicit Data(const T& val) : value(val) {}
00109 T value;
00110 };
00111
00112 RefCountedPtr<Data> data_ptr_;
00113
00114 private:
00115 operator void*() const;
00116 operator T*() const;
00117
00119 };
00120
00125 #define REFCOUNT_SHARED_MEM_IMPL_CLASS base::RefCountedThreadSafe
00126
00127
00137 #define REFCOUNT_FRIEND_DECLARATION(class_name) \
00138 friend class REFCOUNT_SHARED_MEM_IMPL_CLASS<class_name>
00139
00140 }
00141
00142 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_REF_COUNTED_PTR_H_