From 92c6c45e7d3d95ef6241502824239a28a38dd7c2 Mon Sep 17 00:00:00 2001 From: Constantin Michael Date: Thu, 14 Jul 2011 17:08:34 +0200 Subject: Templatize buffer to avoid duplicate code in unsigned buffer implementation --- libcommon/common/buffer.hxx | 69 ++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/libcommon/common/buffer.hxx b/libcommon/common/buffer.hxx index 97e8962..ada73a1 100644 --- a/libcommon/common/buffer.hxx +++ b/libcommon/common/buffer.hxx @@ -6,36 +6,37 @@ #ifndef LIBCOMMON_COMMON_BUFFER_HXX #define LIBCOMMON_COMMON_BUFFER_HXX +#include #include // std::size_t #include // std::{memcmp,memcpy} -struct buffer +struct basic_buffer_base { - ~buffer () + ~basic_buffer_base () { - delete[] data_; + operator delete (data_); } - buffer () + basic_buffer_base () : data_ (0), size_ (0) { } - buffer (const void* data, std::size_t size) + basic_buffer_base (const void* data, std::size_t size) : data_ (0), size_ (size) { - data_ = new char[size_]; + data_ = operator new (size_); std::memcpy (data_, data, size_); } - buffer (const buffer& y) + basic_buffer_base (const basic_buffer_base& y) : data_ (0), size_ (0) { assign (y.data_, y.size_); } - buffer& - operator= (const buffer& y) + basic_buffer_base& + operator= (const basic_buffer_base& y) { if (this != &y) assign (y.data_, y.size_); @@ -48,8 +49,8 @@ struct buffer { if (size_ < size) { - char* p (new char[size]); - delete[] data_; + void *p (operator new (size)); + operator delete (data_); data_ = p; } @@ -57,18 +58,6 @@ struct buffer size_ = size; } - char* - data () - { - return data_; - } - - const char* - data () const - { - return data_; - } - std::size_t size () const { @@ -76,14 +65,42 @@ struct buffer } bool - operator== (const buffer& y) const + operator== (const basic_buffer_base& y) const { return size_ == y.size_ && std::memcmp (data_, y.data_, size_) == 0; } -private: - char* data_; +protected: + void* data_; std::size_t size_; }; +template +struct basic_buffer: basic_buffer_base +{ + basic_buffer () + { + } + + basic_buffer (const T* data, std::size_t size) + : basic_buffer_base (data, size) + { + } + + T* + data () + { + return static_cast (data_); + } + + const T* + data () const + { + return static_cast (data_); + } +}; + +typedef basic_buffer buffer; +typedef basic_buffer ubuffer; + #endif // LIBCOMMON_COMMON_BUFFER_HXX -- cgit v1.1