summaryrefslogtreecommitdiff
path: root/libodb/odb/details/buffer.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'libodb/odb/details/buffer.hxx')
-rw-r--r--libodb/odb/details/buffer.hxx92
1 files changed, 92 insertions, 0 deletions
diff --git a/libodb/odb/details/buffer.hxx b/libodb/odb/details/buffer.hxx
new file mode 100644
index 0000000..558be9b
--- /dev/null
+++ b/libodb/odb/details/buffer.hxx
@@ -0,0 +1,92 @@
+// file : odb/details/buffer.hxx
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_BUFFER_DETAILS_HXX
+#define ODB_BUFFER_DETAILS_HXX
+
+#include <odb/pre.hxx>
+
+#include <new>
+#include <cstddef> // std::size_t
+
+#include <odb/details/export.hxx>
+
+namespace odb
+{
+ namespace details
+ {
+ class LIBODB_EXPORT basic_buffer_base
+ {
+ public:
+ ~basic_buffer_base ()
+ {
+ if (data_ != 0)
+ operator delete (data_);
+ }
+
+ basic_buffer_base (std::size_t capacity)
+ : capacity_ (capacity)
+ {
+ data_ = capacity_ == 0 ? 0 : operator new (capacity_);
+ }
+
+ std::size_t
+ capacity () const
+ {
+ return capacity_;
+ }
+
+ void
+ capacity (std::size_t, std::size_t data_size = 0);
+
+ protected:
+ void* data_;
+ std::size_t capacity_;
+ };
+
+ template <typename T>
+ class basic_buffer: public basic_buffer_base
+ {
+ public:
+ basic_buffer (std::size_t capacity = 256)
+ : basic_buffer_base (capacity)
+ {
+ }
+
+ T*
+ data ()
+ {
+ return static_cast<T*> (data_);
+ }
+
+ const T*
+ data () const
+ {
+ return static_cast<T*> (data_);
+ }
+
+ // Note that strictly speaking the return type should be void* const*
+ // but that would make using this function too awkward since we often
+ // store the result as void*.
+ //
+ void**
+ data_ptr ()
+ {
+ return &data_;
+ }
+
+ const void* const*
+ data_ptr () const
+ {
+ return &data_;
+ }
+ };
+
+ typedef basic_buffer<char> buffer;
+ typedef basic_buffer<unsigned char> ubuffer;
+ }
+}
+
+#include <odb/post.hxx>
+
+#endif // ODB_BUFFER_DETAILS_HXX