#ifndef PORYGONLANG_USERDATASTORAGE_HPP #define PORYGONLANG_USERDATASTORAGE_HPP #include #include #include "UserData.hpp" namespace Porygon::UserData { class UserDataStorage { private: class _internalDataStorage { public: std::unordered_map _userData; ~_internalDataStorage(){ for (auto u: _userData){ delete u.second; } _userData.clear(); } _internalDataStorage() = default; _internalDataStorage( const UserDataStorage& ) = delete; // non construction-copyable _internalDataStorage& operator=( const UserDataStorage& ) = delete; // non copyable }; static _internalDataStorage _internal; static std::mutex _userDataMutex; public: static void RegisterType(uint32_t i, UserData *ud) { std::lock_guard guard(_userDataMutex); UserDataStorage::_internal._userData.insert({i, ud}); } static void ClearTypes(){ std::lock_guard guard(_userDataMutex); for (auto u: _internal._userData){ delete u.second; } _internal._userData.clear(); } static bool HasUserDataType(uint32_t i) { return UserDataStorage::_internal._userData.find(i) != UserDataStorage::_internal._userData.end(); } static UserData* GetUserDataType(uint32_t i) { return UserDataStorage::_internal._userData[i]; } }; } #endif //PORYGONLANG_USERDATASTORAGE_HPP