#pragma once
#include <assert.h>
#define DISALLOW_COPY_AND_ASSIGN(TypeName)\
TypeName(const TypeName&)();
void operator(const TypeName&);
template<class T>
class Scope_ref{
public:
explicit Scope_ref(T* ptr):ptr_(ptr){}
~Scope_ref(){
delete ptr_;
}
T* get(){
assert(ptr_);
return ptr_;
}
void Reset(T* p){
if (p != ptr_)
{
delete ptr_;
ptr_ = p;
}
}
void Release(){
assert(ptr_);
T* temp = ptr_;
ptr_ = NULL;
return temp;
}
T& operator*(){
return *ptr_;
}
T* operator->(){
return ptr_;
}
bool operator==(T* p)const {return p == ptr_;}
bool operator!=(T* p) const {return p!= ptr_;}
private:
T* ptr_;
template<class T2> bool operator==(Scope_ref<T2> const&t2)const;
template<class T2> bool operator!=(Scope_ref<T2> const&t2)const;
DISALLOW_COPY_AND_ASSIGN(Scope_ref);
};