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 */