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.
264 lines
6.2 KiB
264 lines
6.2 KiB
/*****************************************************************************/ |
|
// Copyright 2006 Adobe Systems Incorporated |
|
// All Rights Reserved. |
|
// |
|
// NOTICE: Adobe permits you to use, modify, and distribute this file in |
|
// accordance with the terms of the Adobe license agreement accompanying it. |
|
/*****************************************************************************/ |
|
|
|
/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_auto_ptr.h#2 $ */ |
|
/* $DateTime: 2012/07/11 10:36:56 $ */ |
|
/* $Change: 838485 $ */ |
|
/* $Author: tknoll $ */ |
|
|
|
/** \file |
|
* Class to implement std::auto_ptr like functionality even on platforms which do not |
|
* have a full Standard C++ library. |
|
*/ |
|
|
|
/*****************************************************************************/ |
|
|
|
#ifndef __dng_auto_ptr__ |
|
#define __dng_auto_ptr__ |
|
|
|
#include "dng_memory.h" |
|
|
|
#include <memory> |
|
#include <stddef.h> |
|
#include <stdlib.h> |
|
|
|
/*****************************************************************************/ |
|
|
|
// The following template has similar functionality to the STL auto_ptr, without |
|
// requiring all the weight of STL. |
|
|
|
/*****************************************************************************/ |
|
|
|
/// \brief A class intended to be used in stack scope to hold a pointer from new. The |
|
/// held pointer will be deleted automatically if the scope is left without calling |
|
/// Release on the AutoPtr first. |
|
|
|
template<class T> |
|
class AutoPtr |
|
{ |
|
|
|
private: |
|
|
|
T *p_; |
|
|
|
public: |
|
|
|
/// Construct an AutoPtr with no referent. |
|
|
|
AutoPtr () : p_ (0) { } |
|
|
|
/// Construct an AutoPtr which owns the argument pointer. |
|
/// \param p pointer which constructed AutoPtr takes ownership of. p will be |
|
/// deleted on destruction or Reset unless Release is called first. |
|
|
|
explicit AutoPtr (T *p) : p_( p ) { } |
|
|
|
/// Reset is called on destruction. |
|
|
|
~AutoPtr (); |
|
|
|
/// Call Reset with a pointer from new. Uses T's default constructor. |
|
|
|
void Alloc (); |
|
|
|
/// Return the owned pointer of this AutoPtr, NULL if none. No change in |
|
/// ownership or other effects occur. |
|
|
|
T *Get () const { return p_; } |
|
|
|
/// Return the owned pointer of this AutoPtr, NULL if none. The AutoPtr gives |
|
/// up ownership and takes NULL as its value. |
|
|
|
T *Release (); |
|
|
|
/// If a pointer is owned, it is deleted. Ownership is taken of passed in |
|
/// pointer. |
|
/// \param p pointer which constructed AutoPtr takes ownership of. p will be |
|
/// deleted on destruction or Reset unless Release is called first. |
|
|
|
void Reset (T *p); |
|
|
|
/// If a pointer is owned, it is deleted and the AutoPtr takes NULL as its |
|
/// value. |
|
|
|
void Reset (); |
|
|
|
/// Allows members of the owned pointer to be accessed directly. It is an |
|
/// error to call this if the AutoPtr has NULL as its value. |
|
|
|
T *operator-> () const { return p_; } |
|
|
|
/// Returns a reference to the object that the owned pointer points to. It is |
|
/// an error to call this if the AutoPtr has NULL as its value. |
|
|
|
T &operator* () const { return *p_; } |
|
|
|
/// Swap with another auto ptr. |
|
|
|
friend inline void Swap (AutoPtr< T > &x, AutoPtr< T > &y) |
|
{ |
|
T* temp = x.p_; |
|
x.p_ = y.p_; |
|
y.p_ = temp; |
|
} |
|
|
|
private: |
|
|
|
// Hidden copy constructor and assignment operator. I don't think the STL |
|
// "feature" of grabbing ownership of the pointer is a good idea. |
|
|
|
AutoPtr (AutoPtr<T> &rhs); |
|
|
|
AutoPtr<T> & operator= (AutoPtr<T> &rhs); |
|
|
|
}; |
|
|
|
/*****************************************************************************/ |
|
|
|
template<class T> |
|
AutoPtr<T>::~AutoPtr () |
|
{ |
|
|
|
delete p_; |
|
p_ = 0; |
|
|
|
} |
|
|
|
/*****************************************************************************/ |
|
|
|
template<class T> |
|
T *AutoPtr<T>::Release () |
|
{ |
|
T *result = p_; |
|
p_ = 0; |
|
return result; |
|
} |
|
|
|
/*****************************************************************************/ |
|
|
|
template<class T> |
|
void AutoPtr<T>::Reset (T *p) |
|
{ |
|
|
|
if (p_ != p) |
|
{ |
|
if (p_ != 0) |
|
delete p_; |
|
p_ = p; |
|
} |
|
|
|
} |
|
|
|
/*****************************************************************************/ |
|
|
|
template<class T> |
|
void AutoPtr<T>::Reset () |
|
{ |
|
|
|
if (p_ != 0) |
|
{ |
|
delete p_; |
|
p_ = 0; |
|
} |
|
|
|
} |
|
|
|
/*****************************************************************************/ |
|
|
|
template<class T> |
|
void AutoPtr<T>::Alloc () |
|
{ |
|
this->Reset (new T); |
|
} |
|
|
|
/*****************************************************************************/ |
|
|
|
/// \brief A class that provides a variable-length array that automatically |
|
/// deletes the underlying memory on scope exit. |
|
/// |
|
/// T is not required to be movable. The class is implemented using |
|
/// dng_std_vector but purposely does not use any member functions that require |
|
/// T to be movable. |
|
|
|
template<typename T> |
|
class AutoArray |
|
{ |
|
|
|
public: |
|
/// Construct an AutoArray that refers to a null pointer. |
|
|
|
AutoArray () { } |
|
|
|
/// Construct an AutoArray containing 'count' elements, which are |
|
/// default-constructed. If an out-of-memory condition occurs, a |
|
/// dng_exception with error code dng_error_memory is thrown. |
|
|
|
explicit AutoArray (size_t count) |
|
: vector_(new dng_std_vector<T>(count)) |
|
{ |
|
} |
|
|
|
/// Changes the size of the AutoArray to 'count' elements. The new |
|
/// elements are default-constructed. The previously existing elements |
|
/// of the array are destroyed. If an out-of-memory condition occurs, a |
|
/// dng_exception with error code dng_error_memory is thrown. |
|
|
|
void Reset (size_t count) |
|
{ |
|
vector_.reset(new dng_std_vector<T>(count)); |
|
} |
|
|
|
/// Allows indexing into the AutoArray. The index 'i' must be |
|
/// non-negative and smaller than size of the array (the value that was |
|
/// passed to the constructor or to Reset()). |
|
|
|
T &operator[] (ptrdiff_t i) |
|
{ |
|
return (*vector_) [i]; |
|
} |
|
const T &operator[] (ptrdiff_t i) const |
|
{ |
|
return (*vector_) [i]; |
|
} |
|
|
|
/// Return a pointer to the beginning of the array. |
|
|
|
T *Get () |
|
{ |
|
if (vector_) |
|
return vector_->data(); |
|
else |
|
return nullptr; |
|
} |
|
const T *Get () const |
|
{ |
|
if (vector_) |
|
return vector_->data(); |
|
else |
|
return nullptr; |
|
} |
|
|
|
private: |
|
|
|
// Hidden copy constructor and assignment operator. |
|
|
|
AutoArray (const AutoArray &); |
|
|
|
const AutoArray & operator= (const AutoArray &); |
|
|
|
private: |
|
|
|
std::unique_ptr<dng_std_vector<T> > vector_; |
|
|
|
}; |
|
|
|
/*****************************************************************************/ |
|
|
|
#endif |
|
|
|
/*****************************************************************************/
|
|
|