template<class T>
class auto_buffer
{
private:
T* buffer;
/// no copy nor assignment
auto_buffer(const auto_buffer&);
auto_buffer& operator=(const auto_buffer&);
public:
explicit auto_buffer (size_t size = 0) throw()
: buffer (size == 0 ? NULL : new T[size]())
{
}
~auto_buffer()
{
delete[] buffer;
}
operator T*() const throw()
{
return buffer;
}
operator void*() const throw()
{
return buffer;
}
operator bool() const throw()
{
return buffer != NULL;
}
T* operator->() const throw()
{
return buffer;
}
T *get() const throw()
{
return buffer;
}
T* release() throw()
{
T* temp = buffer;
buffer = NULL;
return temp;
}
void reset (size_t newSize = 0)
{
delete[] buffer;
// first set pointer to null so that it doesn't persist a dangling pointer
// in case new[] throws an exception
buffer = 0;
if (newSize > 0)
{
buffer = new T[newSize];
}
}
};