#include "atom.h"
#include <string.h>
ray_t* ray_bool(bool val) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_BOOL;
v->b8 = val ? 1 : 0;
return v;
}
ray_t* ray_u8(uint8_t val) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_U8;
v->u8 = val;
return v;
}
ray_t* ray_i16(int16_t val) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_I16;
v->i16 = val;
return v;
}
ray_t* ray_i32(int32_t val) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_I32;
v->i32 = val;
return v;
}
ray_t* ray_i64(int64_t val) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_I64;
v->i64 = val;
return v;
}
ray_t* ray_f64(double val) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_F64;
v->f64 = val;
return v;
}
ray_t* ray_f32(float val) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_F32;
v->f64 = (double)val;
return v;
}
ray_t* ray_str(const char* s, size_t len) {
if (len < 7) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_STR;
v->slen = (uint8_t)len;
if (len > 0) memcpy(v->sdata, s, len);
v->sdata[len] = '\0';
return v;
}
size_t data_size = len + 1;
ray_t* chars = ray_alloc(data_size);
if (!chars || RAY_IS_ERR(chars)) return chars;
chars->type = RAY_U8;
chars->len = (int64_t)len;
memcpy(ray_data(chars), s, len);
((char*)ray_data(chars))[len] = '\0';
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) {
ray_free(chars);
return v;
}
v->type = -RAY_STR;
v->obj = chars;
return v;
}
ray_t* ray_sym(int64_t id) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_SYM;
v->i64 = id;
return v;
}
ray_t* ray_date(int64_t val) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_DATE;
v->i64 = val;
return v;
}
ray_t* ray_time(int64_t val) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_TIME;
v->i64 = val;
return v;
}
ray_t* ray_timestamp(int64_t val) {
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = -RAY_TIMESTAMP;
v->i64 = val;
return v;
}
ray_t* ray_typed_null(int8_t type) {
if (type >= 0) return ray_error("type", NULL);
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) return v;
v->type = type;
v->i64 = 0;
v->nullmap[0] |= 1;
return v;
}
ray_t* ray_guid(const uint8_t* bytes) {
ray_t* vec = ray_alloc(16);
if (!vec || RAY_IS_ERR(vec)) return vec;
vec->type = RAY_U8;
vec->len = 16;
memcpy(ray_data(vec), bytes, 16);
ray_t* v = ray_alloc(0);
if (RAY_IS_ERR(v)) {
ray_free(vec);
return v;
}
v->type = -RAY_GUID;
v->obj = vec;
return v;
}