aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/um/service/include/libservice/singleton.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'um/service/include/libservice/singleton.hpp')
-rw-r--r--um/service/include/libservice/singleton.hpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/um/service/include/libservice/singleton.hpp b/um/service/include/libservice/singleton.hpp
new file mode 100644
index 0000000..1c7b1a7
--- /dev/null
+++ b/um/service/include/libservice/singleton.hpp
@@ -0,0 +1,43 @@
+// Copyright (c) 2015 Egor Tensin <Egor.Tensin@gmail.com>
+// This file is part of the "Windows 7 drivers" project.
+// For details, see https://github.com/egor-tensin/windows7-drivers.
+// Distributed under the MIT License.
+
+#pragma once
+
+#include <mutex>
+
+namespace libservice
+{
+ template <typename DerivedT>
+ class Singleton
+ {
+ public:
+ static DerivedT& get()
+ {
+ std::call_once(initialized, initialize);
+ return get_unsafe();
+ }
+
+ protected:
+ Singleton() = default;
+ virtual ~Singleton() = default;
+
+ private:
+ static void initialize()
+ {
+ get_unsafe();
+ }
+
+ static DerivedT& get_unsafe()
+ {
+ static DerivedT instance;
+ return instance;
+ }
+
+ static std::once_flag initialized;
+ };
+
+ template <typename DerivedT>
+ std::once_flag Singleton<DerivedT>::initialized;
+}