#ifndef __SPARSE_H__ #define __SPARSE_H__ #pragma once #define JOIN_HELPER(x, y) x##y #define JOIN(x, y) JOIN_HELPER(x, y) #define TYPE_PAD(size) char JOIN(_pad_, __COUNTER__)[size] #define TYPE_VARIADIC_BEGIN(name) name { union { #define TYPE_BEGIN(name, size) name { union { TYPE_PAD(size) #define TYPE_END(...) }; } __VA_ARGS__ #define TYPE_FIELD(field, offset) struct { TYPE_PAD(offset); field; } #define TYPE_CHECK_SIZE(name, size) \ _Static_assert(sizeof(name) == (size), "Size of " #name " != " #size) #define TYPE_CHECK_FIELD_OFFSET(name, member, offset) \ _Static_assert(offsetof(name, member) == (offset), "Offset of " #name "." #member " != " #offset) #define TYPE_CHECK_FIELD_SIZE(name, member, size) \ _Static_assert(sizeof(((name*)0)->member) == (size), "Size of " #name "." #member " != " #size) #define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) #define KCALL_REL32(k, src, dest) do { *(uint32_t *)(k + src + 1) = (dest - src - k - 5); } while(0); #endif