PorygonLang/src/ScriptTypes/TableScriptType.hpp

74 lines
2.4 KiB
C++
Raw Normal View History

2019-06-12 13:19:28 +00:00
#ifndef PORYGONLANG_TABLESCRIPTTYPE_HPP
#define PORYGONLANG_TABLESCRIPTTYPE_HPP
#include <unordered_map>
#include "../Binder/BoundVariables/BoundVariable.hpp"
2019-06-12 13:19:28 +00:00
namespace Porygon{
class TableScriptType : public ScriptType{
const map<Utilities::HashedString, BoundVariable*>* _values;
const int _localVariableCount;
public:
explicit TableScriptType(map<Utilities::HashedString, BoundVariable*>* values, int localVariableCount)
: ScriptType(TypeClass::Table),
_values(values),
_localVariableCount(localVariableCount)
2019-06-13 14:26:10 +00:00
{}
2019-06-12 13:19:28 +00:00
2019-09-01 18:07:09 +00:00
explicit TableScriptType()
: ScriptType(TypeClass::Table),
_values(nullptr),
_localVariableCount(0)
{}
~TableScriptType() final{
2019-09-01 18:07:09 +00:00
if (_values != nullptr){
for (const auto& i : *_values){
delete i.second;
}
}
delete _values;
2019-06-12 13:19:28 +00:00
}
2019-07-25 15:23:54 +00:00
[[nodiscard]]
inline bool CanBeIndexedWith(const ScriptType* indexer) const final{
return indexer->GetClass() == TypeClass ::String;
}
2019-06-12 13:19:28 +00:00
2019-07-25 15:23:54 +00:00
[[nodiscard]] bool CanBeIndexedWithIdentifier(uint32_t hash) const final{
return true;
}
2019-07-25 15:23:54 +00:00
shared_ptr<const ScriptType> GetIndexedType(const ScriptType* indexer) const final{
auto stringKey = dynamic_cast<const StringScriptType*>(indexer);
2019-09-01 18:07:09 +00:00
if (stringKey != nullptr && stringKey->IsKnownAtBind() && _values != nullptr){
return _values-> at(Utilities::HashedString::CreateLookup(stringKey->GetHashValue()))->GetType();
}
return make_shared<ScriptType>(TypeClass::Any);
2019-06-12 13:19:28 +00:00
}
2019-07-25 15:23:54 +00:00
[[nodiscard]] inline shared_ptr<const ScriptType> GetIndexedType(uint32_t hash) const final{
return _values-> at(Utilities::HashedString::CreateLookup(hash))->GetType();
}
2019-07-25 15:23:54 +00:00
[[nodiscard]] inline const map<Utilities::HashedString, BoundVariable*>* GetValues() const{
return _values;
}
2019-09-01 18:07:09 +00:00
[[nodiscard]]
bool CanBeIterated() const final {
return true;
}
[[nodiscard]]
shared_ptr<const ScriptType> GetIteratorKeyType() const final {
return make_shared<ScriptType>(TypeClass::Any);
2019-09-01 18:07:09 +00:00
}
};
}
2019-06-12 13:19:28 +00:00
#include "ScriptType.hpp"
#endif //PORYGONLANG_TABLESCRIPTTYPE_HPP