Swin.C

 

Direct3D接口自动指针模板

为了方便使用Direct3D接口写的模板

 

代码

 

4-10更新版本

 

代码
#ifndef _DX_AUTO_PTR_
#define _DX_AUTO_PTR_
#include 
<exception>
#include 
<assert.h>

/*************
*安全释放接口*
************
*/
template
< class T >
void DX_Releaser( T & ptr )
{
    
if( ptr != NULL )
    {
        ptr
->Release();
        ptr 
= NULL;
    }
}

template
< class T >
struct DX_Ptr_Checker_Assert
{
    
static void _Ptr_Check( T & ptr )
    {
        assert( ptr 
!= NULL );
    }
};

template
< class T >
struct DX_Ptr_Checker_Null
{
    
static void _Ptr_Check( T & ptr )
    {
    }
};

/*********************************************************
*DX接口不应该主动使用赋值符,这里将赋值定义为会使右值无效**
*使用Release时应使用DX_auto_ptr的成员函数。             **
*必须要使用时用get方法返回原生指针进行操作。            **
*用于管理DX接口的模版                                   **
********************************************************
*/
template
< class T , 
            template
< class T > class Get_Ptr_Check_Rule = DX_Ptr_Checker_Assert >
class DX_auto_ptr : public Get_Ptr_Check_Rule< T >
{
public:
    DX_auto_ptr():_ptr(NULL){}
    
~DX_auto_ptr()
    {
        DX_Releaser( _ptr );
    }
    
//正确释放指针
    void Release() 
    {
        DX_Releaser( _ptr );
    }
    T 
*operator &() 
    { 
        
return &_ptr; 
    }
    T 
&operator ->()
    {
        _Ptr_Check(_ptr);
        
return _ptr; 
    }
    
bool isNull()
    {
        
return _ptr == NULL;
    }
    
//交换指针
    void swap( DX_auto_ptr<T,Get_Ptr_Check_Rule> &ptr )
    {
        T temp 
= ptr._ptr;
        ptr._ptr 
= _ptr;
        _ptr 
= temp;
    }
    
//重载转换操作符
    operator T() const
    { 
        
return _ptr;
    }
    
//取原生指针
    T get()
    { 
        
return _ptr;
    }
    
//设置原生指针    
    void set(T ptr)
    { 
        _ptr 
= ptr;
    }
protected:
    DX_auto_ptr( DX_auto_ptr
<T,Get_Ptr_Check_Rule>& ptr );//不允许
    DX_auto_ptr<T> &operator =( DX_auto_ptr<T,Get_Ptr_Check_Rule> &ptr );//不允许
    T _ptr;
};

template
< class T >
struct Bound_Detector_Null
{
    
static void _Bound_Check( int cur , int up )
    {
    }
};

template
< class T >
struct Bound_Detector_Throw
{
    
class OutBoundary : public std::exception{};
    
static void _Bound_Check( int cur , int up )
    {
        
if( cur <  0 || cur > up )
            
throw OutBoundary();
    }
};

template
< class T >
struct Bound_Detector_Assert
{
    
static void _Bound_Check( int cur , int up )
    {
        assert( cur 
>=  0 && cur <= up );
    }
};

/*********************************************************
**不支持动态增加或删除。set_ptrs是不安全的方法。        **
********************************************************
*/
template
<class T , 
            template
< class T > class Get_Ptr_Check_Rule = DX_Ptr_Checker_Assert ,
            template
< class T > class Bound_Check_Rule = Bound_Detector_Assert >
class DX_auto_ptr_array : public Bound_Check_Rule< T > , public Get_Ptr_Check_Rule< DX_auto_ptr<T,Get_Ptr_Check_Rule> * >
{
public:
    DX_auto_ptr_array():_ptrs(NULL){}
    
void new_ptrs( int len )
    { 
        _ptrs 
= new DX_auto_ptr< T , Get_Ptr_Check_Rule >[len];
        _len 
= len; 
    }
    
void Release()
    {
        
if( _ptrs != NULL )
        { 
            delete[]_ptrs;
            _ptrs 
= NULL;
            _len 
= 0;
        } 
    }
    DX_auto_ptr
<T> &operator []( unsigned long i )
    { 
        _Ptr_Check( _ptrs );
        _Bound_Check( i , _len );
        
return _ptrs[i];
    }
    
//交换指针
    void swap( DX_auto_ptr_array< T , Get_Ptr_Check_Rule , Bound_Check_Rule > & ptr )
    { 
        DX_auto_ptr
<T,Get_Ptr_Check_Rule> * temp = ptr._ptrs ; 
        ptr._ptrs 
= _ptrs ;
        _ptrs 
= temp; 
        _len
^=ptr->_len;
        ptr
->_len^=_len;
        _len
^=ptr->_len;
    }
    
~DX_auto_ptr_array()
    {
        Release();
    }
protected:
    DX_auto_ptr_array( DX_auto_ptr_array
< T , Get_Ptr_Check_Rule , Bound_Check_Rule >& );//不允许
    DX_auto_ptr_array< T , Get_Ptr_Check_Rule , Bound_Check_Rule > & operator =
        ( DX_auto_ptr_array
< T , Get_Ptr_Check_Rule , Bound_Check_Rule >& );//不允许
    unsigned int _len;
    DX_auto_ptr
<T,Get_Ptr_Check_Rule> *_ptrs;
}; 


#endif

 

 

posted on 2009-12-01 23:59  Swin.C  阅读(232)  评论(0编辑  收藏  举报

导航