You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
275 lines
5.7 KiB
275 lines
5.7 KiB
//////////////////////////////////////////////////////////////////// |
|
// AutoPtr.h |
|
// |
|
// Copyright 2007 cDc@seacave |
|
// Distributed under the Boost Software License, Version 1.0 |
|
// (See http://www.boost.org/LICENSE_1_0.txt) |
|
|
|
#ifndef __SEACAVE_AUTOPTR_H__ |
|
#define __SEACAVE_AUTOPTR_H__ |
|
|
|
|
|
// I N C L U D E S ///////////////////////////////////////////////// |
|
|
|
|
|
// D E F I N E S /////////////////////////////////////////////////// |
|
|
|
|
|
namespace SEACAVE { |
|
|
|
// S T R U C T S /////////////////////////////////////////////////// |
|
|
|
/************************************************************************************** |
|
* CAutoPtr template |
|
* --------------- |
|
* simple smart pointer |
|
**************************************************************************************/ |
|
|
|
struct AutoPtrMoveCopy { |
|
template <typename TYPE> |
|
static inline void Copy(TYPE*& ptrLeft, TYPE*& ptrRight) { |
|
ptrLeft = ptrRight; |
|
ptrRight = NULL; |
|
} |
|
}; |
|
|
|
struct AutoPtrDeepCopy { |
|
template <typename TYPE> |
|
static inline void Copy(TYPE*& ptrLeft, TYPE*& ptrRight) { |
|
ptrLeft = (ptrRight != NULL ? new TYPE(*ptrRight) : (TYPE*)NULL); |
|
} |
|
}; |
|
|
|
template<typename TYPE, typename CopyPolicy=AutoPtrMoveCopy> |
|
class CAutoPtr |
|
{ |
|
private: |
|
typedef TYPE Type; |
|
typedef TYPE* TypePtr; |
|
|
|
public: |
|
inline CAutoPtr() : m_pointer(NULL) |
|
{ // construct with NULL pointer |
|
} |
|
|
|
inline explicit CAutoPtr(TypePtr _Ptr) : m_pointer(_Ptr) |
|
{ // construct from object pointer |
|
} |
|
|
|
inline CAutoPtr(CAutoPtr& _Right) |
|
{ // copy-construct by assuming pointer from _Right CAutoPtr |
|
CopyPolicy::Copy(m_pointer, _Right.m_pointer); |
|
} |
|
|
|
inline ~CAutoPtr() |
|
{ // destroy the object |
|
delete m_pointer; |
|
} |
|
|
|
void Swap(CAutoPtr& _Right) |
|
{ // swap compatible _Right (assume pointer) |
|
const TypePtr tmp(m_pointer); |
|
m_pointer = _Right.m_pointer; |
|
_Right.m_pointer = tmp; |
|
} |
|
|
|
CAutoPtr& operator=(CAutoPtr& _Right) |
|
{ // assign compatible _Right (assume pointer) |
|
if (this != &_Right) { |
|
delete m_pointer; |
|
CopyPolicy::Copy(m_pointer, _Right.m_pointer); |
|
} |
|
return (*this); |
|
} |
|
|
|
CAutoPtr& operator=(TypePtr _Ptr) |
|
{ // assign compatible _Right (assume pointer) |
|
if (m_pointer != _Ptr) { |
|
delete m_pointer; |
|
m_pointer = _Ptr; |
|
} |
|
return (*this); |
|
} |
|
|
|
inline Type& operator*() const |
|
{ // return designated value |
|
ASSERT(m_pointer); |
|
return (*m_pointer); |
|
} |
|
|
|
inline Type* operator->() const |
|
{ // return pointer to class object |
|
ASSERT(m_pointer); |
|
return m_pointer; |
|
} |
|
|
|
inline operator TypePtr() const |
|
{ // return pointer to class object |
|
return m_pointer; |
|
} |
|
|
|
inline operator TypePtr&() |
|
{ // return reference to class object |
|
return m_pointer; |
|
} |
|
|
|
inline bool operator==(const TypePtr _Right) const |
|
{ // return pointer to class object |
|
return (m_pointer == _Right); |
|
} |
|
|
|
inline bool operator!=(const TypePtr _Right) const |
|
{ // return pointer to class object |
|
return (m_pointer != _Right); |
|
} |
|
|
|
inline void Release() |
|
{ // release pointer |
|
delete m_pointer; |
|
m_pointer = NULL; |
|
} |
|
|
|
inline void Reset(TypePtr _Ptr = NULL) |
|
{ // reset pointer |
|
m_pointer = _Ptr; |
|
} |
|
|
|
protected: |
|
TypePtr m_pointer; // the wrapped object pointer |
|
|
|
#ifdef _USE_BOOST |
|
// implement BOOST serialization |
|
friend class boost::serialization::access; |
|
template<class Archive> |
|
void save(Archive& ar, const unsigned int /*version*/) const |
|
{ |
|
ar & m_pointer; |
|
} |
|
template<class Archive> |
|
void load(Archive& ar, const unsigned int /*version*/) |
|
{ |
|
TypePtr newPointer; |
|
ar & newPointer; |
|
operator=(newPointer); |
|
} |
|
BOOST_SERIALIZATION_SPLIT_MEMBER() |
|
#endif |
|
}; |
|
|
|
|
|
template<class TYPE> |
|
class CAutoPtrArr |
|
{ |
|
private: |
|
typedef TYPE Type; |
|
typedef TYPE* TypePtr; |
|
|
|
public: |
|
inline CAutoPtrArr() : m_pointer(NULL) |
|
{ // construct with NULL pointer |
|
} |
|
|
|
inline explicit CAutoPtrArr(TypePtr _Ptr) : m_pointer(_Ptr) |
|
{ // construct from object pointer |
|
} |
|
|
|
inline CAutoPtrArr(CAutoPtrArr& _Right) : m_pointer(_Right.m_pointer) |
|
{ // construct by assuming pointer from _Right CAutoPtrArr |
|
_Right.m_pointer = NULL; |
|
} |
|
|
|
inline ~CAutoPtrArr() |
|
{ // destroy the object |
|
delete[] m_pointer; |
|
} |
|
|
|
CAutoPtrArr& operator=(CAutoPtrArr& _Right) |
|
{ // assign compatible _Right (assume pointer) |
|
if (this != &_Right) |
|
{ |
|
delete[] m_pointer; |
|
m_pointer = _Right.m_pointer; |
|
_Right.m_pointer = NULL; |
|
} |
|
return (*this); |
|
} |
|
|
|
CAutoPtrArr& operator=(TypePtr _Ptr) |
|
{ // assign compatible _Right (assume pointer) |
|
if (m_pointer != _Ptr) |
|
{ |
|
delete[] m_pointer; |
|
m_pointer = _Ptr; |
|
} |
|
return (*this); |
|
} |
|
|
|
inline Type& operator*() const |
|
{ // return designated value |
|
ASSERT(m_pointer); |
|
return (*m_pointer); |
|
} |
|
|
|
inline Type* operator->() const |
|
{ // return pointer to class object |
|
ASSERT(m_pointer); |
|
return m_pointer; |
|
} |
|
|
|
inline operator TypePtr() const |
|
{ // return pointer to class object |
|
return m_pointer; |
|
} |
|
|
|
inline operator TypePtr&() |
|
{ // return reference to class object |
|
return m_pointer; |
|
} |
|
|
|
inline bool operator==(const TypePtr _Right) const |
|
{ // return pointer to class object |
|
return (m_pointer == _Right); |
|
} |
|
|
|
inline bool operator!=(const TypePtr _Right) const |
|
{ // return pointer to class object |
|
return (m_pointer != _Right); |
|
} |
|
|
|
inline void Release() |
|
{ // release pointer |
|
delete[] m_pointer; |
|
m_pointer = NULL; |
|
} |
|
|
|
inline void Reset(TypePtr _Ptr = NULL) |
|
{ // reset pointer |
|
m_pointer = _Ptr; |
|
} |
|
|
|
protected: |
|
TypePtr m_pointer; // the wrapped object pointer |
|
|
|
#ifdef _USE_BOOST |
|
// implement BOOST serialization |
|
friend class boost::serialization::access; |
|
template<class Archive> |
|
void save(Archive& ar, const unsigned int /*version*/) const |
|
{ |
|
ar & m_pointer; |
|
} |
|
template<class Archive> |
|
void load(Archive& ar, const unsigned int /*version*/) |
|
{ |
|
TypePtr newPointer; |
|
ar & newPointer; |
|
operator=(newPointer); |
|
} |
|
BOOST_SERIALIZATION_SPLIT_MEMBER() |
|
#endif |
|
}; |
|
/*----------------------------------------------------------------*/ |
|
|
|
} // namespace SEACAVE |
|
|
|
#endif // __SEACAVE_AUTOPTR_H__
|
|
|