diff --git a/projects/openttd_vs100.vcxproj b/projects/openttd_vs100.vcxproj index 59e087ee70..a7abe4d1ab 100644 --- a/projects/openttd_vs100.vcxproj +++ b/projects/openttd_vs100.vcxproj @@ -571,6 +571,7 @@ + diff --git a/projects/openttd_vs100.vcxproj.filters b/projects/openttd_vs100.vcxproj.filters index 06800ffdaf..d996963c06 100644 --- a/projects/openttd_vs100.vcxproj.filters +++ b/projects/openttd_vs100.vcxproj.filters @@ -942,6 +942,9 @@ Header Files + + Header Files + Header Files diff --git a/projects/openttd_vs140.vcxproj b/projects/openttd_vs140.vcxproj index 8d8b980649..67acda0402 100644 --- a/projects/openttd_vs140.vcxproj +++ b/projects/openttd_vs140.vcxproj @@ -588,6 +588,7 @@ + diff --git a/projects/openttd_vs140.vcxproj.filters b/projects/openttd_vs140.vcxproj.filters index 06800ffdaf..d996963c06 100644 --- a/projects/openttd_vs140.vcxproj.filters +++ b/projects/openttd_vs140.vcxproj.filters @@ -942,6 +942,9 @@ Header Files + + Header Files + Header Files diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj index 70dcab226a..fcd9c0e3a3 100644 --- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -1558,6 +1558,10 @@ RelativePath=".\..\src\safeguards.h" > + + diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj index dd722d085d..cd5eea9d4e 100644 --- a/projects/openttd_vs90.vcproj +++ b/projects/openttd_vs90.vcproj @@ -1555,6 +1555,10 @@ RelativePath=".\..\src\safeguards.h" > + + diff --git a/source.list b/source.list index df35cdd26e..59b2824ad0 100644 --- a/source.list +++ b/source.list @@ -310,6 +310,7 @@ road_type.h roadstop_base.h roadveh.h safeguards.h +scope.h screenshot.h sdl.h sound/sdl_s.h diff --git a/src/scope.h b/src/scope.h new file mode 100644 index 0000000000..d341b50b1f --- /dev/null +++ b/src/scope.h @@ -0,0 +1,53 @@ +/* $Id$ */ + +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file scope.h Simple scope guard... */ + +#ifndef SCOPE_H +#define SCOPE_H + +template +class scope_exit_obj { + T f; + bool shouldexec; + + + public: + + scope_exit_obj(T &&func) + : f(std::move(func)), shouldexec(true) { } + + scope_exit_obj(const scope_exit_obj ©src) = delete; + scope_exit_obj(scope_exit_obj &&movesrc) + : f(std::move(movesrc.f)), shouldexec(movesrc.shouldexec) { + movesrc.shouldexec = false; + } + + ~scope_exit_obj() { + exec(); + } + + void exec() { + if (shouldexec) { + f(); + shouldexec = false; + } + } + + void cancel() { + shouldexec = false; + } +}; + +template +scope_exit_obj::type> scope_guard(T &&func) { + return scope_exit_obj::type>(std::forward(func)); +} + +#endif /* SCOPE_H */