COWPtr.impl.h 2.6 KB
Newer Older
邹晓航 已提交
1 2 3 4
#ifndef _COWPTR_IMPL_H_
#define _COWPTR_IMPL_H_

namespace TinySTL{
邹晓航 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
	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_); }
	}
邹晓航 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
	template<class T>
	cow_ptr<T>::cow_ptr(T *p = nullptr) :ptr_(p){}
	template<class T>
	template<class D>
	cow_ptr<T>::cow_ptr(T *p, D d) : ptr_(p, d){}
	template<class T>
	cow_ptr<T>::cow_ptr(const cow_ptr& cp){
		ptr_ = cp.ptr_;
	}
	template<class T>
	cow_ptr<T>& cow_ptr<T>::operator = (const cow_ptr& cp){
		if (this != &cp){
			ptr_.decrease_ref();
			ptr_ = cp.ptr_;
		}
		return *this;
	}
	template<class T>
邹晓航 已提交
52 53 54 55 56 57 58 59 60 61 62
	typename cow_ptr<T>::element_type *cow_ptr<T>::get(){
		return ptr_.get();
	}
	template<class T>
	const typename cow_ptr<T>::element_type *cow_ptr<T>::get()const{
		return ptr_.get();
	}
	template<class T>
	cow_ptr<T>::operator bool()const{
		return ptr_ != nullptr;
	}
邹晓航 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
	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); 
	}
邹晓航 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

	template<class T1, class T2>
	bool operator == (const cow_ptr<T1>& cp1, const cow_ptr<T2>& cp2){
		return cp1.ptr_ == cp2.ptr_;
	}
	template<class T>
	bool operator == (const cow_ptr<T>& cp, nullptr_t p){
		return cp.ptr_ == p;
	}
	template<class T>
	bool operator == (nullptr_t p, const cow_ptr<T>& cp){
		return cp == p;
	}
	template<class T1, class T2>
	bool operator != (const cow_ptr<T1>& cp1, const cow_ptr<T2>& cp2){
		return !(cp1 == cp2);
	}
	template<class T>
	bool operator != (const cow_ptr<T>& cp, nullptr_t p){
		return !(cp == p);
	}
	template<class T>
	bool operator != (nullptr_t p, const cow_ptr<T>& cp){
		return !(cp == p);
	}
邹晓航 已提交
104 105 106
}

#endif