//===-- MIUtilSingletonBase.h -----------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #pragma once namespace MI { // MI::ISingleton base class usage: // // class CMIDerivedClass // : public MI::ISingleton< CMIDerivedClass > // { // friend MI::ISingleton< CMIDerivedClass >; // // // Overridden: // public: // // From MI::ISingleton // bool Initialize() override; // bool Shutdown() override; // }; //++ //============================================================================ // Details: Base class for the singleton pattern. // Gotchas: Derived class must specify MI::ISingleton<> as a friend class. //-- template class ISingleton { // Statics: public: // Return an instance of the derived class static T &Instance() { // This will fail if the derived class has not // declared itself to be a friend of MI::ISingleton static T instance; return instance; } // Overrideable: public: virtual bool Initialize() = 0; virtual bool Shutdown() = 0; // /* dtor */ virtual ~ISingleton() {} }; } // namespace MI