Skip to content

Instantly share code, notes, and snippets.

@argv0
Created June 25, 2011 06:13
Show Gist options
  • Save argv0/1046223 to your computer and use it in GitHub Desktop.
Save argv0/1046223 to your computer and use it in GitHub Desktop.
template <typename T, std::size_t SIZE=256>
class auto_buffer
{
public:
typedef T value_type;
typedef std::size_t size_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
static const size_t space = SIZE;
public: // construction
explicit auto_buffer(size_type size)
: buffer_((space < size) ? (T*)malloc(size*sizeof(T)) : &internal_[0]),
size_((buffer_ != 0) ? size : 0)
{
}
~auto_buffer()
{
if (space < size_)
{
assert(buffer_ != 0);
assert(&internal_[0] != buffer_);
free(buffer_);
}
}
public: // operators
operator pointer() { return buffer_; }
reference operator[](size_type index) { return buffer_[index]; }
const_reference operator[](size_type index) const { return buffer_[index]; }
operator const_pointer() const { return buffer_; }
public: // accessors
pointer data() { return buffer_; }
const_pointer data() const { return buffer_; }
size_type size() const { return size_; }
bool empty() const { return size_ == 0; }
private:
value_type* buffer_;
size_type size_;
value_type internal_[SIZE];
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment