1 // Copyright (c) 2010, Thomas Goyne <plorkyeran@aegisub.org> 2 // 3 // Permission to use, copy, modify, and distribute this software for any 4 // purpose with or without fee is hereby granted, provided that the above 5 // copyright notice and this permission notice appear in all copies. 6 // 7 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 10 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 12 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 13 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 15 /// @file scoped_ptr.h 16 /// @brief 17 /// @ingroup libaegisub 18 19 #pragma once 20 21 namespace agi { 22 /// A generic scoped holder for non-pointer handles 23 template<class T, class Del = void(*)(T)> 24 class scoped_holder { 25 T value; 26 Del destructor; 27 28 scoped_holder(scoped_holder const&); 29 scoped_holder& operator=(scoped_holder const&); 30 public: T()31 operator T() const { return value; } 32 T operator->() const { return value; } 33 34 scoped_holder& operator=(T new_value) { 35 if (value) 36 destructor(value); 37 value = new_value; 38 return *this; 39 } 40 scoped_holder(T value,Del destructor)41 scoped_holder(T value, Del destructor) 42 : value(value) 43 , destructor(destructor) 44 { 45 } 46 ~scoped_holder()47 ~scoped_holder() { if (value) destructor(value); } 48 }; 49 } 50