util/WritableBuffer: add cast methods

This commit is contained in:
Max Kellermann 2013-12-15 23:01:01 +01:00
parent e5a2efaa65
commit f2a20a0a80

View File

@ -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.
@ -52,6 +56,8 @@ struct WritableBuffer {
WritableBuffer() = default;
constexpr WritableBuffer(std::nullptr_t):data(nullptr), size(0) {}
constexpr WritableBuffer(pointer_type _data, size_type _size)
:data(_data), size(_size) {}
@ -59,6 +65,29 @@ struct WritableBuffer {
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 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;
}