diff options
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/vespa/vespalib/util/destructor_callbacks.h | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/vespalib/src/vespa/vespalib/util/destructor_callbacks.h b/vespalib/src/vespa/vespalib/util/destructor_callbacks.h index fc0d23fa177..211105127cf 100644 --- a/vespalib/src/vespa/vespalib/util/destructor_callbacks.h +++ b/vespalib/src/vespa/vespalib/util/destructor_callbacks.h @@ -8,25 +8,46 @@ namespace vespalib { class Gate; -class GateCallback : public vespalib::IDestructorCallback { +class GateCallback : public IDestructorCallback { public: - GateCallback(vespalib::Gate & gate) noexcept : _gate(gate) {} + explicit GateCallback(vespalib::Gate & gate) noexcept : _gate(gate) {} ~GateCallback() override; private: vespalib::Gate & _gate; }; -class IgnoreCallback : public vespalib::IDestructorCallback { +class IgnoreCallback : public IDestructorCallback { public: IgnoreCallback() noexcept { } ~IgnoreCallback() override = default; }; template <typename T> -struct KeepAlive : public vespalib::IDestructorCallback { +struct KeepAlive : public IDestructorCallback { explicit KeepAlive(T toKeep) noexcept : _toKeep(std::move(toKeep)) { } ~KeepAlive() override = default; T _toKeep; }; +template<class FunctionType> +class LambdaCallback : public IDestructorCallback { +public: + explicit LambdaCallback(FunctionType &&func) noexcept + : _func(std::move(func)) + {} + ~LambdaCallback() { + _func(); + } +private: + FunctionType _func; +}; + +template<class FunctionType> +std::shared_ptr<IDestructorCallback> +makeLambdaCallback(FunctionType &&function) { + return std::make_shared<LambdaCallback<std::decay_t<FunctionType>>> + (std::forward<FunctionType>(function)); +} + + } |