Created
June 25, 2011 06:13
-
-
Save argv0/1046223 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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