diff options
Diffstat (limited to 'bytecode/slice.h')
| -rw-r--r-- | bytecode/slice.h | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/bytecode/slice.h b/bytecode/slice.h index 577befd..4f4624c 100644 --- a/bytecode/slice.h +++ b/bytecode/slice.h @@ -1,27 +1,33 @@ #ifndef _SLICE_H_ #define _SLICE_H_ +#include <assert.h> #include <stddef.h> -#include <stdint.h> -#include "value.h" - -struct slice { - size_t size; - uint8_t *buf; -}; - -struct val_slice { - size_t size; - value *buf; -}; - -struct slice slice(struct slice, size_t, size_t); - -struct slice slice1(struct slice, size_t); - -struct val_slice val_slice(struct val_slice, size_t, size_t); - -struct val_slice val_slice1(struct val_slice, size_t); +#define DEFINE_SLICE(t) \ + typedef struct { \ + size_t size; \ + t *buf; \ + } t##_slice; \ + \ + static inline t##_slice \ + t##_slice2(t##_slice slice, size_t i, size_t j) \ + { \ + assert(i <= slice.size && j <= slice.size && i <= j); \ + return (t##_slice) { \ + .size = j - i, \ + .buf = slice.buf + i, \ + }; \ + } \ + \ + static inline t##_slice \ + t##_slice1(t##_slice slice, size_t i) \ + { \ + assert(i <= slice.size); \ + return (t##_slice) { \ + .size = slice.size - i, \ + .buf = slice.buf + i, \ + }; \ + } #endif |
