Index: webrtc/base/scoped_ref_ptr.h |
diff --git a/webrtc/base/scoped_ref_ptr.h b/webrtc/base/scoped_ref_ptr.h |
index ceee445216a3ce6af300c7830f19f528049e4c2c..c628561ca1e1f584b1132b63937f72bc4064afb3 100644 |
--- a/webrtc/base/scoped_ref_ptr.h |
+++ b/webrtc/base/scoped_ref_ptr.h |
@@ -68,54 +68,59 @@ |
namespace rtc { |
template <class T> |
-class scoped_refptr { |
+class scoped_const_refptr { |
public: |
- scoped_refptr() : ptr_(NULL) { |
- } |
+ scoped_const_refptr() : ptr_(NULL) {} |
- scoped_refptr(T* p) : ptr_(p) { |
+ scoped_const_refptr(T* p) : ptr_(p) { |
if (ptr_) |
ptr_->AddRef(); |
} |
- scoped_refptr(const scoped_refptr<T>& r) : ptr_(r.ptr_) { |
+ scoped_const_refptr(const scoped_const_refptr<T>& r) : ptr_(r.ptr_) { |
if (ptr_) |
ptr_->AddRef(); |
} |
template <typename U> |
- scoped_refptr(const scoped_refptr<U>& r) : ptr_(r.get()) { |
+ scoped_const_refptr(const scoped_const_refptr<U>& r) : ptr_(r.get()) { |
if (ptr_) |
ptr_->AddRef(); |
} |
// Move constructors. |
- scoped_refptr(scoped_refptr<T>&& r) : ptr_(r.release()) {} |
+ scoped_const_refptr(scoped_const_refptr<T>&& r) : ptr_(r.release()) {} |
template <typename U> |
- scoped_refptr(scoped_refptr<U>&& r) : ptr_(r.release()) {} |
+ scoped_const_refptr(scoped_const_refptr<U>&& r) : ptr_(r.release()) {} |
- ~scoped_refptr() { |
+ ~scoped_const_refptr() { |
if (ptr_) |
ptr_->Release(); |
} |
- T* get() const { return ptr_; } |
- operator T*() const { return ptr_; } |
- T* operator->() const { return ptr_; } |
+ const T* get() const { return ptr_; } |
+#if 0 |
+ // TODO(nisse): If enabled, we get errors like "conversion from |
+ // 'const rtc::scoped_refptr<webrtc::VideoFrameBuffer>' to 'bool' is |
+ // ambiguous" because it collides with the * operator in the |
+ // subclass. |
+ operator const T*() const { return ptr_; } |
+#endif |
+ const T* operator->() const { return ptr_; } |
// Release a pointer. |
// The return value is the current pointer held by this object. |
// If this object holds a NULL pointer, the return value is NULL. |
// After this operation, this object will hold a NULL pointer, |
// and will not own the object any more. |
- T* release() { |
- T* retVal = ptr_; |
+ const T* release() { |
+ const T* retVal = ptr_; |
ptr_ = NULL; |
return retVal; |
} |
- scoped_refptr<T>& operator=(T* p) { |
+ scoped_const_refptr<T>& operator=(T* p) { |
// AddRef first so that self assignment should work |
if (p) |
p->AddRef(); |
@@ -125,27 +130,80 @@ class scoped_refptr { |
return *this; |
} |
- scoped_refptr<T>& operator=(const scoped_refptr<T>& r) { |
+ scoped_const_refptr<T>& operator=(const scoped_const_refptr<T>& r) { |
return *this = r.ptr_; |
} |
template <typename U> |
- scoped_refptr<T>& operator=(const scoped_refptr<U>& r) { |
+ scoped_const_refptr<T>& operator=(const scoped_const_refptr<U>& r) { |
return *this = r.get(); |
} |
- void swap(T** pp) { |
- T* p = ptr_; |
+ void swap(const T** pp) { |
+ const T* p = ptr_; |
ptr_ = *pp; |
*pp = p; |
} |
- void swap(scoped_refptr<T>& r) { |
+ void swap(scoped_const_refptr<T>& r) { |
swap(&r.ptr_); |
} |
protected: |
- T* ptr_; |
+ const T* ptr_; |
+}; |
+ |
+template <class T> |
+class scoped_refptr : public scoped_const_refptr<T> { |
+ public: |
+ scoped_refptr() : scoped_const_refptr<T>() {} |
+ scoped_refptr(T* p) : scoped_const_refptr<T>(p) {} |
+ |
+ scoped_refptr(const scoped_refptr<T>& r) : scoped_refptr<T>(r.get()) {} |
+ |
+ template <typename U> |
+ scoped_refptr(const scoped_refptr<U>& r) : scoped_refptr<T>(r.get()) {} |
+ |
+ T* get() const { return const_cast<T*>(scoped_const_refptr<T>::ptr_); } |
+ operator T*() const { return get(); } |
+ T* operator->() const { return get(); } |
+ |
+ T* release() { |
+ T* retVal = get(); |
+ scoped_const_refptr<T>::ptr_ = NULL; |
+ return retVal; |
+ } |
+ |
+ scoped_refptr<T>& operator=(T* p) { |
+ // AddRef first so that self assignment should work |
+ if (p) |
+ p->AddRef(); |
+ if (scoped_const_refptr<T>::ptr_) |
+ scoped_const_refptr<T>::ptr_->Release(); |
+ set(p); |
+ return *this; |
+ } |
+ |
+ scoped_refptr<T>& operator=(const scoped_refptr<T>& r) { |
+ return *this = r.get(); |
+ } |
+ template <typename U> |
+ scoped_refptr<T>& operator=(const scoped_refptr<U>& r) { |
+ return *this = r.get(); |
+ } |
+ void swap(T** pp) { |
+ const T* p = scoped_const_refptr<T>::ptr_; |
+ set(*pp); |
+ *pp = const_cast<T*>(p); |
+ } |
+ |
+ void swap(scoped_refptr<T>& r) { |
+ swap(const_cast<T**>(&r.ptr_)); |
+ } |
+ private: |
+ void set(T* p) { |
+ scoped_const_refptr<T>::ptr_ = const_cast<T*>(p); |
+ } |
}; |
} // namespace rtc |