#ifndef RAY_H
#define RAY_H
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include <assert.h>
#ifdef __cplusplus
extern "C" {
#endif
#define RAY_VERSION_MAJOR 2
#define RAY_VERSION_MINOR 1
#define RAY_VERSION_PATCH 0
#define RAY_VERSION_NUMBER \
((RAY_VERSION_MAJOR * 10000) + (RAY_VERSION_MINOR * 100) + RAY_VERSION_PATCH)
#define RAY_VERSION_AT_LEAST(major, minor, patch) \
(RAY_VERSION_NUMBER >= ((major) * 10000 + (minor) * 100 + (patch)))
int ray_version_major(void);
int ray_version_minor(void);
int ray_version_patch(void);
const char* ray_version_string(void);
#define RAY_LIST 0
#define RAY_BOOL 1
#define RAY_U8 2
#define RAY_I16 3
#define RAY_I32 4
#define RAY_I64 5
#define RAY_F32 6
#define RAY_F64 7
#define RAY_DATE 8
#define RAY_TIME 9
#define RAY_TIMESTAMP 10
#define RAY_GUID 11
#define RAY_SYM 12
#define RAY_STR 13
#define RAY_INDEX 97
#define RAY_TABLE 98
#define RAY_DICT 99
#define RAY_LAMBDA 100
#define RAY_UNARY 101
#define RAY_BINARY 102
#define RAY_VARY 103
#define RAY_ERROR 127
#define RAY_NULL 126
typedef enum {
RAY_OK = 0,
RAY_ERR_OOM,
RAY_ERR_TYPE,
RAY_ERR_RANGE,
RAY_ERR_LENGTH,
RAY_ERR_RANK,
RAY_ERR_DOMAIN,
RAY_ERR_NYI,
RAY_ERR_IO,
RAY_ERR_SCHEMA,
RAY_ERR_CORRUPT,
RAY_ERR_CANCEL,
RAY_ERR_PARSE,
RAY_ERR_NAME,
RAY_ERR_LIMIT,
RAY_ERR_RESERVED
} ray_err_t;
#define RAY_IS_ERR(p) ((p) != NULL && (uintptr_t)(p) > 31 && ((ray_t*)(p))->type == RAY_ERROR)
typedef union ray_t {
struct {
union {
uint8_t nullmap[16];
struct { union ray_t* slice_parent; int64_t slice_offset; };
struct { union ray_t* ext_nullmap; union ray_t* sym_dict; };
struct { union ray_t* str_ext_null; union ray_t* str_pool; };
struct { union ray_t* index; union ray_t* _idx_pad; };
struct { uint8_t link_lo[8]; int64_t link_target; };
};
uint8_t mmod;
uint8_t order;
int8_t type;
uint8_t attrs;
uint32_t rc;
union {
uint8_t b8;
uint8_t u8;
int16_t i16;
int32_t i32;
uint32_t u32;
int64_t i64;
double f64;
union ray_t* obj;
struct { uint8_t slen; char sdata[7]; };
int64_t len;
};
uint8_t data[];
};
struct {
union ray_t* fl_prev;
union ray_t* fl_next;
};
} ray_t;
extern ray_t __ray_null;
#define RAY_NULL_OBJ (&__ray_null)
#define RAY_IS_NULL(p) ((p) == RAY_NULL_OBJ)
extern ray_t __ray_oom;
#define RAY_OOM_OBJ (&__ray_oom)
ray_t* ray_error(const char* code, const char* fmt, ...);
const char* ray_err_code_str(ray_err_t e);
ray_err_t ray_err_from_obj(ray_t* err);
const char* ray_err_code(ray_t* err);
void ray_error_free(ray_t* err);
#define RAY_ATTR_SLICE 0x10
#define ray_type(v) ((v)->type)
#define ray_is_atom(v) ((v)->type < 0 || (v)->type >= RAY_LAMBDA)
#define ray_is_vec(v) ((v)->type >= RAY_BOOL && (v)->type <= RAY_STR)
#define ray_len(v) ((v)->len)
extern const uint8_t ray_type_sizes[256];
static inline void* ray_data_fn(ray_t* v) {
if (__builtin_expect(!!(v->attrs & RAY_ATTR_SLICE), 0))
return (char*)v->slice_parent->data
+ v->slice_offset * ray_type_sizes[(uint8_t)v->type];
return (void*)v->data;
}
#define ray_slice_data(v) ray_data_fn(v)
#define ray_data(v) ray_data_fn(v)
ray_t* ray_alloc(size_t data_size);
void ray_free(ray_t* v);
int64_t ray_mem_budget(void);
bool ray_mem_pressure(void);
void ray_request_interrupt(void);
void ray_clear_interrupt(void);
bool ray_interrupted(void);
typedef struct {
const char* op_name;
const char* phase;
uint64_t rows_done;
uint64_t rows_total;
double elapsed_sec;
int64_t mem_used;
int64_t mem_budget;
bool final;
} ray_progress_t;
typedef void (*ray_progress_cb)(const ray_progress_t* snapshot, void* user);
void ray_progress_set_callback(ray_progress_cb cb, void* user,
uint64_t min_ms, uint64_t tick_interval_ms);
void ray_progress_update(const char* op_name, const char* phase,
uint64_t rows_done, uint64_t rows_total);
void ray_progress_label(const char* op_name, const char* phase);
void ray_progress_end(void);
void ray_retain(ray_t* v);
void ray_release(ray_t* v);
ray_t* ray_bool(bool val);
ray_t* ray_u8(uint8_t val);
ray_t* ray_i16(int16_t val);
ray_t* ray_i32(int32_t val);
ray_t* ray_i64(int64_t val);
ray_t* ray_f32(float val);
ray_t* ray_f64(double val);
ray_t* ray_str(const char* s, size_t len);
ray_t* ray_sym(int64_t id);
ray_t* ray_date(int64_t val);
ray_t* ray_time(int64_t val);
ray_t* ray_timestamp(int64_t val);
ray_t* ray_guid(const uint8_t* bytes);
ray_t* ray_typed_null(int8_t type);
#define RAY_ATOM_IS_NULL(x) (RAY_IS_NULL(x) || ((x)->type < 0 && ((x)->nullmap[0] & 1)))
ray_t* ray_vec_new(int8_t type, int64_t capacity);
#define RAY_SYM_W8 0
#define RAY_SYM_W16 1
#define RAY_SYM_W32 2
#define RAY_SYM_W64 3
ray_t* ray_sym_vec_new(uint8_t sym_width, int64_t capacity);
ray_t* ray_vec_append(ray_t* vec, const void* elem);
ray_t* ray_vec_set(ray_t* vec, int64_t idx, const void* elem);
void* ray_vec_get(ray_t* vec, int64_t idx);
ray_t* ray_vec_slice(ray_t* vec, int64_t offset, int64_t len);
ray_t* ray_vec_concat(ray_t* a, ray_t* b);
ray_t* ray_vec_from_raw(int8_t type, const void* data, int64_t count);
ray_t* ray_vec_insert_at(ray_t* vec, int64_t idx, const void* elem);
ray_t* ray_vec_insert_vec_at(ray_t* vec, int64_t idx, ray_t* src);
ray_t* ray_vec_insert_many(ray_t* vec, ray_t* idxs, ray_t* vals);
void ray_vec_set_null(ray_t* vec, int64_t idx, bool is_null);
ray_err_t ray_vec_set_null_checked(ray_t* vec, int64_t idx, bool is_null);
bool ray_vec_is_null(ray_t* vec, int64_t idx);
ray_t* ray_str_vec_append(ray_t* vec, const char* s, size_t len);
const char* ray_str_vec_get(ray_t* vec, int64_t idx, size_t* out_len);
ray_t* ray_str_vec_set(ray_t* vec, int64_t idx, const char* s, size_t len);
ray_t* ray_str_vec_insert_at(ray_t* vec, int64_t idx, const char* s, size_t len);
ray_t* ray_str_vec_compact(ray_t* vec);
const char* ray_str_ptr(ray_t* s);
size_t ray_str_len(ray_t* s);
int ray_str_cmp(ray_t* a, ray_t* b);
ray_t* ray_list_new(int64_t capacity);
ray_t* ray_list_append(ray_t* list, ray_t* item);
ray_t* ray_list_get(ray_t* list, int64_t idx);
ray_t* ray_list_set(ray_t* list, int64_t idx, ray_t* item);
ray_t* ray_list_insert_at(ray_t* list, int64_t idx, ray_t* item);
ray_t* ray_list_insert_many(ray_t* list, ray_t* idxs, ray_t* vals);
ray_err_t ray_sym_init(void);
void ray_sym_destroy(void);
int64_t ray_sym_intern(const char* str, size_t len);
int64_t ray_sym_find(const char* str, size_t len);
ray_t* ray_sym_str(int64_t id);
uint32_t ray_sym_count(void);
bool ray_sym_ensure_cap(uint32_t needed);
ray_err_t ray_sym_save(const char* path);
ray_err_t ray_sym_load(const char* path);
ray_t* ray_env_get(int64_t sym_id);
ray_err_t ray_env_set(int64_t sym_id, ray_t* val);
ray_t* ray_table_new(int64_t ncols);
ray_t* ray_table_add_col(ray_t* tbl, int64_t name_id, ray_t* col_vec);
ray_t* ray_table_get_col(ray_t* tbl, int64_t name_id);
ray_t* ray_table_get_col_idx(ray_t* tbl, int64_t idx);
int64_t ray_table_col_name(ray_t* tbl, int64_t idx);
void ray_table_set_col_name(ray_t* tbl, int64_t idx, int64_t name_id);
int64_t ray_table_ncols(ray_t* tbl);
int64_t ray_table_nrows(ray_t* tbl);
ray_t* ray_table_schema(ray_t* tbl);
ray_t* ray_dict_new(ray_t* keys, ray_t* vals);
ray_t* ray_dict_keys(ray_t* d);
ray_t* ray_dict_vals(ray_t* d);
int64_t ray_dict_len(ray_t* d);
ray_t* ray_dict_get(ray_t* d, ray_t* key_atom);
ray_t* ray_dict_upsert(ray_t* d, ray_t* key_atom, ray_t* val);
ray_t* ray_dict_remove(ray_t* d, ray_t* key_atom);
typedef struct ray_runtime_s ray_runtime_t;
ray_runtime_t* ray_runtime_create(int argc, char** argv);
ray_runtime_t* ray_runtime_create_with_sym(const char* sym_path);
ray_runtime_t* ray_runtime_create_with_sym_err(const char* sym_path,
ray_err_t* out_sym_err);
void ray_runtime_destroy(ray_runtime_t* rt);
ray_t* ray_eval_str(const char* source);
#ifdef __cplusplus
}
#endif
#endif