完成cow_ptr
This commit is contained in:
@@ -4,10 +4,33 @@
|
|||||||
#include "Memory.h"
|
#include "Memory.h"
|
||||||
|
|
||||||
namespace TinySTL{
|
namespace TinySTL{
|
||||||
|
template<class T>
|
||||||
|
class cow_ptr;
|
||||||
|
namespace Detail{
|
||||||
|
template <class T>
|
||||||
|
class proxy{
|
||||||
|
public:
|
||||||
|
explicit proxy(cow_ptr<T> *const cp) :cp_(cp){}
|
||||||
|
proxy(const proxy<T>&) = default;
|
||||||
|
proxy& operator = (const proxy<T>&) = default;
|
||||||
|
|
||||||
|
const T& operator *()const;
|
||||||
|
T& operator *();
|
||||||
|
const T *operator ->()const;
|
||||||
|
T *operator ->();
|
||||||
|
cow_ptr<T>& operator = (const T& val);
|
||||||
|
operator T()const;
|
||||||
|
private:
|
||||||
|
cow_ptr<T> *cp_;
|
||||||
|
};
|
||||||
|
}
|
||||||
template<class T>
|
template<class T>
|
||||||
class cow_ptr{
|
class cow_ptr{
|
||||||
public:
|
public:
|
||||||
typedef T element_type;
|
typedef T element_type;
|
||||||
|
private:
|
||||||
|
template<class _T>
|
||||||
|
using proxy = Detail::proxy < _T > ;
|
||||||
public:
|
public:
|
||||||
explicit cow_ptr(T *p = nullptr);
|
explicit cow_ptr(T *p = nullptr);
|
||||||
template<class D>
|
template<class D>
|
||||||
@@ -15,13 +38,12 @@ namespace TinySTL{
|
|||||||
|
|
||||||
cow_ptr(const cow_ptr& cp);
|
cow_ptr(const cow_ptr& cp);
|
||||||
cow_ptr& operator = (const cow_ptr& cp);
|
cow_ptr& operator = (const cow_ptr& cp);
|
||||||
|
|
||||||
const element_type& operator *()const;
|
const proxy<element_type> operator *()const;
|
||||||
const element_type *operator ->()const;
|
proxy<element_type> operator *();
|
||||||
//ע<><D7A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܻ<EFBFBD><DCBB>ı<EFBFBD>ָ<EFBFBD><D6B8>ָ<EFBFBD><D6B8><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>Ҫcow<6F><77><EFBFBD><EFBFBD>
|
const proxy<element_type> operator ->()const;
|
||||||
//element_type& operator *();
|
proxy<element_type> operator ->();
|
||||||
//element_type *operator ->();
|
|
||||||
|
|
||||||
element_type *get();
|
element_type *get();
|
||||||
const element_type *get()const;
|
const element_type *get()const;
|
||||||
|
|
||||||
@@ -41,6 +63,9 @@ namespace TinySTL{
|
|||||||
friend bool operator != (const cow_ptr<T>& cp, nullptr_t p);
|
friend bool operator != (const cow_ptr<T>& cp, nullptr_t p);
|
||||||
template<class T>
|
template<class T>
|
||||||
friend bool operator != (nullptr_t p, const cow_ptr<T>& cp);
|
friend bool operator != (nullptr_t p, const cow_ptr<T>& cp);
|
||||||
|
|
||||||
|
template<class _T>
|
||||||
|
friend class Detail::proxy;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,35 @@
|
|||||||
#define _COWPTR_IMPL_H_
|
#define _COWPTR_IMPL_H_
|
||||||
|
|
||||||
namespace TinySTL{
|
namespace TinySTL{
|
||||||
|
namespace Detail{
|
||||||
|
template<class T>
|
||||||
|
const T& proxy<T>::operator *()const{
|
||||||
|
return *(cp_->ptr_);
|
||||||
|
}
|
||||||
|
template<class T>
|
||||||
|
T& proxy<T>::operator *(){
|
||||||
|
auto t = *(cp_->ptr_);
|
||||||
|
cp_->ptr_ = make_shared<T>(t);
|
||||||
|
return *(cp_->ptr_);
|
||||||
|
}
|
||||||
|
template<class T>
|
||||||
|
const T *proxy<T>::operator ->()const{
|
||||||
|
return cp_->ptr_.operator->();
|
||||||
|
}
|
||||||
|
template<class T>
|
||||||
|
T *proxy<T>::operator ->(){
|
||||||
|
auto t = *(cp_->ptr_);
|
||||||
|
cp_->ptr_ = make_shared<T>(t);
|
||||||
|
return cp_->ptr_.operator->();
|
||||||
|
}
|
||||||
|
template<class T>
|
||||||
|
cow_ptr<T>& proxy<T>::operator = (const T& val){
|
||||||
|
cp_->ptr_ = make_shared<T>(val);
|
||||||
|
return *cp_;
|
||||||
|
}
|
||||||
|
template<class T>
|
||||||
|
proxy<T>::operator T()const{ return *(cp_->ptr_); }
|
||||||
|
}
|
||||||
template<class T>
|
template<class T>
|
||||||
cow_ptr<T>::cow_ptr(T *p = nullptr) :ptr_(p){}
|
cow_ptr<T>::cow_ptr(T *p = nullptr) :ptr_(p){}
|
||||||
template<class T>
|
template<class T>
|
||||||
@@ -20,19 +49,6 @@ namespace TinySTL{
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
template<class T>
|
template<class T>
|
||||||
const typename cow_ptr<T>::element_type& cow_ptr<T>::operator *()const{
|
|
||||||
return *ptr_;
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
const typename cow_ptr<T>::element_type *cow_ptr<T>::operator ->()const{
|
|
||||||
return ptr_.operator->();
|
|
||||||
}
|
|
||||||
//ע<><D7A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܻ<EFBFBD><DCBB>ı<EFBFBD>ָ<EFBFBD><D6B8>ָ<EFBFBD><D6B8><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>Ҫcow<6F><77><EFBFBD><EFBFBD>
|
|
||||||
//template<class T>
|
|
||||||
//typename cow_ptr<T>::element_type& cow_ptr<T>::operator *();
|
|
||||||
//template<class T>
|
|
||||||
//typename cow_ptr<T>::element_type *cow_ptr<T>::operator ->();
|
|
||||||
template<class T>
|
|
||||||
typename cow_ptr<T>::element_type *cow_ptr<T>::get(){
|
typename cow_ptr<T>::element_type *cow_ptr<T>::get(){
|
||||||
return ptr_.get();
|
return ptr_.get();
|
||||||
}
|
}
|
||||||
@@ -44,6 +60,22 @@ namespace TinySTL{
|
|||||||
cow_ptr<T>::operator bool()const{
|
cow_ptr<T>::operator bool()const{
|
||||||
return ptr_ != nullptr;
|
return ptr_ != nullptr;
|
||||||
}
|
}
|
||||||
|
template<class T>
|
||||||
|
const typename cow_ptr<T>::proxy<T> cow_ptr<T>::operator *()const{
|
||||||
|
return proxy<T>(const_cast<cow_ptr *const>(this));
|
||||||
|
}
|
||||||
|
template<class T>
|
||||||
|
typename cow_ptr<T>::proxy<T> cow_ptr<T>::operator *(){
|
||||||
|
return proxy<T>(this);
|
||||||
|
}
|
||||||
|
template<class T>
|
||||||
|
const typename cow_ptr<T>::proxy<T> cow_ptr<T>::operator ->()const{
|
||||||
|
return proxy<T>(const_cast<cow_ptr *const>(this));
|
||||||
|
}
|
||||||
|
template<class T>
|
||||||
|
typename cow_ptr<T>::proxy<T> cow_ptr<T>::operator ->(){
|
||||||
|
return proxy<T>(this);
|
||||||
|
}
|
||||||
|
|
||||||
template<class T1, class T2>
|
template<class T1, class T2>
|
||||||
bool operator == (const cow_ptr<T1>& cp1, const cow_ptr<T2>& cp2){
|
bool operator == (const cow_ptr<T1>& cp1, const cow_ptr<T2>& cp2){
|
||||||
|
|||||||
Reference in New Issue
Block a user