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 +++++++++++++++++++++++++++++ lib/glMappedBufferWriter.cpp | 4 --- lib/glMappedBufferWriter.h | 78 -------------------------------------------- 3 files changed, 51 insertions(+), 82 deletions(-) create mode 100644 lib/glMappedBufferSpan.h delete mode 100644 lib/glMappedBufferWriter.cpp delete mode 100644 lib/glMappedBufferWriter.h (limited to 'lib') 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; +}; diff --git a/lib/glMappedBufferWriter.cpp b/lib/glMappedBufferWriter.cpp deleted file mode 100644 index cc3c413..0000000 --- a/lib/glMappedBufferWriter.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "glMappedBufferWriter.h" -#include - -static_assert(std::weakly_incrementable>); diff --git a/lib/glMappedBufferWriter.h b/lib/glMappedBufferWriter.h deleted file mode 100644 index 05540e4..0000000 --- a/lib/glMappedBufferWriter.h +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once - -#include "special_members.h" -#include -#include -#include - -template class glMappedBufferWriter { -public: - using difference_type = std::ptrdiff_t; - - glMappedBufferWriter(GLenum target, GLuint buffer, size_t count) : - target {target}, data {[&]() { - glBindBuffer(target, buffer); - glBufferData(target, static_cast(sizeof(T) * count), nullptr, GL_DYNAMIC_DRAW); - return static_cast(glMapBuffer(target, GL_WRITE_ONLY)); - }()} - { - } - - ~glMappedBufferWriter() - { - if (target) { - glUnmapBuffer(target); - } - } - - glMappedBufferWriter(glMappedBufferWriter && other) noexcept : - target {std::exchange(other.target, 0)}, data {std::exchange(other.data, nullptr)} - { - } - - glMappedBufferWriter & - operator=(glMappedBufferWriter && other) noexcept - { - if (target) { - glUnmapBuffer(target); - } - target = std::exchange(other.target, 0); - data = std::exchange(other.data, nullptr); - return *this; - } - - NO_COPY(glMappedBufferWriter); - - glMappedBufferWriter & - operator++() - { - data++; - return *this; - } - - glMappedBufferWriter & - operator++(int) - { - glMappedBufferWriter rtn {data}; - data++; - return rtn; - } - - T & - operator*() - { - return *data; - } - - T * - operator->() const - { - return data; - } - -private: - explicit glMappedBufferWriter(T * data) : target {0}, data {data} { } - - GLenum target; - T * data; -}; -- cgit v1.3