#ifndef MALACHSCRIPT_BOUNDTYPE_HPP #define MALACHSCRIPT_BOUNDTYPE_HPP #include #include "BoundVariable.hpp" namespace MalachScript::Binder { class BoundType { public: BoundType(Identifier identifier, ClassAttr classAttr) : _identifier(identifier), _classAttr(classAttr) {} BoundType(Identifier identifier, ClassAttr classAttr, size_t size) : _identifier(identifier), _classAttr(classAttr), _size(size), _inherits(0) {} inline void Finalise() noexcept { if (_initialised) { return; } _initialised = true; for (auto& inherits : _inherits) { if (!inherits->IsInitialised()) { const_cast(inherits)->Finalise(); } _size += inherits->GetSize(); } for (auto& field : _fields) { if (!field->GetType()->IsInitialised()) { const_cast(field->GetType())->Finalise(); } _size += field->GetType()->GetSize(); } } [[nodiscard]] inline const Identifier& GetIdentifier() const noexcept { return _identifier; } [[nodiscard]] inline size_t GetSize() const noexcept { return _size; } [[nodiscard]] inline bool IsInitialised() const noexcept { return _initialised; } [[nodiscard]] inline ClassAttr GetAttributes() const noexcept { return _classAttr; } inline void AddInheritType(const BoundType* type) { _inherits.push_back(type); } inline void AddField(const Identifier& identifier, BoundVariable* var) { _fields.push_back(var); _fieldsLookup[identifier] = var; } inline void RegisterType(const Identifier& identifier, const BoundType* type) { _types[identifier] = const_cast(type); } [[nodiscard]] inline const std::unordered_map& GetTypes() const noexcept { return _types; } [[nodiscard]] inline const std::unordered_map& GetFieldsLookup() const noexcept { return _fieldsLookup; } inline std::optional ResolveType(const Identifier& identifier) const noexcept { auto find = _types.find(identifier); if (find == _types.end()) { return {}; } return find->second; } private: bool _initialised = false; Identifier _identifier; ClassAttr _classAttr; size_t _size = 0; std::vector _inherits; std::vector _fields; std::unordered_map _fieldsLookup; // TODO: functions std::unordered_map _types; }; } #endif // MALACHSCRIPT_BOUNDTYPE_HPP