#ifndef RAVA_TYPES_H #define RAVA_TYPES_H #include #include typedef enum { RAVA_TYPE_VOID, RAVA_TYPE_BOOLEAN, RAVA_TYPE_BYTE, RAVA_TYPE_SHORT, RAVA_TYPE_INT, RAVA_TYPE_LONG, RAVA_TYPE_CHAR, RAVA_TYPE_FLOAT, RAVA_TYPE_DOUBLE, RAVA_TYPE_CLASS, RAVA_TYPE_INTERFACE, RAVA_TYPE_ARRAY, RAVA_TYPE_NULL, RAVA_TYPE_UNKNOWN } RavaTypeKind_e; typedef struct RavaType_t RavaType_t; struct RavaType_t { RavaTypeKind_e kind; char *name; union { struct { RavaType_t *element_type; int dimensions; } array; struct { char *class_name; } class_type; } data; }; RavaType_t* rava_type_create_primitive(RavaTypeKind_e kind); RavaType_t* rava_type_create_class(const char *class_name); RavaType_t* rava_type_create_array(RavaType_t *element_type, int dimensions); void rava_type_destroy(RavaType_t *type); RavaType_t* rava_type_from_name(const char *type_name); bool rava_type_is_primitive(RavaType_t *type); bool rava_type_is_numeric(RavaType_t *type); bool rava_type_is_integral(RavaType_t *type); bool rava_type_is_floating(RavaType_t *type); bool rava_type_is_reference(RavaType_t *type); bool rava_type_equals(RavaType_t *a, RavaType_t *b); bool rava_type_is_assignable_to(RavaType_t *from, RavaType_t *to); bool rava_type_is_castable_to(RavaType_t *from, RavaType_t *to); RavaType_t* rava_type_binary_result(RavaType_t *left, RavaType_t *right); RavaType_t* rava_type_unary_result(RavaType_t *operand); const char* rava_type_to_string(RavaType_t *type); #endif