#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 UserData* _userData; void *_obj; public: UserDataValue(const UserData* userData, void *obj) : _userData(userData) { _obj = obj; } UserDataValue(uint32_t userDataId, void *obj) : _userData(UserDataStorage::GetUserDataType(userDataId)) { _obj = obj; } inline 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; } inline const shared_ptr Clone() const final { return make_shared(_userData, _obj); } inline 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)); } inline 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()); } inline void* GetObjectPointer(){ return _obj; } }; } #endif //PORYGONLANG_USERDATAVALUE_HPP