generate all length prefix array variants via macro
This commit is contained in:
parent
4c7302c4a3
commit
e29a5a3475
7 changed files with 175 additions and 241 deletions
morphisms/runtime/include/array
|
@ -1,70 +1,101 @@
|
|||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/* UInt8 */
|
||||
// Macro to define length-prefixed array structures and functions
|
||||
#define DEFINE_LENGTH_PREFIX_ARRAY(LEN_TYPE, ITEM_TYPE) \
|
||||
typedef struct { \
|
||||
LEN_TYPE len; \
|
||||
ITEM_TYPE items[]; \
|
||||
} LengthPrefix_##LEN_TYPE##_Array_##ITEM_TYPE; \
|
||||
\
|
||||
static inline void length_prefix_##LEN_TYPE##_array_##ITEM_TYPE##_clear( \
|
||||
LengthPrefix_##LEN_TYPE##_Array_##ITEM_TYPE *data) { \
|
||||
data->len = 0; \
|
||||
} \
|
||||
\
|
||||
static inline void length_prefix_##LEN_TYPE##_array_##ITEM_TYPE##_push( \
|
||||
LengthPrefix_##LEN_TYPE##_Array_##ITEM_TYPE *data, \
|
||||
ITEM_TYPE value) { \
|
||||
data->items[data->len++] = value; \
|
||||
} \
|
||||
\
|
||||
static inline int length_prefix_##LEN_TYPE##_array_##ITEM_TYPE##_reverse( \
|
||||
LengthPrefix_##LEN_TYPE##_Array_##ITEM_TYPE const * restrict src, \
|
||||
LengthPrefix_##LEN_TYPE##_Array_##ITEM_TYPE *restrict dst) { \
|
||||
for (LEN_TYPE i = 0; i < src->len; i++) { \
|
||||
dst->items[i] = src->items[src->len - 1 - i]; \
|
||||
} \
|
||||
dst->len = src->len; \
|
||||
return 0; \
|
||||
} \
|
||||
\
|
||||
static inline void length_prefix_##LEN_TYPE##_array_##ITEM_TYPE##_dump( \
|
||||
LengthPrefix_##LEN_TYPE##_Array_##ITEM_TYPE const * data) { \
|
||||
printf("Length: %llu\n", (unsigned long long) data->len); \
|
||||
for (LEN_TYPE i = 0; i < data->len; i++) { \
|
||||
printf("%llu ", (unsigned long long) data->items[i]); \
|
||||
} \
|
||||
printf("\n"); \
|
||||
}
|
||||
|
||||
struct LengthPrefixUInt8Array {
|
||||
uint64_t len;
|
||||
uint8_t items[];
|
||||
};
|
||||
|
||||
void length_prefix_uint8_array_clear(
|
||||
struct LengthPrefixUInt8Array * data
|
||||
);
|
||||
void length_prefix_uint8_array_push(
|
||||
struct LengthPrefixUInt8Array * data,
|
||||
uint8_t value
|
||||
);
|
||||
int length_prefix_uint8_array_reverse(
|
||||
struct LengthPrefixUInt8Array const * restrict src,
|
||||
struct LengthPrefixUInt8Array * restrict dst
|
||||
);
|
||||
void length_prefix_uint8_array_dump(
|
||||
struct LengthPrefixUInt8Array const * data
|
||||
);
|
||||
|
||||
/* UInt64 */
|
||||
|
||||
struct LengthPrefixUInt64Array {
|
||||
uint64_t len;
|
||||
uint64_t items[];
|
||||
};
|
||||
|
||||
void length_prefix_uint64_array_clear(
|
||||
struct LengthPrefixUInt64Array * data
|
||||
);
|
||||
void length_prefix_uint64_array_push(
|
||||
struct LengthPrefixUInt64Array * data,
|
||||
uint64_t value
|
||||
);
|
||||
int length_prefix_uint64_array_reverse(
|
||||
struct LengthPrefixUInt64Array const * restrict src,
|
||||
struct LengthPrefixUInt64Array * restrict dst
|
||||
);
|
||||
void length_prefix_uint64_array_dump(
|
||||
struct LengthPrefixUInt64Array const * data
|
||||
);
|
||||
// Define all combinations of length and item types
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint8_t, uint8_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint8_t, uint16_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint8_t, uint32_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint8_t, uint64_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint16_t, uint8_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint16_t, uint16_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint16_t, uint32_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint16_t, uint64_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint32_t, uint8_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint32_t, uint16_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint32_t, uint32_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint32_t, uint64_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint64_t, uint8_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint64_t, uint16_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint64_t, uint32_t)
|
||||
DEFINE_LENGTH_PREFIX_ARRAY(uint64_t, uint64_t)
|
||||
|
||||
/*
|
||||
* Map
|
||||
*/
|
||||
int length_prefix_array_map_64_to_64(
|
||||
int (*f) ( uint64_t const * restrict, uint64_t * restrict ),
|
||||
struct LengthPrefixUInt64Array const * restrict src,
|
||||
struct LengthPrefixUInt64Array * restrict dst
|
||||
);
|
||||
int length_prefix_array_map_8_to_64(
|
||||
int (*f) ( uint8_t const * restrict, uint64_t * restrict ),
|
||||
struct LengthPrefixUInt8Array const * restrict src,
|
||||
struct LengthPrefixUInt64Array * restrict dst
|
||||
);
|
||||
int length_prefix_array_map_64_to_8(
|
||||
int (*f) ( uint64_t const * restrict, uint8_t * restrict ),
|
||||
struct LengthPrefixUInt64Array const * restrict src,
|
||||
struct LengthPrefixUInt8Array * restrict dst
|
||||
);
|
||||
int length_prefix_array_map_8_to_8(
|
||||
int (*f) ( uint8_t const * restrict, uint8_t * restrict ),
|
||||
struct LengthPrefixUInt8Array const * restrict src,
|
||||
struct LengthPrefixUInt8Array * restrict dst
|
||||
);
|
||||
// Macro to define map function between different item types
|
||||
#define DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, SRC_ITEM_TYPE, DST_ITEM_TYPE) \
|
||||
static inline int length_prefix_##LEN_TYPE##_array_map_##SRC_ITEM_TYPE##_to_##DST_ITEM_TYPE( \
|
||||
int (*f)(SRC_ITEM_TYPE const * restrict, DST_ITEM_TYPE * restrict), \
|
||||
LengthPrefix_##LEN_TYPE##_Array_##SRC_ITEM_TYPE const * restrict src, \
|
||||
LengthPrefix_##LEN_TYPE##_Array_##DST_ITEM_TYPE * restrict dst) \
|
||||
{ \
|
||||
if (dst->len < src->len) return -1; /* Ensure enough space */ \
|
||||
for (LEN_TYPE i = 0; i < src->len; i++) { \
|
||||
if (f(&src->items[i], &dst->items[i]) != 0) return -1; \
|
||||
} \
|
||||
dst->len = src->len; \
|
||||
return 0; \
|
||||
}
|
||||
|
||||
#define DEFINE_ALL_MAPS(LEN_TYPE) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint8_t, uint8_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint8_t, uint16_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint8_t, uint32_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint8_t, uint64_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint16_t, uint8_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint16_t, uint16_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint16_t, uint32_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint16_t, uint64_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint32_t, uint8_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint32_t, uint16_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint32_t, uint32_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint32_t, uint64_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint64_t, uint8_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint64_t, uint16_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint64_t, uint32_t) \
|
||||
DEFINE_LENGTH_PREFIX_ARRAY_MAP(LEN_TYPE, uint64_t, uint64_t)
|
||||
|
||||
DEFINE_ALL_MAPS(uint8_t)
|
||||
DEFINE_ALL_MAPS(uint16_t)
|
||||
DEFINE_ALL_MAPS(uint32_t)
|
||||
DEFINE_ALL_MAPS(uint64_t)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue