aboutsummaryrefslogtreecommitdiffstats
path: root/src/util/WritableBuffer.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/WritableBuffer.hxx')
-rw-r--r--src/util/WritableBuffer.hxx93
1 files changed, 61 insertions, 32 deletions
diff --git a/src/util/WritableBuffer.hxx b/src/util/WritableBuffer.hxx
index 4e529cfad..7267813f5 100644
--- a/src/util/WritableBuffer.hxx
+++ b/src/util/WritableBuffer.hxx
@@ -32,7 +32,11 @@
#include "Compiler.h"
-#include <stddef.h>
+#include <cstddef>
+
+#ifndef NDEBUG
+#include <assert.h>
+#endif
/**
* A reference to a memory area that is writable.
@@ -41,47 +45,72 @@
*/
template<typename T>
struct WritableBuffer {
- typedef size_t size_type;
- typedef T *pointer_type;
- typedef const T *const_pointer_type;
- typedef pointer_type iterator;
- typedef const_pointer_type const_iterator;
+ typedef size_t size_type;
+ typedef T *pointer_type;
+ typedef const T *const_pointer_type;
+ typedef pointer_type iterator;
+ typedef const_pointer_type const_iterator;
+
+ pointer_type data;
+ size_type size;
+
+ WritableBuffer() = default;
- pointer_type data;
- size_type size;
+ constexpr WritableBuffer(std::nullptr_t):data(nullptr), size(0) {}
- WritableBuffer() = default;
+ constexpr WritableBuffer(pointer_type _data, size_type _size)
+ :data(_data), size(_size) {}
- constexpr WritableBuffer(pointer_type _data, size_type _size)
- :data(_data), size(_size) {}
+ constexpr static WritableBuffer Null() {
+ return { nullptr, 0 };
+ }
+
+ /**
+ * Cast a WritableBuffer<void> to a WritableBuffer<T>. A "void"
+ * buffer records its size in bytes, and when casting to "T",
+ * the assertion below ensures that the size is a multiple of
+ * sizeof(T).
+ */
+#ifdef NDEBUG
+ constexpr
+#endif
+ static WritableBuffer<T> FromVoid(WritableBuffer<void> other) {
+ static_assert(sizeof(T) > 0, "Empty base type");
+#ifndef NDEBUG
+ assert(other.size % sizeof(T) == 0);
+#endif
+ return WritableBuffer<T>(pointer_type(other.data),
+ other.size / sizeof(T));
+ }
- constexpr static WritableBuffer Null() {
- return { nullptr, 0 };
- }
+ constexpr WritableBuffer<void> ToVoid() const {
+ static_assert(sizeof(T) > 0, "Empty base type");
+ return WritableBuffer<void>(data, size * sizeof(T));
+ }
- constexpr bool IsNull() const {
- return data == nullptr;
- }
+ constexpr bool IsNull() const {
+ return data == nullptr;
+ }
- constexpr bool IsEmpty() const {
- return size == 0;
- }
+ constexpr bool IsEmpty() const {
+ return size == 0;
+ }
- constexpr iterator begin() const {
- return data;
- }
+ constexpr iterator begin() const {
+ return data;
+ }
- constexpr iterator end() const {
- return data + size;
- }
+ constexpr iterator end() const {
+ return data + size;
+ }
- constexpr const_iterator cbegin() const {
- return data;
- }
+ constexpr const_iterator cbegin() const {
+ return data;
+ }
- constexpr const_iterator cend() const {
- return data + size;
- }
+ constexpr const_iterator cend() const {
+ return data + size;
+ }
};
#endif