| //===-- MIUtilSingletonBase.h -----------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #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 <typename T> 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 |