80 lines
2.6 KiB
C++
80 lines
2.6 KiB
C++
|
|
|
|
#ifndef PORYGONLANG_USERDATASCRIPTTYPE_HPP
|
|
#define PORYGONLANG_USERDATASCRIPTTYPE_HPP
|
|
|
|
#include <utility>
|
|
#include "../ScriptTypes/ScriptType.hpp"
|
|
#include "UserData.hpp"
|
|
#include "UserDataStorage.hpp"
|
|
|
|
namespace Porygon::UserData {
|
|
class UserDataScriptType : public ScriptType {
|
|
RetrievedUserData* _userData;
|
|
public:
|
|
explicit UserDataScriptType(uint32_t id) :
|
|
_userData(UserDataStorage::GetUserDataType(id)),
|
|
ScriptType(TypeClass::UserData) {
|
|
}
|
|
|
|
explicit UserDataScriptType(UserData* ud) :
|
|
_userData(new RetrievedUserData(ud)),
|
|
ScriptType(TypeClass::UserData) {}
|
|
|
|
~UserDataScriptType() final{
|
|
delete _userData;
|
|
}
|
|
|
|
[[nodiscard]] RetrievedUserData* GetUserData() const{
|
|
return _userData;
|
|
}
|
|
|
|
bool CanBeIndexedWith(const ScriptType *indexer) const final {
|
|
if (indexer->GetClass() != TypeClass::String) {
|
|
return false;
|
|
}
|
|
auto str = dynamic_cast<const StringScriptType*>(indexer);
|
|
if (!str->IsKnownAtBind())
|
|
return false;
|
|
return _userData->Get()->ContainsField(str->GetHashValue());
|
|
}
|
|
|
|
[[nodiscard]] inline bool CanBeIndexedWithIdentifier(uint32_t hash) const final {
|
|
return _userData->Get() -> ContainsField(hash);
|
|
}
|
|
|
|
[[nodiscard]] inline UserDataField *GetField(uint32_t id) const{
|
|
return _userData->Get()->GetField(id);
|
|
}
|
|
|
|
shared_ptr<const ScriptType> GetIndexedType(const ScriptType *indexer) const final {
|
|
auto stringKey = dynamic_cast<const StringScriptType*>(indexer);
|
|
if (stringKey->IsKnownAtBind()) {
|
|
return _userData->Get()->GetField(stringKey->GetHashValue())->GetType();
|
|
}
|
|
throw "TODO: indexing with dynamic keys";
|
|
}
|
|
|
|
[[nodiscard]] inline shared_ptr<const ScriptType> GetIndexedType(uint32_t hash) const final {
|
|
return _userData->Get()->GetField(hash)->GetType();
|
|
}
|
|
|
|
[[nodiscard]] CastResult CastableTo(const shared_ptr<const ScriptType>& castType, bool explicitCast) const final{
|
|
if (_userData->Get()->IsCastable(castType, explicitCast)){
|
|
return CastResult::ValidCast;
|
|
}
|
|
return CastResult ::InvalidCast;
|
|
}
|
|
|
|
[[nodiscard]] string ToString() const override {
|
|
std::stringstream s;
|
|
s << ScriptType::ToString() << " (" << _userData->Get()->GetIdentifier()->GetDebugString() << ")";
|
|
return s.str();
|
|
}
|
|
|
|
};
|
|
}
|
|
|
|
|
|
#endif //PORYGONLANG_USERDATASCRIPTTYPE_HPP
|