diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-04-29 19:07:11 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-04-29 19:07:11 +0100 |
commit | 5a0b3927a33807cca4c77c40eb873f8a3b51b0b0 (patch) | |
tree | 4af0585ee8f8f468ab10c0a4fe9994fb30b79599 /lib/glRef.h | |
parent | Dunno how, but some DOS new lines got in here! (diff) | |
download | ilt-5a0b3927a33807cca4c77c40eb873f8a3b51b0b0.tar.bz2 ilt-5a0b3927a33807cca4c77c40eb873f8a3b51b0b0.tar.xz ilt-5a0b3927a33807cca4c77c40eb873f8a3b51b0b0.zip |
Drop .hpp for header only things
Half of them acquired a .cpp part anyway
Diffstat (limited to 'lib/glRef.h')
-rw-r--r-- | lib/glRef.h | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/glRef.h b/lib/glRef.h new file mode 100644 index 0000000..3031cf5 --- /dev/null +++ b/lib/glRef.h @@ -0,0 +1,62 @@ +#pragma once + +#include <special_members.h> +#include <stdexcept> + +template<typename IdType, auto get, auto release, auto... fixed> class glRef { +public: + // cppcheck-suppress redundantPointerOp + 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) { + // cppcheck-suppress redundantPointerOp + (*release)(id); + } + } + + NO_COPY(glRef); + + const auto & + operator=(glRef && other) + { + if (id) { + // cppcheck-suppress redundantPointerOp + (*release)(id); + } + id = other.id; + other.id = {}; + return *this; + } + + auto + operator*() const + { + return id; + } + + auto + operator->() const + { + return id; + } + + operator IdType() const + { + return id; + } + +private: + IdType id; +}; |