From b9ddf00eadce84b19d6d806eb9ccd90231d191ff Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Mon, 20 Feb 2012 18:22:04 +0000 Subject: [PATCH] Add a scoped holder similar to scoped_ptr for handles that may or may not be pointers Originally committed to SVN as r6491. --- .../include/libaegisub/scoped_ptr.h | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/aegisub/libaegisub/include/libaegisub/scoped_ptr.h b/aegisub/libaegisub/include/libaegisub/scoped_ptr.h index e415930b0..645c981a3 100644 --- a/aegisub/libaegisub/include/libaegisub/scoped_ptr.h +++ b/aegisub/libaegisub/include/libaegisub/scoped_ptr.h @@ -48,4 +48,32 @@ public: ~scoped_ptr() { delete ptr; } }; +/// A generic scoped holder for non-pointer handles +template +class scoped_holder { + T value; + Del destructor; + + scoped_holder(scoped_holder const&); + scoped_holder& operator=(scoped_holder const&); +public: + operator T() const { return value; } + T operator->() const { return value; } + + scoped_holder& operator=(T new_value) { + if (value) + destructor(value); + value = new_value; + return *this; + } + + scoped_holder(T value, Del destructor) + : value(value) + , destructor(destructor) + { + } + + ~scoped_holder() { if (value) destructor(value); } +}; + }