diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-02-28 15:42:39 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-02-28 15:42:39 +0000 |
commit | d63f5ce1cb86e69da28bd74b21e9452dbd88a38f (patch) | |
tree | 0c9495f8cb5af05e6068b69d5d57551cc2331a97 /lib/glRef.hpp | |
parent | Just use addLinksBetween (diff) | |
download | ilt-d63f5ce1cb86e69da28bd74b21e9452dbd88a38f.tar.bz2 ilt-d63f5ce1cb86e69da28bd74b21e9452dbd88a38f.tar.xz ilt-d63f5ce1cb86e69da28bd74b21e9452dbd88a38f.zip |
Move utility to lib
Diffstat (limited to 'lib/glRef.hpp')
-rw-r--r-- | lib/glRef.hpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/glRef.hpp b/lib/glRef.hpp new file mode 100644 index 0000000..8596bd3 --- /dev/null +++ b/lib/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 |