add arraytype def

This commit is contained in:
rain2133
2025-06-16 20:56:32 +08:00
parent 5727d3bde5
commit 1aa785efc3
2 changed files with 51 additions and 0 deletions

View File

@ -91,6 +91,8 @@ int Type::getSize() const {
return 8;
case kVoid:
return 0;
case kArray:
return asArrayType()->getArraySize();
}
return 0;
}

View File

@ -42,6 +42,7 @@ public:
kLabel,
kPointer,
kFunction,
kArray,
};
Kind kind;
@ -57,6 +58,9 @@ public:
static Type *getPointerType(Type *baseType);
static Type *getFunctionType(Type *returnType,
const std::vector<Type *> &paramTypes = {});
static Type *getArrayType(Type *elementType, const std::vector<int> &dims = {}) {
return ArrayType::get(elementType, dims);
}
public:
Kind getKind() const { return kind; }
@ -66,8 +70,12 @@ public:
bool isLabel() const { return kind == kLabel; }
bool isPointer() const { return kind == kPointer; }
bool isFunction() const { return kind == kFunction; }
bool isArray() const { return kind == kArray; }
bool isIntOrFloat() const { return kind == kInt or kind == kFloat; }
int getSize() const;
ArrayType *asArrayType() const {
return isArray() ? static_cast<ArrayType*>(const_cast<Type*>(this)) : nullptr;
}
template <typename T>
std::enable_if_t<std::is_base_of_v<Type, T>, T *> as() const {
return dynamic_cast<T *>(const_cast<Type *>(this));
@ -110,6 +118,47 @@ public:
int getNumParams() const { return paramTypes.size(); }
}; // class FunctionType
class ArrayType : public Type {
private:
Type *elementType; // 数组元素类型
std::vector<int> dimensions; // 维度信息(空向量表示未知大小)
protected:
ArrayType(Type *elemType, const std::vector<int> &dims = {})
: Type(kArray), elementType(elemType), dimensions(dims) {
// 确保元素类型有效
assert(elemType && "Array element type cannot be null");
assert(!elemType->isVoid() && "Cannot have array of void");
assert(!elemType->isLabel() && "Cannot have array of labels");
}
public:
// 获取数组类型(带缓存机制)
static ArrayType *get(Type *elemType, const std::vector<int> &dims = {}) {
// 实现类型缓存池(避免重复创建)
static std::map<std::pair<Type*, std::vector<int>>, ArrayType*> cache;
auto key = std::make_pair(elemType, dims);
if (cache.find(key) == cache.end()) {
cache[key] = new ArrayType(elemType, dims);
}
return cache[key];
}
Type *getElementType() const { return elementType; }
const std::vector<int>& getDimensions() const { return dimensions; }
size_t getNumDimensions() const { return dimensions.size(); }
int getArraySize() const {
int size = elementType->getSize();
for (int dim : dimensions) {
size *= dim;
}
return size;
}
};//class ArrayType
/*!
* @}
*/