auto_buffer.h.
(B)Leading Edge
Simple Memory Management Classes
Jack Reeves
Listing 1. auto_buffer.h.
#ifndef BEST_AUTO_BUFFER_H
#define BEST_AUTO_BUFFER_H
namespace BEST {
template<class T>
class auto_buffer {
T* _ptr;
size_t _siz;
public:
typedef T element_type;
// construct/destroy/copy
explicit auto_buffer(T* p = 0) throw()
: _ptr(p), _siz(-1) {}
auto_buffer(auto_buffer<T>& rhs) throw()
: _ptr(rhs._ptr), _siz(rhs.siz) { rhs.release(); }
~auto_buffer()
{ delete[] _ptr; }
auto_buffer<T>& operator=(auto_buffer<T>& rhs);
// operations
T* data() const throw()
{ return _ptr; }
T* release() throw();
size_t size() const throw()
{ return _siz; }
void size(size_t val) throw()
{ _siz = val; }
};
// All operations are inlined
template<class T>
inline auto_buffer<T>&
auto_buffer<T>::operator=(auto_buffer<T>& rhs)
{
delete[] _ptr;
_siz = rhs._siz; // release clears size
_ptr = rhs.release();
return *this;
}
template<class T>
inline T*
auto_buffer<T>::release() throw()
{
T* p = _ptr;
_ptr = 0;
_siz = 0;
return p;
}
} // end namespace
#endif