diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ptr.hpp | 65 |
1 files changed, 55 insertions, 10 deletions
diff --git a/lib/ptr.hpp b/lib/ptr.hpp index 0b00285..f242670 100644 --- a/lib/ptr.hpp +++ b/lib/ptr.hpp @@ -2,23 +2,68 @@ #define PTR_H #include <memory> +#include <special_members.hpp> -template<typename Obj> class wrapped_ptr : public std::unique_ptr<Obj, void (*)(Obj *)> { +template<typename Obj, auto Destroy> class wrapped_ptr { public: - using std::unique_ptr<Obj, void (*)(Obj *)>::unique_ptr; - wrapped_ptr() : std::unique_ptr<Obj, void (*)(Obj *)> {{}, {}} { } + template<typename... Args, typename... Params> + explicit wrapped_ptr(Obj * (*factory)(Params...), Args &&... args) : obj {factory(std::forward<Args>(args)...)} + { + } - inline - operator Obj *() const + explicit wrapped_ptr(wrapped_ptr && p) : obj {p.obj} { - return this->get(); + p.obj = nullptr; } - template<typename... Args, typename... Params> - static auto - create(Obj * (*factory)(Params...), void (*deleter)(Obj *), Args &&... args) + ~wrapped_ptr() + { + if (obj) { + Destroy(obj); + } + } + + NO_COPY(wrapped_ptr); + + wrapped_ptr & + operator=(wrapped_ptr && p) + { + if (obj) { + Destroy(obj); + } + obj = p.obj; + p.obj = nullptr; + return *this; + } + + [[nodiscard]] inline + operator Obj *() const noexcept + { + return obj; + } + + [[nodiscard]] inline auto + operator->() const noexcept + { + return obj; + } + + [[nodiscard]] inline auto + get() const noexcept + { + return obj; + } + +protected: + explicit wrapped_ptr(Obj * o) : obj {o} { } + Obj * obj; +}; + +template<typename Obj, auto Create, auto Destroy> class wrapped_ptrt : public wrapped_ptr<Obj, Destroy> { +public: + template<typename... Args> + explicit wrapped_ptrt(Args &&... args) : wrapped_ptr<Obj, Destroy> {Create(std::forward<Args>(args)...)} { - return wrapped_ptr<Obj> {factory(std::forward<Args>(args)...), deleter}; } }; |