PorygonLang/src/UserData/UserDataStorage.hpp

57 lines
1.6 KiB
C++

#ifndef PORYGONLANG_USERDATASTORAGE_HPP
#define PORYGONLANG_USERDATASTORAGE_HPP
#include <unordered_map>
#include "UserData.hpp"
#include <mutex>
namespace Porygon::UserData {
class UserDataStorage {
private:
class _internalDataStorage {
public:
std::unordered_map<uint32_t, UserData*> _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<std::mutex> guard(_userDataMutex);
UserDataStorage::_internal._userData.insert({i, ud});
}
static void ClearTypes(){
std::lock_guard<std::mutex> guard(_userDataMutex);
for (auto u: _internal._userData){
delete u.second;
}
_internal._userData.clear();
}
inline static bool HasUserDataType(uint32_t i) {
return UserDataStorage::_internal._userData.find(i) != UserDataStorage::_internal._userData.end();
}
inline static UserData* GetUserDataType(uint32_t i) {
return UserDataStorage::_internal._userData[i];
}
};
}
#endif //PORYGONLANG_USERDATASTORAGE_HPP