From b73a3c677171a13bdd7b0044071601647bfbfe67 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 10 Mar 2026 09:40:37 +0000 Subject: Refactor glMappedBufferWriter into a DSA wrapper for std::span --- lib/glMappedBufferSpan.h | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 lib/glMappedBufferSpan.h (limited to 'lib/glMappedBufferSpan.h') diff --git a/lib/glMappedBufferSpan.h b/lib/glMappedBufferSpan.h new file mode 100644 index 0000000..d30c911 --- /dev/null +++ b/lib/glMappedBufferSpan.h @@ -0,0 +1,51 @@ +#pragma once + +#include "special_members.h" +#include +#include +#include +#include + +template class glMappedBufferSpan : public std::span { +public: + glMappedBufferSpan(GLuint buffer, size_t count, GLenum access, bool reinit) : + std::span {[&]() { + if (reinit) { + glNamedBufferData( + buffer, static_cast(sizeof(T) * count), nullptr, GL_DYNAMIC_DRAW); + } + return static_cast(glMapNamedBuffer(buffer, access)); + }(), + count}, + buffer {buffer} + { + } + + ~glMappedBufferSpan() + { + if (buffer) { + glUnmapNamedBuffer(buffer); + } + } + + glMappedBufferSpan(glMappedBufferSpan && other) noexcept : + std::span {other}, buffer {std::exchange(other.buffer, 0)} + { + } + + glMappedBufferSpan & + operator=(glMappedBufferSpan && other) noexcept + { + std::span::span = other; + if (buffer) { + glUnmapBuffer(buffer); + } + buffer = std::exchange(other.buffer, 0); + return *this; + } + + NO_COPY(glMappedBufferSpan); + +private: + GLuint buffer; +}; -- cgit v1.3