/*
 * 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));
	}
}