>>109997435
btw if you want a simple move-only single-owner OpenGL raii class:
template<typename Handle, void (*Deleter)(GLsizei, Handle const*)>
class GlObject {
public:
explicit GlObject(Handle handle) :
m_handle(handle)
{
}
~GlObject() {
reset();
}
GlObject(GlObject const&) = delete;
GlObject& operator=(GlObject const&) = delete;
GlObject(GlObject&& other) noexcept :
m_handle(other.release())
{
}
GlObject& operator=(GlObject&& other) noexcept {
if(this != &other) {
reset();
m_handle = other.release();
}
return *this;
}
Handle release() {
auto t = m_handle;
m_handle = 0;
return t;
}
void reset() {
Deleter(1, &m_handle);
m_handle = 0;
}
Handle get() const {
return m_handle;
}
private:
Handle m_handle;
};
use like
using GlVertexBufferObject = GlObject<GLuint, glDeleteVertexArrays>
and for shaders whose deleter only takes one arg:
inline void glObjectDeleteShader(GLsizei, GLuint const* ptr) {
glDeleteShader(*ptr);
}
using GlShaderObject = GlObject<GLuint, glObjectDeleteShader>;