2019-07-28 17:01:07 +00:00
|
|
|
#ifndef PORYGONLANG_USERDATACOLLECTIONVALUE_HPP
|
|
|
|
#define PORYGONLANG_USERDATACOLLECTIONVALUE_HPP
|
|
|
|
|
|
|
|
#include <utility>
|
|
|
|
|
|
|
|
#include "UserDataCollectionType.hpp"
|
2019-08-15 09:43:08 +00:00
|
|
|
#include "../../Evaluator/EvalValues/EvalValue.hpp"
|
|
|
|
#include "../../Utilities/Random.hpp"
|
2019-07-28 17:01:07 +00:00
|
|
|
|
2019-07-28 17:20:28 +00:00
|
|
|
using namespace Porygon::Evaluation;
|
|
|
|
|
2019-07-28 17:01:07 +00:00
|
|
|
namespace Porygon::UserData {
|
|
|
|
class UserDataCollectionHelper{
|
|
|
|
void* _parentObject;
|
|
|
|
const EvalValue* (*_get)(void*, const EvalValue*);
|
|
|
|
void (*_set)(void*, const EvalValue* , const EvalValue*);
|
2019-08-15 09:43:08 +00:00
|
|
|
Iterator* (*_getIterator)(void*);
|
2019-07-28 17:01:07 +00:00
|
|
|
public:
|
|
|
|
UserDataCollectionHelper(void* parentObject,
|
|
|
|
const EvalValue* (*get)(void*, const EvalValue*),
|
2019-08-15 09:43:08 +00:00
|
|
|
void (*set)(void*, const EvalValue*, const EvalValue*),
|
|
|
|
Iterator* (*getIterator)(void*))
|
|
|
|
: _parentObject(parentObject), _get(get), _set(set), _getIterator(getIterator){}
|
2019-07-28 17:01:07 +00:00
|
|
|
|
|
|
|
const EvalValue* Get(const EvalValue* key) const{
|
|
|
|
return _get(_parentObject, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Set(const EvalValue* key, const EvalValue* value) const{
|
|
|
|
_set(_parentObject, key, value);
|
|
|
|
}
|
2019-08-15 09:43:08 +00:00
|
|
|
|
|
|
|
[[nodiscard]] Iterator* GetIterator() const{
|
|
|
|
return _getIterator(_parentObject);
|
|
|
|
}
|
2019-07-28 17:01:07 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class UserDataCollectionValue : public Evaluation::EvalValue{
|
2019-09-01 13:35:45 +00:00
|
|
|
shared_ptr<const UserDataCollectionType> _type;
|
2019-07-28 17:01:07 +00:00
|
|
|
shared_ptr<const UserDataCollectionHelper> _helper;
|
|
|
|
const size_t _hash;
|
2019-09-01 13:35:45 +00:00
|
|
|
UserDataCollectionValue(shared_ptr<const UserDataCollectionType> type,
|
2019-07-28 17:01:07 +00:00
|
|
|
shared_ptr<const UserDataCollectionHelper> helper, size_t hash)
|
|
|
|
: _type(std::move(type)), _helper(std::move(helper)), _hash(hash)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
public:
|
|
|
|
|
2019-09-01 13:35:45 +00:00
|
|
|
UserDataCollectionValue(shared_ptr<const ScriptType> type, const UserDataCollectionHelper* helper)
|
|
|
|
: _type(dynamic_pointer_cast<const UserDataCollectionType>(type)), _helper(helper), _hash(Utilities::Random::Get())
|
2019-07-28 17:01:07 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[[nodiscard]] TypeClass GetTypeClass() const final{
|
|
|
|
return TypeClass ::Table;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool operator==(const EvalValue *b) const final{
|
|
|
|
return b->GetHashCode() == _hash;
|
|
|
|
}
|
|
|
|
|
|
|
|
[[nodiscard]] EvalValue* Clone() const final{
|
|
|
|
return new UserDataCollectionValue(_type, _helper, _hash);
|
|
|
|
}
|
|
|
|
|
|
|
|
[[nodiscard]] std::size_t GetHashCode() const final{
|
|
|
|
return _hash;
|
|
|
|
}
|
|
|
|
|
|
|
|
const EvalValue* IndexValue(const EvalValue *val) const final{
|
|
|
|
return _helper->Get(val);
|
|
|
|
}
|
|
|
|
|
2019-08-15 09:43:08 +00:00
|
|
|
[[nodiscard]]
|
|
|
|
Iterator * GetKeyIterator() const final{
|
|
|
|
return _helper->GetIterator();
|
|
|
|
}
|
|
|
|
|
2019-07-28 17:01:07 +00:00
|
|
|
void SetIndexValue(const EvalValue *key, const EvalValue* value) const final{
|
|
|
|
_helper->Set(key, value);
|
2019-07-28 17:03:13 +00:00
|
|
|
delete value;
|
2019-07-28 17:01:07 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif //PORYGONLANG_USERDATACOLLECTIONVALUE_HPP
|