aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/buffer.ixx
diff options
context:
space:
mode:
Diffstat (limited to 'libxsde/xsde/cxx/buffer.ixx')
-rw-r--r--libxsde/xsde/cxx/buffer.ixx213
1 files changed, 213 insertions, 0 deletions
diff --git a/libxsde/xsde/cxx/buffer.ixx b/libxsde/xsde/cxx/buffer.ixx
new file mode 100644
index 0000000..78f3633
--- /dev/null
+++ b/libxsde/xsde/cxx/buffer.ixx
@@ -0,0 +1,213 @@
+// file : xsde/cxx/buffer.ixx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <string.h> // memcmp
+
+namespace xsde
+{
+ namespace cxx
+ {
+ // c-tors & d-tor
+ //
+ inline buffer::
+ ~buffer ()
+ {
+ if (data_)
+ operator delete (data_);
+ }
+
+ inline buffer::
+ buffer ()
+ : data_ (0), size_ (0), capacity_ (0)
+ {
+ }
+
+#ifndef XSDE_EXCEPTIONS
+ inline buffer::error buffer::
+#else
+ inline void buffer::
+#endif
+ attach (void* data, size_t size, size_t cap)
+ {
+ if (size > cap)
+ {
+#ifdef XSDE_EXCEPTIONS
+ throw bounds ();
+#else
+ return error_bounds;
+#endif
+ }
+
+ if (data_)
+ operator delete (data_);
+
+ data_ = reinterpret_cast<char*> (data);
+ size_ = size;
+ capacity_ = cap;
+
+#ifndef XSDE_EXCEPTIONS
+ return error_none;
+#endif
+ }
+
+ inline void* buffer::
+ detach ()
+ {
+ void* r = data_;
+
+ data_ = 0;
+ size_ = 0;
+ capacity_ = 0;
+
+ return r;
+ }
+
+ inline void buffer::
+ swap (buffer& other)
+ {
+ char* d = data_;
+ size_t s = size_;
+ size_t c = capacity_;
+
+ data_ = other.data_;
+ size_ = other.size_;
+ capacity_ = other.capacity_;
+
+ other.data_ = d;
+ other.size_ = s;
+ other.capacity_ = c;
+ }
+
+ //
+ //
+ inline size_t buffer::
+ capacity () const
+ {
+ return capacity_;
+ }
+
+#ifdef XSDE_EXCEPTIONS
+ inline bool buffer::
+ capacity (size_t cap)
+ {
+ return capacity (cap, true);
+ }
+#else
+ inline buffer::error buffer::
+ capacity (size_t cap)
+ {
+ return capacity (cap, true, 0);
+ }
+
+ inline buffer::error buffer::
+ capacity (size_t cap, bool& moved)
+ {
+ return capacity (cap, true, &moved);
+ }
+#endif
+
+ inline size_t buffer::
+ size () const
+ {
+ return size_;
+ }
+
+#ifdef XSDE_EXCEPTIONS
+ inline bool buffer::
+ size (size_t size)
+ {
+ bool r = false;
+
+ if (size > capacity_)
+ r = capacity (size);
+
+ size_ = size;
+
+ return r;
+ }
+#else
+ inline buffer::error buffer::
+ size (size_t size)
+ {
+ error r = error_none;
+
+ if (size > capacity_)
+ r = capacity (size);
+
+ if (r == error_none)
+ size_ = size;
+
+ return r;
+ }
+
+ inline buffer::error buffer::
+ size (size_t size, bool& moved)
+ {
+ error r = error_none;
+ moved = false;
+
+ if (size > capacity_)
+ r = capacity (size, moved);
+
+ if (r == error_none)
+ size_ = size;
+
+ return r;
+ }
+#endif
+
+ //
+ //
+ inline const char* buffer::
+ data () const
+ {
+ return data_;
+ }
+
+ inline char* buffer::
+ data ()
+ {
+ return data_;
+ }
+
+ inline const char* buffer::
+ begin () const
+ {
+ return data_;
+ }
+
+ inline char* buffer::
+ begin ()
+ {
+ return data_;
+ }
+
+ inline const char* buffer::
+ end () const
+ {
+ return data_ + size_;
+ }
+
+ inline char* buffer::
+ end ()
+ {
+ return data_ + size_;
+ }
+
+ inline bool
+ operator== (const buffer& x, const buffer& y)
+ {
+ return x.size () == y.size () &&
+ memcmp (x.data (), y.data (), x.size ()) == 0;
+ }
+
+ inline bool
+ operator!= (const buffer& x, const buffer& y)
+ {
+ return !(x == y);
+ }
+ }
+}
+