wzsafepointer.hxx

来自「有限元学习研究用源代码(老外的),供科研人员参考」· HXX 代码 · 共 115 行

HXX
115
字号
#ifndef WZSAFEPOINTER_HXX
#define WZSAFEPOINTER_HXX

#include "wz.hxx"

template<class T> class wzProxy;

// wzProxy<T> behaves like T*;
// requires for T a base class or implicit conversion to
class wzProxyTarget;

class wzAccessControl;
class wzProxyBase;

template<class T> class wzProxy{
  T* P;
public:
  T* operator->() const			{return P;}
  T& operator*() const			{return *P;}
  wzBoolean operator==(const wzProxy<T>& p) const	{return P==p.P;}
  wzBoolean operator!=(const wzProxy<T>& p) const	{return P!=p.P;}
  //  void	extractAndProtect(void** adr)	{*adr=(void*)P; P=0;}
  //  void  insertAndUnprotect(void* adr);
  wzProxy<T>& operator=(const wzProxy<T>& p);
  wzProxy():P(0){;}
  wzProxy(T* p);
  wzProxy(wzProxyBase p):P((T*) p.P){;}
  wzProxy(const wzProxy<T>& x);
  ~wzProxy();
};

class wzProxyHangingError: public wzError{
public: wzProxyHangingError():wzError("wzsafepointertest","SafePointerHangingError"){;}
};
class wzProxyLockError: public wzError{
public: wzProxyLockError():wzError("wzsafepointertest","SafePointerLockError"){;}
};

class wzAccessControl{
        wzInteger C;
public:
	void 		lock()     	{C = -1;}
	void 		unlock()   	{C = 0;}
	void 		access()   	{C++;}
        void 		release()	{C--;}
	wzBoolean	free()		const {return C==0;}
        wzBoolean       used()		const {return C!=0;}
        wzBoolean       accessed()	const {return C >0;}
        wzBoolean       locked()	const {return C <0;}
        wzBoolean       unlocked()	const {return C>=0;}
        wzAccessControl():C(0){;}
};

class wzProxyBase{
protected:
friend class wzProxyTarget;
	wzProxyBase(void* p):P(p){;}
public:
	void* P;
};

class wzProxyTarget{
  wzIndex C;
public:
  wzInteger     accessCount(){return C>>2;}
  //  void          lockPointerAccess()           {if(!(C&1)) C += 1;}
  //  void          unlockPointerAccess()   	{if(  C&1 ) C -= 1;}
  wzProxyTarget():C(0){;}
// protected to friend classes wzProxy<*>
  void		checkPointerAccess() const {if(C&1){return;}}//throw wzProxyLockError();}}
  wzBoolean     noPointerAccess()    const 	{return !(C>>1);}
  void          makePointerAccess()     	{C += 4;}
  void          releasePointerAccess()  	{C -= 4;}
  wzProxyBase operator&() const
  {if(C&1) 	{throw wzProxyLockError();}
   if(C==0)	((wzProxyTarget *)this)->C  = 6; 
   else		((wzProxyTarget *)this)->C += 4;
   return wzProxyBase((void*)this);
  }
protected: // allows these operations for derived classes
  wzProxyTarget& operator=
  (const wzProxyTarget& x){return *this;}
  wzProxyTarget
  (const wzProxyTarget& x):C(0){;}
  ~wzProxyTarget()
  {if(C>>2)  {throw wzProxyHangingError();}}
};

template<class T> inline wzProxy<T>&
	wzProxy<T>::operator=(const wzProxy<T>& p)
{
 if(P){P->releasePointerAccess(); if(P->noPointerAccess()) delete P;}
 P=p.P; if(P){P->checkPointerAccess(); P->makePointerAccess();}
 return *this;
}


template<class T> inline wzProxy<T>::wzProxy(T* p)
:P(p)
{if(P){P->checkPointerAccess(); P->makePointerAccess();}}

template<class T> inline wzProxy<T>::wzProxy
        			(const wzProxy<T>& x)
:P(x.P)
{if(P){P->checkPointerAccess(); P->makePointerAccess();}}

template<class T> inline wzProxy<T>::~wzProxy()
{if(P){ P->releasePointerAccess(); if(P->noPointerAccess()) delete P;}}

/*
template<class T> inline void wzProxy<T>::insertAndUnprotect(void* adr)
{*this=0; P=adr;} 
*/
#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?