ovni/src/emu/value.h

82 lines
1.3 KiB
C

#ifndef VALUE_H
#define VALUE_H
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include "common.h"
enum value_type {
VALUE_NULL = 0,
VALUE_INT64,
VALUE_DOUBLE
};
/* Packed allows the struct to be hashable, as we don't have any
* unitialized data */
struct __attribute__((packed)) value {
enum value_type type;
union {
int64_t i;
double d;
};
};
static inline int
value_is_equal(struct value *a, struct value *b)
{
if (a->type != b->type)
return 0;
if (a->type == VALUE_INT64 && a->i == b->i)
return 1;
else if (a->type == VALUE_DOUBLE && a->d == b->d)
return 1;
else if (a->type == VALUE_NULL && b->type == VALUE_NULL)
return 1;
else
return 0;
}
static inline struct value
value_int64(int64_t i)
{
struct value v = { .type = VALUE_INT64, .i = i };
return v;
}
static inline struct value
value_null(void)
{
struct value v = { .type = VALUE_NULL, .i = 0 };
return v;
}
static inline int
value_is_null(struct value a)
{
return (a.type == VALUE_NULL);
}
static inline char *
value_str(struct value a, char *buf)
{
switch (a.type) {
case VALUE_NULL:
sprintf(buf, "{NULL}");
break;
case VALUE_INT64:
sprintf(buf, "{int64_t %ld}", a.i);
break;
case VALUE_DOUBLE:
sprintf(buf, "{double %e}", a.d);
break;
default:
die("value_str: unexpected value type\n");
}
return buf;
}
#endif /* VALUE_H */