From 8339c55baa16dda3df36c4de83496012de512bf6 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Fri, 9 Apr 2021 13:29:14 +1000 Subject: [PATCH] memory/deleter: add deferred_delete and deferred_unique --- memory/deleter.hpp | 54 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/memory/deleter.hpp b/memory/deleter.hpp index 22531d31..930d29d7 100644 --- a/memory/deleter.hpp +++ b/memory/deleter.hpp @@ -3,15 +3,59 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2015 Danny Robson + * Copyright 2015-2021 Danny Robson */ -#ifndef __UTIL_MEMORY_DELETER_HPP -#define __UTIL_MEMORY_DELETER_HPP +#pragma once #include +#include namespace cruft::memory { + /////////////////////////////////////////////////////////////////////////// + /// A deleter object that is deliberately left undefined. + /// + /// This allows it to be used in places where the definition of `ValueT` + /// would otherwise be required (eg, std::unique_ptr). This requires that + /// the body be explicitly defined by the user; see `DEFERRED_DELETE`. + template + struct deferred_delete { + void operator() (ValueT*) const; + }; + + + ///------------------------------------------------------------------------ + /// An implementation of deferred delete that just calls `delete` directly. + #define DEFERRED_DELETE(KLASS) \ + template <> \ + void \ + ::cruft::memory::deferred_delete::operator() (KLASS *ptr) const \ + { delete ptr; } + + + /////////////////////////////////////////////////////////////////////////// + /// A convenience typedef for a unique_ptr that uses a deferred_delete + /// deleter object. + template + using deferred_unique = std::unique_ptr>; + + + ///------------------------------------------------------------------------ + /// A convenience function for creation of deferred_unique objects + /// analogous to std::make_unique + template + deferred_unique + make_deferred_unique (ArgsT &&...args) + { + return deferred_unique ( + new ValueT ( + std::forward (args)... + ) + ); + } + + + /////////////////////////////////////////////////////////////////////////// template class func_deleter { public: @@ -53,6 +97,4 @@ namespace cruft::memory { private: OwnerT& m_owner; }; -} - -#endif +} \ No newline at end of file