64 lines
1.6 KiB
C
Raw Normal View History

2025-12-02 06:54:32 +01:00
#ifndef RAVA_TYPES_H
#define RAVA_TYPES_H
#include <stddef.h>
#include <stdbool.h>
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