#pragma once #include #include "Support/Alias.h" #include "Support/Error.h" /// 基础类型的种类, Unknown只用于空数组的元素类型 enum class BasicTypeKind { Boolean, Integer, Float, String, Unknown }; class ArrayType; /// 类型节点 class Type : public std::enable_shared_from_this { public: virtual ~Type() = default; [[nodiscard]] virtual bool isBasic() const = 0; [[nodiscard]] virtual bool isBoolean() const = 0; [[nodiscard]] virtual bool isInteger() const = 0; [[nodiscard]] virtual bool isFloat() const = 0; [[nodiscard]] virtual bool isNumber() const = 0; [[nodiscard]] virtual bool isString() const = 0; [[nodiscard]] virtual bool isUnknown() const = 0; [[nodiscard]] virtual bool isArray() const = 0; [[nodiscard]] virtual bool isNumberArray() const = 0; [[nodiscard]] virtual SharedPtr asArray() const = 0; bool operator==(const Type &rhs) = delete; bool operator!=(const Type &rhs) = delete; /// 判断类型是否相等[无方向](note: equals < sameAs < compatibleWith) [[nodiscard]] bool equals(const SharedPtr &rhs) const; /// 判断类型是否相同[无方向](note: equals < sameAs < compatibleWith) [[nodiscard]] bool sameAs(const SharedPtr &rhs) const; /// 判断类型是否兼容[有方向](note: equals < sameAs < compatibleWith) [[nodiscard]] bool compatibleWith(const SharedPtr &rhs) const; }; /// 基础类型节点 class BasicType : public Type { public: explicit BasicType(BasicTypeKind kind); explicit BasicType() = default; ~BasicType() override = default; [[nodiscard]] bool isBasic() const override; [[nodiscard]] bool isBoolean() const override; [[nodiscard]] bool isInteger() const override; [[nodiscard]] bool isFloat() const override; [[nodiscard]] bool isNumber() const override; [[nodiscard]] bool isString() const override; [[nodiscard]] bool isUnknown() const override; [[nodiscard]] bool isArray() const override; [[nodiscard]] bool isNumberArray() const override; [[nodiscard]] SharedPtr asArray() const override; [[nodiscard]] BasicTypeKind getKind() const; bool operator==(const BasicType &rhs) = delete; bool operator!=(const BasicType &rhs) = delete; [[nodiscard]] bool equals(const SharedPtr &rhs) const; static inline const SharedPtr BOOLEAN_TYPE = makeShared(BasicTypeKind::Boolean); // NOLINT static inline const SharedPtr INTEGER_TYPE = makeShared(BasicTypeKind::Integer); // NOLINT static inline const SharedPtr FLOAT_TYPE = makeShared(BasicTypeKind::Float); // NOLINT static inline const SharedPtr STRING_TYPE = makeShared(BasicTypeKind::String); // NOLINT static inline const SharedPtr UNKNOWN_TYPE = makeShared(BasicTypeKind::Unknown); // NOLINT private: BasicTypeKind kind = BasicTypeKind::Unknown; }; /// 数组类型节点 class ArrayType : public Type { public: static SharedPtr createNDArrayType(const SharedPtr &basicType, size_t depth); explicit ArrayType(const SharedPtr &elementType); explicit ArrayType() = default; ~ArrayType() override = default; [[nodiscard]] bool isBasic() const override; [[nodiscard]] bool isBoolean() const override; [[nodiscard]] bool isInteger() const override; [[nodiscard]] bool isFloat() const override; [[nodiscard]] bool isNumber() const override; [[nodiscard]] bool isString() const override; [[nodiscard]] bool isUnknown() const override; [[nodiscard]] bool isArray() const override; [[nodiscard]] bool isNumberArray() const override; [[nodiscard]] SharedPtr asArray() const override; /// 获取数组的元素类型, 多维数组则获取子数组的类型 [[nodiscard]] const SharedPtr &getElementType() const; /// 获取多维数组最内层的元素类型 [[nodiscard]] SharedPtr getBasicElementType() const; [[nodiscard]] size_t getDepth() const; bool operator==(const ArrayType &rhs) = delete; bool operator!=(const ArrayType &rhs) = delete; [[nodiscard]] bool equals(const SharedPtr &rhs) const; private: SharedPtr elementType = BasicType::UNKNOWN_TYPE; size_t depth = 1; };