+// This internal-use-only class is used to create all leaked Meyers singletons.
+// It guarantees that only one instance of every such singleton will ever be
+// created, even when requested from different compilation units linked
+// dynamically.
+class StaticSingletonManager {
+ public:
+ static StaticSingletonManager& instance();
+
+ template <typename T, typename Tag, typename F>
+ inline T* create(F&& creator) {
+ std::lock_guard<std::mutex> lg(mutex_);
+
+ auto& id = typeid(TypePair<T, Tag>);
+ auto& ptr = reinterpret_cast<T*&>(map_[id]);
+ if (!ptr) {
+ ptr = creator();
+ }
+ return ptr;
+ }
+
+ private:
+ template <typename A, typename B>
+ class TypePair {};
+
+ StaticSingletonManager() {}
+
+ std::unordered_map<std::type_index, intptr_t> map_;
+ std::mutex mutex_;
+};
+
+template <typename T, typename Tag, typename F>
+inline T* createGlobal(F&& creator) {
+ return StaticSingletonManager::instance().create<T, Tag>(
+ std::forward<F>(creator));
+}
+
+template <typename T, typename Tag>
+inline T* createGlobal() {
+ return createGlobal<T, Tag>([]() { return new T(); });
+}
+