75 lines
1.4 KiB
C++
75 lines
1.4 KiB
C++
|
|
#include "type.hpp"
|
|
#include "std.hpp"
|
|
|
|
static struct v_type : public Type {
|
|
bool canCastTo(Type* t)
|
|
{
|
|
return t == Type::void_type;
|
|
}
|
|
} v;
|
|
|
|
static struct i_type : public Type {
|
|
bool intType()
|
|
{
|
|
return true;
|
|
}
|
|
bool canCastTo(Type* t)
|
|
{
|
|
return t == Type::int_type || t == Type::float_type || t == Type::string_type;
|
|
}
|
|
} i;
|
|
|
|
static struct f_type : public Type {
|
|
bool floatType()
|
|
{
|
|
return true;
|
|
}
|
|
bool canCastTo(Type* t)
|
|
{
|
|
return t == Type::int_type || t == Type::float_type || t == Type::string_type;
|
|
}
|
|
} f;
|
|
|
|
static struct s_type : public Type {
|
|
bool stringType()
|
|
{
|
|
return true;
|
|
}
|
|
bool canCastTo(Type* t)
|
|
{
|
|
return t == Type::int_type || t == Type::float_type || t == Type::string_type;
|
|
}
|
|
} s;
|
|
|
|
bool StructType::canCastTo(Type* t)
|
|
{
|
|
return t == this || t == Type::null_type || (this == Type::null_type && t->structType());
|
|
}
|
|
|
|
bool VectorType::canCastTo(Type* t)
|
|
{
|
|
if (this == t)
|
|
return true;
|
|
if (VectorType* v = t->vectorType()) {
|
|
if (elementType != v->elementType)
|
|
return false;
|
|
if (sizes.size() != v->sizes.size())
|
|
return false;
|
|
for (int k = 0; k < sizes.size(); ++k) {
|
|
if (sizes[k] != v->sizes[k])
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static StructType n("Null");
|
|
|
|
Type* Type::void_type = &v;
|
|
Type* Type::int_type = &i;
|
|
Type* Type::float_type = &f;
|
|
Type* Type::string_type = &s;
|
|
Type* Type::null_type = &n;
|