diff --git a/TinySTL/COWPtr.h b/TinySTL/COWPtr.h index 8945646..fd23cfc 100644 --- a/TinySTL/COWPtr.h +++ b/TinySTL/COWPtr.h @@ -16,11 +16,31 @@ namespace TinySTL{ cow_ptr(const cow_ptr& cp); cow_ptr& operator = (const cow_ptr& cp); - element_type operator *()const; - element_type *operator ->()const; + const element_type& operator *()const; + const element_type *operator ->()const; + //注意 这两个函数可能会改变指针指向的对象的内容,需要cow机制 + //element_type& operator *(); + //element_type *operator ->(); + + element_type *get(); + const element_type *get()const; + + operator bool() const; private: shared_ptr ptr_; - + public: + template + friend bool operator == (const cow_ptr& cp1, const cow_ptr& cp2); + template + friend bool operator == (const cow_ptr& cp, nullptr_t p); + template + friend bool operator == (nullptr_t p, const cow_ptr& cp); + template + friend bool operator != (const cow_ptr& cp1, const cow_ptr& cp2); + template + friend bool operator != (const cow_ptr& cp, nullptr_t p); + template + friend bool operator != (nullptr_t p, const cow_ptr& cp); }; } diff --git a/TinySTL/Detail/COWPtr.impl.h b/TinySTL/Detail/COWPtr.impl.h index 69711f5..0010a1a 100644 --- a/TinySTL/Detail/COWPtr.impl.h +++ b/TinySTL/Detail/COWPtr.impl.h @@ -20,13 +20,55 @@ namespace TinySTL{ return *this; } template - typename cow_ptr::element_type cow_ptr::operator *()const{ + const typename cow_ptr::element_type& cow_ptr::operator *()const{ return *ptr_; } template - typename cow_ptr::element_type *cow_ptr::operator ->()const{ + const typename cow_ptr::element_type *cow_ptr::operator ->()const{ return ptr_.operator->(); } + //注意 这两个函数可能会改变指针指向的对象的内容,需要cow机制 + //template + //typename cow_ptr::element_type& cow_ptr::operator *(); + //template + //typename cow_ptr::element_type *cow_ptr::operator ->(); + template + typename cow_ptr::element_type *cow_ptr::get(){ + return ptr_.get(); + } + template + const typename cow_ptr::element_type *cow_ptr::get()const{ + return ptr_.get(); + } + template + cow_ptr::operator bool()const{ + return ptr_ != nullptr; + } + + template + bool operator == (const cow_ptr& cp1, const cow_ptr& cp2){ + return cp1.ptr_ == cp2.ptr_; + } + template + bool operator == (const cow_ptr& cp, nullptr_t p){ + return cp.ptr_ == p; + } + template + bool operator == (nullptr_t p, const cow_ptr& cp){ + return cp == p; + } + template + bool operator != (const cow_ptr& cp1, const cow_ptr& cp2){ + return !(cp1 == cp2); + } + template + bool operator != (const cow_ptr& cp, nullptr_t p){ + return !(cp == p); + } + template + bool operator != (nullptr_t p, const cow_ptr& cp){ + return !(cp == p); + } } #endif \ No newline at end of file diff --git a/TinySTL/Test/COWPtrTest.cpp b/TinySTL/Test/COWPtrTest.cpp index f5cf347..139c1f4 100644 --- a/TinySTL/Test/COWPtrTest.cpp +++ b/TinySTL/Test/COWPtrTest.cpp @@ -7,14 +7,21 @@ namespace TinySTL{ void testCase1(){ cow_ptr cp1(new string("hello")); assert(*cp1 == "hello"); + assert(cp1); - cp1->append(" world"); auto cp2 = cp1; - assert(*cp2 == "hello world"); + assert(*cp2 == "hello"); cow_ptr cp3; cp3 = cp1; - assert(*cp3 == "hello world"); + assert(*cp3 == "hello"); + + assert(cp1.get() == cp2.get() && cp2.get() == cp3.get()); + + assert(cp1 == cp2 && !(cp2 != cp3)); + + cow_ptr cp4; + assert(cp4 == nullptr); } void testAllCases(){