Context.cpp 932 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include "Context.h"
  2. #include "Type.h"
  3. using qlow::sem::Context;
  4. size_t std::hash<std::reference_wrapper<qlow::sem::Type>>::operator() (const std::reference_wrapper<qlow::sem::Type>& t) const
  5. {
  6. return t.get().hash();
  7. }
  8. qlow::sem::TypeId Context::addType(Type&& type) {
  9. if (typesMap.contains(type)) {
  10. return typesMap[type];
  11. }
  12. else {
  13. types.emplace_back(type);
  14. return types.size() - 1;
  15. }
  16. }
  17. std::optional<std::reference_wrapper<qlow::sem::Type>> Context::getType(TypeId tid)
  18. {
  19. if (tid >= 0 && tid <= types.size()) {
  20. return std::make_optional<std::reference_wrapper<qlow::sem::Type>>(*types[tid]);
  21. }
  22. else {
  23. return std::nullopt;
  24. }
  25. }
  26. qlow::sem::TypeId Context::getPointerTo(TypeId id)
  27. {
  28. return addType(Type::createPointerType(*this, id));
  29. }
  30. qlow::sem::TypeId Context::getArrayOf(TypeId id)
  31. {
  32. return addType(Type::createArrayType(*this, id));
  33. }