2019-06-14 12:59:38 +00:00
|
|
|
|
|
|
|
#ifndef PORYGONLANG_USERDATAVALUE_HPP
|
|
|
|
#define PORYGONLANG_USERDATAVALUE_HPP
|
|
|
|
|
2019-06-14 15:35:05 +00:00
|
|
|
#include <utility>
|
2019-06-14 12:59:38 +00:00
|
|
|
#include "../Evaluator/EvalValues/EvalValue.hpp"
|
|
|
|
#include "UserData.hpp"
|
|
|
|
#include "UserDataStorage.hpp"
|
|
|
|
|
2019-06-17 16:35:12 +00:00
|
|
|
namespace Porygon::UserData {
|
|
|
|
class UserDataValue : public Evaluation::EvalValue {
|
2019-08-25 09:53:37 +00:00
|
|
|
RetrievedUserData* _userData;
|
2019-06-17 16:35:12 +00:00
|
|
|
void *_obj;
|
|
|
|
public:
|
2019-08-25 09:53:37 +00:00
|
|
|
UserDataValue(UserData* userData, void *obj)
|
|
|
|
: _userData(new RetrievedUserData(userData)) {
|
2019-06-17 16:35:12 +00:00
|
|
|
_obj = obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
UserDataValue(uint32_t userDataId, void *obj)
|
|
|
|
: _userData(UserDataStorage::GetUserDataType(userDataId)) {
|
|
|
|
_obj = obj;
|
|
|
|
}
|
|
|
|
|
2019-08-25 09:53:37 +00:00
|
|
|
~UserDataValue(){
|
|
|
|
delete _userData;
|
|
|
|
}
|
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
[[nodiscard]]
|
|
|
|
inline TypeClass GetTypeClass() const final {
|
2019-06-17 16:35:12 +00:00
|
|
|
return TypeClass::UserData;
|
|
|
|
}
|
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
bool operator==(const EvalValue *b) const final {
|
2019-06-17 16:35:12 +00:00
|
|
|
if (b->GetTypeClass() != TypeClass::UserData)
|
|
|
|
return false;
|
|
|
|
return _obj == ((UserDataValue *) b)->_obj;
|
|
|
|
}
|
|
|
|
|
2019-09-07 11:28:25 +00:00
|
|
|
bool operator!=(const EvalValue *b) const override {
|
|
|
|
return !operator==(b);
|
|
|
|
}
|
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
[[nodiscard]]
|
2019-07-27 15:59:42 +00:00
|
|
|
inline Evaluation::EvalValue* Clone() const final {
|
2019-08-25 09:53:37 +00:00
|
|
|
auto ud = _userData->Get();
|
|
|
|
if (ud == nullptr){
|
|
|
|
return new UserDataValue(_userData->GetKey(), _obj);
|
|
|
|
}
|
|
|
|
return new UserDataValue(ud, _obj);
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
[[nodiscard]]
|
|
|
|
inline std::size_t GetHashCode() const final {
|
2019-06-17 16:35:12 +00:00
|
|
|
return reinterpret_cast<intptr_t>(_obj);
|
|
|
|
}
|
|
|
|
|
2019-07-27 15:59:42 +00:00
|
|
|
const Evaluation::EvalValue* IndexValue(const EvalValue *val) const final {
|
2019-06-17 16:35:12 +00:00
|
|
|
auto fieldId = val->GetHashCode();
|
2019-08-25 09:53:37 +00:00
|
|
|
auto field = _userData->Get()->GetField(fieldId);
|
2019-07-27 15:59:42 +00:00
|
|
|
return field->Get(_obj);
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
[[nodiscard]]
|
2019-09-07 11:21:35 +00:00
|
|
|
inline const EvalValue* IndexValue(const Utilities::HashedString* hash) const final {
|
|
|
|
auto field = _userData->Get()->GetField(hash->GetHash());
|
2019-07-27 15:59:42 +00:00
|
|
|
return field->Get(_obj);
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
|
2019-07-27 15:59:42 +00:00
|
|
|
void SetIndexValue(const EvalValue *key, const EvalValue* value) const final {
|
2019-06-17 16:35:12 +00:00
|
|
|
auto fieldId = key->GetHashCode();
|
2019-08-25 09:53:37 +00:00
|
|
|
auto field = _userData->Get()->GetField(fieldId);
|
2019-07-27 15:59:42 +00:00
|
|
|
field->Set(_obj, value);
|
|
|
|
delete value;
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
2019-06-21 21:07:17 +00:00
|
|
|
|
2019-09-08 11:53:24 +00:00
|
|
|
inline void* GetObjectPointer() const{
|
2019-06-21 21:07:17 +00:00
|
|
|
return _obj;
|
|
|
|
}
|
2019-09-01 11:35:13 +00:00
|
|
|
|
|
|
|
[[nodiscard]]
|
|
|
|
EvalValue* Cast(shared_ptr<const ScriptType> castType) const final{
|
|
|
|
return _userData->Get()->Cast(_obj, castType.get());
|
|
|
|
}
|
2019-09-07 11:28:25 +00:00
|
|
|
|
2019-06-17 16:35:12 +00:00
|
|
|
};
|
|
|
|
}
|
2019-06-14 12:59:38 +00:00
|
|
|
|
|
|
|
#endif //PORYGONLANG_USERDATAVALUE_HPP
|