diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-01-24 13:16:05 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-01-24 13:16:05 +0000 |
commit | 12d38a0114657cc468e93f7eb0f97b2b1ac8f924 (patch) | |
tree | 7aec12c6469db3a46811ef6c49800b33a029292e /utility | |
parent | Allow physical objects to share meshes and textures (diff) | |
download | ilt-12d38a0114657cc468e93f7eb0f97b2b1ac8f924.tar.bz2 ilt-12d38a0114657cc468e93f7eb0f97b2b1ac8f924.tar.xz ilt-12d38a0114657cc468e93f7eb0f97b2b1ac8f924.zip |
Big tidy up of shader wrapper
Diffstat (limited to 'utility')
-rw-r--r-- | utility/glRef.hpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/utility/glRef.hpp b/utility/glRef.hpp new file mode 100644 index 0000000..aae6629 --- /dev/null +++ b/utility/glRef.hpp @@ -0,0 +1,56 @@ +#ifndef GLREF_H +#define GLREF_H + +#include <special_members.hpp> +#include <stdexcept> + +template<typename IdType, auto & get, auto & release, auto... fixed> class glRef { +public: + template<typename... Args> explicit glRef(Args &&... args) : id {get(fixed..., std::forward<Args>(args)...)} + { + if (!id) { + throw std::runtime_error("Get function failed"); + } + }; + + glRef(glRef && other) : id {other.id} + { + other.id = {}; + } + + ~glRef() + { + if (id) { + release(id); + } + } + + NO_COPY(glRef); + + const auto & + operator=(glRef && other) + { + if (id) { + release(id); + } + id = other.id; + other.id = {}; + return *this; + } + + auto + operator*() const + { + return id; + } + + operator IdType() const + { + return id; + } + +private: + IdType id; +}; + +#endif |