mirror of
https://github.com/vcmi/vcmi.git
synced 2024-11-30 08:57:00 +02:00
48 lines
782 B
C
48 lines
782 B
C
|
/*
|
||
|
* ScopeGuard.h, part of VCMI engine
|
||
|
*
|
||
|
* Authors: listed in file AUTHORS in main folder
|
||
|
*
|
||
|
* License: GNU General Public License v2.0 or later
|
||
|
* Full text of license available in license.txt file, in main folder
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
|
||
|
namespace vstd
|
||
|
{
|
||
|
template<typename Func>
|
||
|
class ScopeGuard
|
||
|
{
|
||
|
bool fire;
|
||
|
Func f;
|
||
|
|
||
|
explicit ScopeGuard(ScopeGuard&);
|
||
|
ScopeGuard& operator=(ScopeGuard&);
|
||
|
public:
|
||
|
ScopeGuard(ScopeGuard &&other):
|
||
|
fire(false),
|
||
|
f(other.f)
|
||
|
{
|
||
|
std::swap(fire, other.fire);
|
||
|
}
|
||
|
|
||
|
explicit ScopeGuard(Func && f):
|
||
|
fire(true),
|
||
|
f(std::forward<Func>(f))
|
||
|
{}
|
||
|
~ScopeGuard()
|
||
|
{
|
||
|
f();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
template <typename Func>
|
||
|
ScopeGuard<Func> makeScopeGuard(Func&& exitScope)
|
||
|
{
|
||
|
return ScopeGuard<Func>(std::forward<Func>(exitScope));
|
||
|
}
|
||
|
}
|