gl_resource_manager: Use std::exchange instead of std::swap in move assignment operators and constructors

Move assignment operators and move constructors should ideally leave the object moved from in a state where resources aren't accessable.
This commit is contained in:
MerryMage 2018-03-11 17:22:33 +00:00
parent e9900d8035
commit e3f9bfd850

View file

@ -13,14 +13,16 @@
class OGLTexture : private NonCopyable { class OGLTexture : private NonCopyable {
public: public:
OGLTexture() = default; OGLTexture() = default;
OGLTexture(OGLTexture&& o) {
std::swap(handle, o.handle); OGLTexture(OGLTexture&& o) : handle(std::exchange(o.handle, 0)) {}
}
~OGLTexture() { ~OGLTexture() {
Release(); Release();
} }
OGLTexture& operator=(OGLTexture&& o) { OGLTexture& operator=(OGLTexture&& o) {
std::swap(handle, o.handle); Release();
handle = std::exchange(o.handle, 0);
return *this; return *this;
} }
@ -46,14 +48,16 @@ public:
class OGLSampler : private NonCopyable { class OGLSampler : private NonCopyable {
public: public:
OGLSampler() = default; OGLSampler() = default;
OGLSampler(OGLSampler&& o) {
std::swap(handle, o.handle); OGLSampler(OGLSampler&& o) : handle(std::exchange(o.handle, 0)) {}
}
~OGLSampler() { ~OGLSampler() {
Release(); Release();
} }
OGLSampler& operator=(OGLSampler&& o) { OGLSampler& operator=(OGLSampler&& o) {
std::swap(handle, o.handle); Release();
handle = std::exchange(o.handle, 0);
return *this; return *this;
} }
@ -79,14 +83,16 @@ public:
class OGLShader : private NonCopyable { class OGLShader : private NonCopyable {
public: public:
OGLShader() = default; OGLShader() = default;
OGLShader(OGLShader&& o) {
std::swap(handle, o.handle); OGLShader(OGLShader&& o) : handle(std::exchange(o.handle, 0)) {}
}
~OGLShader() { ~OGLShader() {
Release(); Release();
} }
OGLShader& operator=(OGLShader&& o) { OGLShader& operator=(OGLShader&& o) {
std::swap(handle, o.handle); Release();
handle = std::exchange(o.handle, 0);
return *this; return *this;
} }
@ -112,14 +118,16 @@ public:
class OGLBuffer : private NonCopyable { class OGLBuffer : private NonCopyable {
public: public:
OGLBuffer() = default; OGLBuffer() = default;
OGLBuffer(OGLBuffer&& o) {
std::swap(handle, o.handle); OGLBuffer(OGLBuffer&& o) : handle(std::exchange(o.handle, 0)) {}
}
~OGLBuffer() { ~OGLBuffer() {
Release(); Release();
} }
OGLBuffer& operator=(OGLBuffer&& o) { OGLBuffer& operator=(OGLBuffer&& o) {
std::swap(handle, o.handle); Release();
handle = std::exchange(o.handle, 0);
return *this; return *this;
} }
@ -145,14 +153,16 @@ public:
class OGLVertexArray : private NonCopyable { class OGLVertexArray : private NonCopyable {
public: public:
OGLVertexArray() = default; OGLVertexArray() = default;
OGLVertexArray(OGLVertexArray&& o) {
std::swap(handle, o.handle); OGLVertexArray(OGLVertexArray&& o) : handle(std::exchange(o.handle, 0)) {}
}
~OGLVertexArray() { ~OGLVertexArray() {
Release(); Release();
} }
OGLVertexArray& operator=(OGLVertexArray&& o) { OGLVertexArray& operator=(OGLVertexArray&& o) {
std::swap(handle, o.handle); Release();
handle = std::exchange(o.handle, 0);
return *this; return *this;
} }
@ -178,14 +188,16 @@ public:
class OGLFramebuffer : private NonCopyable { class OGLFramebuffer : private NonCopyable {
public: public:
OGLFramebuffer() = default; OGLFramebuffer() = default;
OGLFramebuffer(OGLFramebuffer&& o) {
std::swap(handle, o.handle); OGLFramebuffer(OGLFramebuffer&& o) : handle(std::exchange(o.handle, 0)) {}
}
~OGLFramebuffer() { ~OGLFramebuffer() {
Release(); Release();
} }
OGLFramebuffer& operator=(OGLFramebuffer&& o) { OGLFramebuffer& operator=(OGLFramebuffer&& o) {
std::swap(handle, o.handle); Release();
handle = std::exchange(o.handle, 0);
return *this; return *this;
} }