#ifndef PORYGONLANG_USERDATAVALUE_HPP #define PORYGONLANG_USERDATAVALUE_HPP #include #include "../Evaluator/EvalValues/EvalValue.hpp" #include "UserData.hpp" #include "UserDataStorage.hpp" namespace Porygon::UserData { class UserDataValue : public Evaluation::EvalValue { const shared_ptr _userData; void *_obj; public: UserDataValue(shared_ptr userData, void *obj) : _userData(std::move(userData)) { _obj = obj; } UserDataValue(uint32_t userDataId, void *obj) : _userData(UserDataStorage::GetUserDataType(userDataId)) { _obj = obj; } const TypeClass GetTypeClass() const final { return TypeClass::UserData; } const bool operator==(EvalValue *b) const final { if (b->GetTypeClass() != TypeClass::UserData) return false; return _obj == ((UserDataValue *) b)->_obj; } const shared_ptr Clone() const final { return make_shared(_userData, _obj); } const std::size_t GetHashCode() const final { return reinterpret_cast(_obj); } const shared_ptr IndexValue(EvalValue *val) const final { auto fieldId = val->GetHashCode(); auto field = _userData->GetField(fieldId); return shared_ptr(field->Get(_obj)); } const shared_ptr IndexValue(uint32_t hash) const final { auto field = _userData->GetField(hash); return shared_ptr(field->Get(_obj)); } void SetIndexValue(EvalValue *key, const shared_ptr &value) const final { auto fieldId = key->GetHashCode(); auto field = _userData->GetField(fieldId); field->Set(_obj, value.get()); } void* GetObjectPointer(){ return _obj; } }; } #endif //PORYGONLANG_USERDATAVALUE_HPP