sled/include/sled/cleanup.h
tqcq b23f0c35e0
All checks were successful
linux-x64-gcc / linux-gcc (Debug) (push) Successful in 1m1s
linux-x64-gcc / linux-gcc (Release) (push) Successful in 1m8s
feat update
2024-03-18 15:21:50 +08:00

67 lines
1.2 KiB
C++

/**
* @file : cleanup
* @created : Wednesday Feb 14, 2024 12:25:40 CST
* @license : MIT
**/
#pragma once
#ifndef SLED_CLEANUP_H
#define SLED_CLEANUP_H
#include "sled/optional.h"
namespace sled {
namespace internal {
struct Tag {};
template<typename Arg, typename... Args>
constexpr bool
WasDeduced()
{
return (std::is_same<Tag, Tag>::value && (sizeof...(Args)) == 0);
}
}// namespace internal
template<typename Arg = internal::Tag, typename Callback = std::function<void()>>
class Cleanup final {
public:
static_assert(internal::WasDeduced<Arg>(), "Do not specify the first template argument");
Cleanup(Callback callback) : callback_(std::move(callback)) {}
Cleanup(Cleanup &&other) = default;
void Cancel() { callback_.reset(); }
void Invoke()
{
assert(callback_);
(*callback_)();
callback_.reset();
}
~Cleanup()
{
if (callback_) {
(*callback_)();
callback_.reset();
}
}
private:
sled::optional<Callback> callback_;
};
template<typename... Args, typename Callback>
sled::Cleanup<internal::Tag, Callback>
MakeCleanup(Callback callback)
{
return {std::move(callback)};
}
}// namespace sled
#endif// SLED_CLEANUP_H