The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#ifndef SPVM_TYPE_H
#define SPVM_TYPE_H

#include <stdio.h>

#include "spvm_base.h"

enum {
  SPVM_TYPE_C_CORE_LENGTH = 15
};

enum {
  SPVM_TYPE_C_ARRAY_SHIFT = 7
};

enum {
  SPVM_TYPE_C_CODE_UNKNOWN = -1
};

enum {
  SPVM_TYPE_C_CODE_VOID,
  SPVM_TYPE_C_CODE_BYTE,
  SPVM_TYPE_C_CODE_SHORT,
  SPVM_TYPE_C_CODE_INT,
  SPVM_TYPE_C_CODE_LONG,
  SPVM_TYPE_C_CODE_FLOAT,
  SPVM_TYPE_C_CODE_DOUBLE,
  SPVM_TYPE_C_CODE_STRING,
  SPVM_TYPE_C_CODE_BYTE_ARRAY,
  SPVM_TYPE_C_CODE_SHORT_ARRAY,
  SPVM_TYPE_C_CODE_INT_ARRAY,
  SPVM_TYPE_C_CODE_LONG_ARRAY,
  SPVM_TYPE_C_CODE_FLOAT_ARRAY,
  SPVM_TYPE_C_CODE_DOUBLE_ARRAY,
  SPVM_TYPE_C_CODE_STRING_ARRAY,
};

extern const char* const SPVM_TYPE_C_CODE_NAMES[];

struct SPVM_type {
  const char* name;
  SPVM_OP* op_package;
  int32_t code;
  int32_t id;
  int32_t dimension;
  SPVM_TYPE* base_type;
};

char* SPVM_TYPE_get_base_name(SPVM_COMPILER* compiler, const char* type_name);
char* SPVM_TYPE_create_array_name(SPVM_COMPILER* compiler, const char* base_name);
char* SPVM_TYPE_get_element_name(SPVM_COMPILER* compiler, const char* type_name);
char* SPVM_TYPE_get_parent_name(SPVM_COMPILER* compiler, const char* type_name);

SPVM_TYPE* SPVM_TYPE_new(SPVM_COMPILER* compiler);

_Bool SPVM_TYPE_is_integral(SPVM_COMPILER* compiler, SPVM_TYPE* type);
_Bool SPVM_TYPE_is_numeric(SPVM_COMPILER* compiler, SPVM_TYPE* type);
_Bool SPVM_TYPE_is_array(SPVM_COMPILER* compiler, SPVM_TYPE* type);
_Bool SPVM_TYPE_is_array_numeric(SPVM_COMPILER* compiler, SPVM_TYPE* type);

SPVM_TYPE* SPVM_TYPE_get_void_type(SPVM_COMPILER* compiler);
SPVM_TYPE* SPVM_TYPE_get_byte_type(SPVM_COMPILER* compiler);
SPVM_TYPE* SPVM_TYPE_get_short_type(SPVM_COMPILER* compiler);
SPVM_TYPE* SPVM_TYPE_get_int_type(SPVM_COMPILER* compiler);
SPVM_TYPE* SPVM_TYPE_get_long_type(SPVM_COMPILER* compiler);
SPVM_TYPE* SPVM_TYPE_get_float_type(SPVM_COMPILER* compiler);
SPVM_TYPE* SPVM_TYPE_get_double_type(SPVM_COMPILER* compiler);
SPVM_TYPE* SPVM_TYPE_get_string_type(SPVM_COMPILER* compiler);

#endif