From cabbc5d8586d18459e9cccaf38e261ad772fd493 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 31 May 2013 22:48:05 +0200 Subject: [PATCH] Allow movement of AbstractShaderProgram. --- src/AbstractShaderProgram.cpp | 9 +++++++++ src/AbstractShaderProgram.h | 17 ++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/AbstractShaderProgram.cpp b/src/AbstractShaderProgram.cpp index df463da19..af7e6a218 100644 --- a/src/AbstractShaderProgram.cpp +++ b/src/AbstractShaderProgram.cpp @@ -88,6 +88,10 @@ Int AbstractShaderProgram::maxSupportedVertexAttributeCount() { AbstractShaderProgram::AbstractShaderProgram(): _id(glCreateProgram()) {} +AbstractShaderProgram::AbstractShaderProgram(AbstractShaderProgram&& other) noexcept: _id(other._id) { + other._id = 0; +} + AbstractShaderProgram::~AbstractShaderProgram() { /* Remove current usage from the state */ GLuint& current = Context::current()->state()->shaderProgram->current; @@ -96,6 +100,11 @@ AbstractShaderProgram::~AbstractShaderProgram() { if(_id) glDeleteProgram(_id); } +AbstractShaderProgram& AbstractShaderProgram::operator=(AbstractShaderProgram&& other) noexcept { + std::swap(_id, other._id); + return *this; +} + std::pair AbstractShaderProgram::validate() { glValidateProgram(_id); diff --git a/src/AbstractShaderProgram.h b/src/AbstractShaderProgram.h index 4f38a26d9..9a1b61679 100644 --- a/src/AbstractShaderProgram.h +++ b/src/AbstractShaderProgram.h @@ -286,11 +286,6 @@ comes in handy. class MAGNUM_EXPORT AbstractShaderProgram { friend class Context; - AbstractShaderProgram(const AbstractShaderProgram&) = delete; - AbstractShaderProgram(AbstractShaderProgram&&) = delete; - AbstractShaderProgram& operator=(const AbstractShaderProgram&) = delete; - AbstractShaderProgram& operator=(AbstractShaderProgram&&) = delete; - public: template class Attribute; @@ -311,6 +306,12 @@ class MAGNUM_EXPORT AbstractShaderProgram { */ explicit AbstractShaderProgram(); + /** @brief Copying is not allowed */ + AbstractShaderProgram(const AbstractShaderProgram&) = delete; + + /** @brief Move constructor */ + AbstractShaderProgram(AbstractShaderProgram&& other) noexcept; + /** * @brief Destructor * @@ -319,6 +320,12 @@ class MAGNUM_EXPORT AbstractShaderProgram { */ virtual ~AbstractShaderProgram() = 0; + /** @brief Copying is not allowed */ + AbstractShaderProgram& operator=(const AbstractShaderProgram&) = delete; + + /** @brief Move assignment */ + AbstractShaderProgram& operator=(AbstractShaderProgram&& other) noexcept; + /** @brief OpenGL program ID */ GLuint id() const { return _id; }