#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; };