123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- #ifndef CEREAL_DETAILS_STATIC_OBJECT_HPP_
- #define CEREAL_DETAILS_STATIC_OBJECT_HPP_
- #include "cereal/macros.hpp"
- #if CEREAL_THREAD_SAFE
- #include <mutex>
- #endif
- #if defined(_MSC_VER) && !defined(__clang__)
- # define CEREAL_DLL_EXPORT __declspec(dllexport)
- # define CEREAL_USED
- #else
- # define CEREAL_DLL_EXPORT __attribute__ ((visibility("default")))
- # define CEREAL_USED __attribute__ ((__used__))
- #endif
- namespace cereal
- {
- namespace detail
- {
-
-
- template <class T>
- class CEREAL_DLL_EXPORT StaticObject
- {
- private:
- static T & create()
- {
- static T t;
-
- (void)instance;
- return t;
- }
- StaticObject( StaticObject const & ) {}
- public:
- static T & getInstance()
- {
- return create();
- }
-
- class LockGuard
- {
- #if CEREAL_THREAD_SAFE
- public:
- LockGuard(std::mutex & m) : lock(m) {}
- private:
- std::unique_lock<std::mutex> lock;
- #else
- public:
- LockGuard() = default;
- LockGuard(LockGuard const &) = default;
- ~LockGuard() CEREAL_NOEXCEPT {}
- #endif
- };
-
-
- static LockGuard lock()
- {
- #if CEREAL_THREAD_SAFE
- static std::mutex instanceMutex;
- return LockGuard{instanceMutex};
- #else
- return LockGuard{};
- #endif
- }
- private:
- static T & instance;
- };
- template <class T> T & StaticObject<T>::instance = StaticObject<T>::create();
- }
- }
- #endif
|