1
0

singleton.h 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #ifndef CPR_SINGLETON_H
  2. #define CPR_SINGLETON_H
  3. #include <mutex>
  4. #ifndef CPR_DISABLE_COPY
  5. #define CPR_DISABLE_COPY(Class) \
  6. Class(const Class&) = delete; \
  7. Class& operator=(const Class&) = delete;
  8. #endif
  9. #ifndef CPR_SINGLETON_DECL
  10. #define CPR_SINGLETON_DECL(Class) \
  11. public: \
  12. static Class* GetInstance(); \
  13. static void ExitInstance(); \
  14. private: \
  15. CPR_DISABLE_COPY(Class) \
  16. static Class* s_pInstance; \
  17. static std::mutex s_mutex;
  18. #endif
  19. #ifndef CPR_SINGLETON_IMPL
  20. #define CPR_SINGLETON_IMPL(Class) \
  21. Class* Class::s_pInstance = nullptr; \
  22. std::mutex Class::s_mutex; \
  23. Class* Class::GetInstance() { \
  24. if (s_pInstance == nullptr) { \
  25. s_mutex.lock(); \
  26. if (s_pInstance == nullptr) { \
  27. s_pInstance = new Class; \
  28. } \
  29. s_mutex.unlock(); \
  30. } \
  31. return s_pInstance; \
  32. } \
  33. void Class::ExitInstance() { \
  34. s_mutex.lock(); \
  35. if (s_pInstance) { \
  36. delete s_pInstance; \
  37. s_pInstance = nullptr; \
  38. } \
  39. s_mutex.unlock(); \
  40. }
  41. #endif
  42. #endif