00001 #pragma once
00002 #ifndef _SEXP_VALUE_H
00003 #define _SEXP_VALUE_H
00004
00005 #include <stddef.h>
00006 #include <stdint.h>
00007 #include <stdbool.h>
00008 #include "_sexp-types.h"
00009
00010 typedef uint8_t SEXP_valtype_t;
00011
00012 #define SEXP_VALTYPE_EMPTY 0
00013 #define SEXP_VALTYPE_STRING 1
00014 #define SEXP_VALTYPE_NUMBER 2
00015 #define SEXP_VALTYPE_LIST 3
00016
00017 typedef struct {
00018 uint32_t refs;
00019 size_t size;
00020 } SEXP_valhdr_t;
00021
00022 typedef struct {
00023 uintptr_t ptr;
00024 SEXP_valhdr_t *hdr;
00025 void *mem;
00026 SEXP_valtype_t type;
00027 } SEXP_val_t;
00028
00029 #define SEXP_VALP_ALIGN sizeof (void *)
00030 #define SEXP_VALP_MASK (UINTPTR_MAX << 2)
00031 #define SEXP_VALT_MASK 3
00032 #define SEXP_VALP_HDR(p) ((SEXP_valhdr_t *)(((uintptr_t)(p)) & SEXP_VALP_MASK))
00033
00034 int SEXP_val_new (SEXP_val_t *dst, size_t vmemsize, SEXP_valtype_t type);
00035 void SEXP_val_dsc (SEXP_val_t *dst, uintptr_t ptr);
00036 uintptr_t SEXP_val_ptr (SEXP_val_t *dsc);
00037
00038 uintptr_t SEXP_rawval_incref (uintptr_t valp);
00039 int SEXP_rawval_decref (uintptr_t valp);
00040
00041 #define SEXP_DEFNUM(s,T) struct SEXP_val_num_##s { T n; SEXP_numtype_t t; } __attribute__ ((packed))
00042 #define SEXP_NCASTP(s,p) ((struct SEXP_val_num_##s *)(p))
00043 #define SEXP_NTYPEP(s,p) *((SEXP_numtype_t *)(((uint8_t *)(p)) + (s) - sizeof (SEXP_numtype_t)))
00044
00045 SEXP_DEFNUM(b, bool);
00046 SEXP_DEFNUM(f, double);
00047 SEXP_DEFNUM(i8, int8_t);
00048 SEXP_DEFNUM(u8, uint8_t);
00049 SEXP_DEFNUM(i16, int16_t);
00050 SEXP_DEFNUM(u16, uint16_t);
00051 SEXP_DEFNUM(i32, int32_t);
00052 SEXP_DEFNUM(u32, uint32_t);
00053 SEXP_DEFNUM(i64, int64_t);
00054 SEXP_DEFNUM(u64, uint64_t);
00055
00056
00057
00058
00059
00060 struct SEXP_val_list {
00061 void *b_addr;
00062 uint16_t offset;
00063 };
00064
00065 #define SEXP_LCASTP(p) ((struct SEXP_val_list *)(p))
00066
00067 struct SEXP_val_lblk {
00068 uintptr_t nxsz;
00069 uint16_t real;
00070 uint16_t refs;
00071 SEXP_t memb[];
00072 };
00073
00074 size_t SEXP_rawval_list_length (struct SEXP_val_list *list);
00075 uintptr_t SEXP_rawval_list_copy (uintptr_t lblkp, uint16_t n_skip);
00076
00077 uintptr_t SEXP_rawval_lblk_new (uint8_t sz);
00078 uintptr_t SEXP_rawval_lblk_fill (uintptr_t lblkp, SEXP_t *s_exp[], uint16_t s_exp_count);
00079 uintptr_t SEXP_rawval_lblk_add (uintptr_t lblkp, SEXP_t *s_exp);
00080 uintptr_t SEXP_rawval_lblk_add1 (uintptr_t lblkp, SEXP_t *s_exp);
00081 uintptr_t SEXP_rawval_lblk_last (uintptr_t lblkp);
00082 SEXP_t *SEXP_rawval_lblk_nth (uintptr_t lblkp, uint32_t n);
00083 uintptr_t SEXP_rawval_lblk_replace (uintptr_t lblkp, uint32_t n, SEXP_t *n_val, SEXP_t **o_val);
00084 int SEXP_rawval_lblk_cb (uintptr_t lblkp, int (*func) (SEXP_t *, void *), void *arg, uint32_t n);
00085 void SEXP_rawval_lblk_free (uintptr_t lblkp, void (*func) (SEXP_t *));
00086 void SEXP_rawval_lblk_free1 (uintptr_t lblkp, void (*func) (SEXP_t *));
00087
00088 #define SEXP_LBLK_ALIGN 16
00089 #define SEXP_LBLKP_MASK (UINTPTR_MAX << 4)
00090 #define SEXP_LBLKS_MASK 0x0f
00091
00092 #define SEXP_VALP_LBLK(valp) ((struct SEXP_val_lblk *)((uintptr_t)(valp) & SEXP_LBLKP_MASK))
00093
00094 #endif