PorygonLang/src/UserData/UserDataScriptType.hpp

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