From 1cb3db6726a1bb3dcb639d7c0ec6eb93433f3ff8 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 2 Jan 2019 15:18:15 -0800 Subject: [PATCH] ircd::util: Add scope_restore; remove scope_light because generalized. --- include/ircd/util/scope_light.h | 48 ----------------------- include/ircd/util/scope_restore.h | 65 +++++++++++++++++++++++++++++++ include/ircd/util/util.h | 2 +- 3 files changed, 66 insertions(+), 49 deletions(-) delete mode 100644 include/ircd/util/scope_light.h create mode 100644 include/ircd/util/scope_restore.h diff --git a/include/ircd/util/scope_light.h b/include/ircd/util/scope_light.h deleted file mode 100644 index 4a1b0923f..000000000 --- a/include/ircd/util/scope_light.h +++ /dev/null @@ -1,48 +0,0 @@ -// Matrix Construct -// -// Copyright (C) Matrix Construct Developers, Authors & Contributors -// Copyright (C) 2016-2019 Jason Volk -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice is present in all copies. The -// full license for this software is available in the LICENSE file. - -#pragma once -#define HAVE_IRCD_UTIL_SCOPE_LIGHT_H - -namespace ircd::util -{ - struct scope_light; -}; - -/// A simple boiler-plate for setting a bool to true when constructed and -/// resetting it to its previous value when destructed. This takes a runtime -/// reference to that bool. This is not intended to be a replacement for the -/// reentrance_assertion utility or ctx::mutex et al. -struct ircd::util::scope_light -{ - bool *light {nullptr}; - bool theirs {false}; - - scope_light(bool &light); - scope_light(const scope_light &) = delete; - scope_light(scope_light &&) noexcept = delete; - ~scope_light() noexcept; -}; - -inline -ircd::util::scope_light::scope_light(bool &light) -:light{&light} -,theirs{light} -{ - light = true; -} - -inline -ircd::util::scope_light::~scope_light() -noexcept -{ - assert(light); - *light = theirs; -} diff --git a/include/ircd/util/scope_restore.h b/include/ircd/util/scope_restore.h new file mode 100644 index 000000000..1179458e0 --- /dev/null +++ b/include/ircd/util/scope_restore.h @@ -0,0 +1,65 @@ +// Matrix Construct +// +// Copyright (C) Matrix Construct Developers, Authors & Contributors +// Copyright (C) 2016-2019 Jason Volk +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice is present in all copies. The +// full license for this software is available in the LICENSE file. + +#pragma once +#define HAVE_IRCD_UTIL_SCOPE_RESTORE_H + +namespace ircd::util +{ + template struct scope_restore; +}; + +template +struct ircd::util::scope_restore +{ + T *restore {nullptr}; + T theirs; + + scope_restore(T &restore); + scope_restore(T &restore, T&& ours); + template scope_restore(T &restore, args&&... ours); + scope_restore(const scope_restore &) = delete; + scope_restore(scope_restore &&) noexcept = delete; + ~scope_restore() noexcept; +}; + +template +ircd::util::scope_restore::scope_restore(T &restore) +:restore{&restore} +,theirs{std::move(restore)} +{ +} + +template +ircd::util::scope_restore::scope_restore(T &restore, + T&& ours) +:restore{&restore} +,theirs{std::move(restore)} +{ + restore = std::forward(ours); +} + +template +template +ircd::util::scope_restore::scope_restore(T &restore, + args&&... ours) +:restore{&restore} +,theirs{std::move(restore)} +{ + new (&restore) T(std::forward(ours)...); +} + +template +ircd::util::scope_restore::~scope_restore() +noexcept +{ + assert(restore); + *restore = std::move(theirs); +} diff --git a/include/ircd/util/util.h b/include/ircd/util/util.h index 4f7097711..0bbde7a48 100644 --- a/include/ircd/util/util.h +++ b/include/ircd/util/util.h @@ -45,8 +45,8 @@ namespace ircd #include "bswap.h" #include "tuple.h" #include "timer.h" -#include "scope_light.h" #include "scope_count.h" +#include "scope_restore.h" #include "life_guard.h" #include "pubsetbuf.h" #include "string.h"