main
Dominik Madarász 2023-10-16 22:07:29 +02:00
parent 1e3a34ddf3
commit 9499a5b9d9
11 changed files with 143 additions and 147 deletions

@ -1 +1 @@
Subproject commit a23d27f206b89c4971803fdc74ac0d3a7b65217a Subproject commit 27e24e603f1d1405c74c3fc9b241ed6c26185ba2

View File

@ -2251,7 +2251,7 @@ typedef uint16_t half;
uint64_t pack64iv( uint8_t *buffer, int64_t value_ ); uint64_t pack64iv( uint8_t *buffer, int64_t value_ );
uint64_t unpack64iv( const uint8_t *buffer, int64_t *value ); uint64_t unpack64iv( const uint8_t *buffer, int64_t *value );
int msgpack(const char *fmt, ... ); int msgpack(const char *fmt, ... );
bool msgunpack(const char *fmt, ... ); int msgunpack(const char *fmt, ... );
int msgpack_new(uint8_t *w, size_t l); int msgpack_new(uint8_t *w, size_t l);
int msgpack_nil(); int msgpack_nil();
int msgpack_chr(bool n); int msgpack_chr(bool n);
@ -2440,12 +2440,17 @@ extern profiler_t profiler;
extern int profiler_enabled; extern int profiler_enabled;
typedef struct reflect_t { typedef struct reflect_t {
unsigned id, objtype; unsigned id, objtype;
union {
unsigned sz; unsigned sz;
unsigned member_offset;
unsigned enum_value;
};
const char *name; const char *name;
const char *info; const char *info;
void *addr; void *addr;
unsigned parent; unsigned parent;
const char *type; const char *type;
unsigned bytes;
} reflect_t; } reflect_t;
unsigned enum_find(const char *E); unsigned enum_find(const char *E);
void * function_find(const char *F); void * function_find(const char *F);
@ -2455,7 +2460,7 @@ const char *type;
void type_inscribe(const char *TY,unsigned TYid,unsigned TYsz,const char *infos); void type_inscribe(const char *TY,unsigned TYid,unsigned TYsz,const char *infos);
void enum_inscribe(const char *E,unsigned Eid,unsigned Eval,const char *infos); void enum_inscribe(const char *E,unsigned Eid,unsigned Eval,const char *infos);
void struct_inscribe(const char *T,unsigned Tid,unsigned Tsz,unsigned OBJTYPEid, const char *infos); void struct_inscribe(const char *T,unsigned Tid,unsigned Tsz,unsigned OBJTYPEid, const char *infos);
void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type); void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type, unsigned bytes);
void function_inscribe(const char *F,unsigned Fid,void *func,const char *infos); void function_inscribe(const char *F,unsigned Fid,void *func,const char *infos);
void reflect_print(const char *symbol); void reflect_print(const char *symbol);
void reflect_dump(const char *mask); void reflect_dump(const char *mask);

View File

@ -14202,7 +14202,8 @@ extern "C" {
#define macro(name) concat(name, __LINE__) #define macro(name) concat(name, __LINE__)
#define defer(begin,end) for(int macro(i) = ((begin), 0); !macro(i); macro(i) = ((end), 1)) #define defer(begin,end) for(int macro(i) = ((begin), 0); !macro(i); macro(i) = ((end), 1))
#define scope(end) defer((void)0, end) #define scope(end) defer((void)0, end)
#define benchmark for(double macro(i) = 1, macro(t) = -time_ss(); macro(i); macro(t)+=time_ss(), macro(i)=0, printf("%.4fs %2.f%% (" FILELINE ")\n", macro(t), macro(t)*100/0.0166667 )) #define benchmark for(double macro(i) = 1, macro(t) = (time_ss(),-time_ss()); macro(i); macro(t)+=time_ss(), macro(i)=0, printf("%.4fs %2.f%% (" FILELINE ")\n", macro(t), macro(t)*100/0.0166667 ))
#define benchmark_ms for(double macro(i) = 1, macro(t) = (time_ss(),-time_ss()); macro(i); macro(t)+=time_ss(), macro(i)=0, printf("%.2fms %2.f%% (" FILELINE ")\n", macro(t)*1000, macro(t)*100/0.016666667 ))
#define do_once static int macro(once) = 0; for(;!macro(once);macro(once)=1) #define do_once static int macro(once) = 0; for(;!macro(once);macro(once)=1)
#if is(cl) #if is(cl)
@ -14318,7 +14319,7 @@ extern "C" {
static void fn(void) static void fn(void)
#else // gcc,tcc,clang,clang-cl... #else // gcc,tcc,clang,clang-cl...
#define AUTORUN_(fn) \ #define AUTORUN_(fn) \
__attribute__((constructor)) \ __attribute__((constructor(__COUNTER__+101))) \
static void fn(void) static void fn(void)
#endif #endif
@ -16128,8 +16129,8 @@ API uint64_t unpack64iv( const uint8_t *buffer, int64_t *value );
// api v2 // api v2
API int msgpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{" API int msgpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{". returns number of written bytes
API bool msgunpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{" API int msgunpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{". returns number of parsed args
// api v1 // api v1
@ -16610,26 +16611,31 @@ extern API int profiler_enabled; ///-
typedef struct reflect_t { typedef struct reflect_t {
unsigned id, objtype; unsigned id, objtype;
union {
unsigned sz; unsigned sz;
unsigned member_offset;
unsigned enum_value;
};
const char *name; const char *name;
const char *info; const char *info;
void *addr; void *addr;
unsigned parent; unsigned parent;
const char *type; const char *type;
unsigned bytes;
} reflect_t; } reflect_t;
// inscribe api // inscribe api
#define ENUM(V, value_annotations) \ #define ENUM(V, .../*value_annotations*/) \
enum_inscribe(#V,intern(#V),V, value_annotations) enum_inscribe(#V,intern(#V),V, "" __VA_ARGS__/*value_annotations*/)
#define FUNCTION(F, function_annotations) \ #define FUNCTION(F, .../*function_annotations*/) \
function_inscribe(#F,intern(#F),(void*)F, function_annotations) function_inscribe(#F,intern(#F),(void*)F, "" __VA_ARGS__/*function_annotations*/)
#define STRUCT(T, type, member, member_annotations) \ #define STRUCT(T, type, member, .../*member_annotations*/) \
struct_inscribe(#T,intern(#T),sizeof(T),OBJTYPE(T),NULL), \ struct_inscribe(#T,intern(#T),sizeof(T),OBJTYPE(T),NULL), \
type_inscribe(#type,intern(#type),sizeof(((T){0}).member),member_annotations), \ type_inscribe(#type,intern(#type),sizeof(((T){0}).member),"" __VA_ARGS__/*member_annotations*/), \
member_inscribe(intern(#T), #member,intern(#member),(uintptr_t)&((T*)0)->member, member_annotations, #type ) member_inscribe(intern(#T), #member,intern(#member),(uintptr_t)&((T*)0)->member, "" __VA_ARGS__/*member_annotations*/, #type, sizeof(((T){0}).member) )
// find api // find api
@ -16637,7 +16643,7 @@ API unsigned enum_find(const char *E);
API void * function_find(const char *F); API void * function_find(const char *F);
API reflect_t member_find(const char *T, const char *M); /// find specific member API reflect_t member_find(const char *T, const char *M); /// find specific member
API void * member_findptr(void *obj, const char *T, const char *M); API void * member_findptr(void *obj, const char *T, const char *M); // @deprecate
API array(reflect_t) members_find(const char *T); API array(reflect_t) members_find(const char *T);
// iterate members in a struct // iterate members in a struct
@ -16652,7 +16658,7 @@ API array(reflect_t) members_find(const char *T);
API void type_inscribe(const char *TY,unsigned TYid,unsigned TYsz,const char *infos); API void type_inscribe(const char *TY,unsigned TYid,unsigned TYsz,const char *infos);
API void enum_inscribe(const char *E,unsigned Eid,unsigned Eval,const char *infos); API void enum_inscribe(const char *E,unsigned Eid,unsigned Eval,const char *infos);
API void struct_inscribe(const char *T,unsigned Tid,unsigned Tsz,unsigned OBJTYPEid, const char *infos); API void struct_inscribe(const char *T,unsigned Tid,unsigned Tsz,unsigned OBJTYPEid, const char *infos);
API void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type); API void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type, unsigned bytes);
API void function_inscribe(const char *F,unsigned Fid,void *func,const char *infos); API void function_inscribe(const char *F,unsigned Fid,void *func,const char *infos);
API void reflect_print(const char *symbol); API void reflect_print(const char *symbol);
@ -343085,7 +343091,7 @@ int msgpack(const char *fmt, ... ) {
va_end(vl); va_end(vl);
return count; return count;
} }
bool msgunpack(const char *fmt, ... ) { int msgunpack(const char *fmt, ... ) {
int count = 0; int count = 0;
va_list vl; va_list vl;
va_start(vl, fmt); va_start(vl, fmt);
@ -343100,7 +343106,7 @@ bool msgunpack(const char *fmt, ... ) {
// break; case 'b': { bool *v = !!va_arg(vl, bool*); count += msgunpack_chr(v); } // break; case 'b': { bool *v = !!va_arg(vl, bool*); count += msgunpack_chr(v); }
// break; case 'e': { uint8_t k = va_arg(vl, uint64_t); void *v = va_arg(vl, void*); size_t l = va_arg(vl, uint64_t); count += msgunpack_ext( k, v, l ); } // break; case 'e': { uint8_t k = va_arg(vl, uint64_t); void *v = va_arg(vl, void*); size_t l = va_arg(vl, uint64_t); count += msgunpack_ext( k, v, l ); }
// break; case 'n': { count += msgunpack_nil(); } // break; case 'n': { count += msgunpack_nil(); }
// break; case 'p': { void *p = va_arg(vl, void*); size_t l = va_arg(vl, uint64_t); count += msgunpack_bin( p, l ); } break; case 'p': { void *p = va_arg(vl, void*); uint64_t l = va_arg(vl, uint64_t); count += msgunpack_bin( p, &l ); }
// break; case 'u': { uint64_t v = va_arg(vl, uint64_t); count += msgunpack_uns(v); } // break; case 'u': { uint64_t v = va_arg(vl, uint64_t); count += msgunpack_uns(v); }
// break; case 'd': case 'i': { int64_t v = va_arg(vl, int64_t); count += msgunpack_int(v); } // break; case 'd': case 'i': { int64_t v = va_arg(vl, int64_t); count += msgunpack_int(v); }
default: /*count = 0;*/ break; default: /*count = 0;*/ break;
@ -343886,13 +343892,13 @@ void struct_inscribe(const char *T,unsigned Tid,unsigned Tsz,unsigned OBJTYPEid,
reflect_init(); reflect_init();
map_find_or_add(reflects, Tid, ((reflect_t){Tid, OBJTYPEid, Tsz, T, infos})); map_find_or_add(reflects, Tid, ((reflect_t){Tid, OBJTYPEid, Tsz, T, infos}));
} }
void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type) { void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type, unsigned bytes) {
reflect_init(); reflect_init();
map_find_or_add(reflects, (Mid<<16)|Tid, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type })); map_find_or_add(reflects, (Mid<<16)|Tid, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type }));
// add member separately as well // add member separately as well
if(!members) map_init_int(members); if(!members) map_init_int(members);
array(reflect_t) *found = map_find_or_add(members, Tid, 0); array(reflect_t) *found = map_find_or_add(members, Tid, 0);
array_push(*found, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type })); array_push(*found, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type, bytes }));
} }
reflect_t member_find(const char *T, const char *M) { reflect_t member_find(const char *T, const char *M) {
reflect_init(); reflect_init();
@ -343943,53 +343949,42 @@ void reflect_print(const char *symbol) {
// -- tests // -- tests
enum { // type0 is reserved (no type)
MYVALUE0 = 0, // type1 reserved for objs
MYVALUE1, // type2 reserved for entities
MYVALUE2, // @todo: type3 and 4 likely reserved for components and systems??
MYVALUEA = 123, // enum { OBJTYPE_vec3 = 0x03 };
};
typedef struct MyVec4 {
float x,y,z,w;
} MyVec4;
enum { OBJTYPE_MyVec4 = 0x01 };
AUTOTEST { AUTOTEST {
// register structs, enums and functions // register structs, enums and functions. with and without comments+tags
STRUCT( MyVec4, float, x, "Right" ); STRUCT( vec3, float, x );
STRUCT( MyVec4, float, y, "Forward" ); STRUCT( vec3, float, y );
STRUCT( MyVec4, float, z, "Up" ); STRUCT( vec3, float, z, "Up" );
STRUCT( MyVec4, float, w, "W" );
ENUM( MYVALUE0, "bla bla #0" ); ENUM( IMAGE_RGB );
ENUM( MYVALUE1, "bla bla #1" ); ENUM( TEXTURE_RGB, "3-channel Red+Green+Blue texture flag" );
ENUM( MYVALUE2, "bla bla #2" ); ENUM( TEXTURE_RGBA, "4-channel Red+Green+Blue+Alpha texture flag" );
ENUM( MYVALUEA, "bla bla (A)" );
FUNCTION( puts, "handy function that I use a lot" ); FUNCTION( puts );
FUNCTION( printf, "handy function that I use a lot" ); FUNCTION( printf, "function that prints formatted text to stdout" );
// verify some reflected infos // verify some reflected infos
test( function_find("puts") == puts ); test( function_find("puts") == puts );
test( function_find("printf") == printf ); test( function_find("printf") == printf );
test( enum_find("MYVALUE0") == MYVALUE0 ); test( enum_find("TEXTURE_RGB") == TEXTURE_RGB );
test( enum_find("MYVALUE1") == MYVALUE1 ); test( enum_find("TEXTURE_RGBA") == TEXTURE_RGBA );
test( enum_find("MYVALUE2") == MYVALUE2 );
test( enum_find("MYVALUEA") == MYVALUEA );
// iterate reflected struct // iterate reflected struct
for each_member("MyVec4", R) { for each_member("vec3", R) {
// printf("+%s MyVec4.%s // %s\n", R->type, R->name, R->info); //printf("+%s vec3.%s (+%x) // %s\n", R->type, R->name, R->member_offset, R->info);
} }
// reflect_print("puts"); // reflect_print("puts");
// reflect_print("MYVALUE0"); //reflect_print("TEXTURE_RGBA");
// reflect_print("MyVec4"); //reflect_print("vec3");
// reflect_dump("*"); // reflect_dump("*");
} }
@ -354705,6 +354700,8 @@ void glNewFrame() {
} }
bool window_create_from_handle(void *handle, float scale, unsigned flags) { bool window_create_from_handle(void *handle, float scale, unsigned flags) {
ifdef(debug, if( flag("--tests") ) exit(0));
glfw_init(); glfw_init();
v4k_init(); v4k_init();
if(!t) t = glfwGetTime(); if(!t) t = glfwGetTime();

View File

@ -171,7 +171,8 @@
#define macro(name) concat(name, __LINE__) #define macro(name) concat(name, __LINE__)
#define defer(begin,end) for(int macro(i) = ((begin), 0); !macro(i); macro(i) = ((end), 1)) #define defer(begin,end) for(int macro(i) = ((begin), 0); !macro(i); macro(i) = ((end), 1))
#define scope(end) defer((void)0, end) #define scope(end) defer((void)0, end)
#define benchmark for(double macro(i) = 1, macro(t) = -time_ss(); macro(i); macro(t)+=time_ss(), macro(i)=0, printf("%.4fs %2.f%% (" FILELINE ")\n", macro(t), macro(t)*100/0.0166667 )) #define benchmark for(double macro(i) = 1, macro(t) = (time_ss(),-time_ss()); macro(i); macro(t)+=time_ss(), macro(i)=0, printf("%.4fs %2.f%% (" FILELINE ")\n", macro(t), macro(t)*100/0.0166667 ))
#define benchmark_ms for(double macro(i) = 1, macro(t) = (time_ss(),-time_ss()); macro(i); macro(t)+=time_ss(), macro(i)=0, printf("%.2fms %2.f%% (" FILELINE ")\n", macro(t)*1000, macro(t)*100/0.016666667 ))
#define do_once static int macro(once) = 0; for(;!macro(once);macro(once)=1) #define do_once static int macro(once) = 0; for(;!macro(once);macro(once)=1)
#if is(cl) #if is(cl)
@ -287,7 +288,7 @@
static void fn(void) static void fn(void)
#else // gcc,tcc,clang,clang-cl... #else // gcc,tcc,clang,clang-cl...
#define AUTORUN_(fn) \ #define AUTORUN_(fn) \
__attribute__((constructor)) \ __attribute__((constructor(__COUNTER__+101))) \
static void fn(void) static void fn(void)
#endif #endif

View File

@ -773,7 +773,7 @@ int msgpack(const char *fmt, ... ) {
va_end(vl); va_end(vl);
return count; return count;
} }
bool msgunpack(const char *fmt, ... ) { int msgunpack(const char *fmt, ... ) {
int count = 0; int count = 0;
va_list vl; va_list vl;
va_start(vl, fmt); va_start(vl, fmt);
@ -788,7 +788,7 @@ bool msgunpack(const char *fmt, ... ) {
// break; case 'b': { bool *v = !!va_arg(vl, bool*); count += msgunpack_chr(v); } // break; case 'b': { bool *v = !!va_arg(vl, bool*); count += msgunpack_chr(v); }
// break; case 'e': { uint8_t k = va_arg(vl, uint64_t); void *v = va_arg(vl, void*); size_t l = va_arg(vl, uint64_t); count += msgunpack_ext( k, v, l ); } // break; case 'e': { uint8_t k = va_arg(vl, uint64_t); void *v = va_arg(vl, void*); size_t l = va_arg(vl, uint64_t); count += msgunpack_ext( k, v, l ); }
// break; case 'n': { count += msgunpack_nil(); } // break; case 'n': { count += msgunpack_nil(); }
// break; case 'p': { void *p = va_arg(vl, void*); size_t l = va_arg(vl, uint64_t); count += msgunpack_bin( p, l ); } break; case 'p': { void *p = va_arg(vl, void*); uint64_t l = va_arg(vl, uint64_t); count += msgunpack_bin( p, &l ); }
// break; case 'u': { uint64_t v = va_arg(vl, uint64_t); count += msgunpack_uns(v); } // break; case 'u': { uint64_t v = va_arg(vl, uint64_t); count += msgunpack_uns(v); }
// break; case 'd': case 'i': { int64_t v = va_arg(vl, int64_t); count += msgunpack_int(v); } // break; case 'd': case 'i': { int64_t v = va_arg(vl, int64_t); count += msgunpack_int(v); }
default: /*count = 0;*/ break; default: /*count = 0;*/ break;

View File

@ -152,8 +152,8 @@ API uint64_t unpack64iv( const uint8_t *buffer, int64_t *value );
// api v2 // api v2
API int msgpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{" API int msgpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{". returns number of written bytes
API bool msgunpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{" API int msgunpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{". returns number of parsed args
// api v1 // api v1

View File

@ -39,13 +39,13 @@ void struct_inscribe(const char *T,unsigned Tid,unsigned Tsz,unsigned OBJTYPEid,
reflect_init(); reflect_init();
map_find_or_add(reflects, Tid, ((reflect_t){Tid, OBJTYPEid, Tsz, T, infos})); map_find_or_add(reflects, Tid, ((reflect_t){Tid, OBJTYPEid, Tsz, T, infos}));
} }
void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type) { void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type, unsigned bytes) {
reflect_init(); reflect_init();
map_find_or_add(reflects, (Mid<<16)|Tid, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type })); map_find_or_add(reflects, (Mid<<16)|Tid, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type }));
// add member separately as well // add member separately as well
if(!members) map_init_int(members); if(!members) map_init_int(members);
array(reflect_t) *found = map_find_or_add(members, Tid, 0); array(reflect_t) *found = map_find_or_add(members, Tid, 0);
array_push(*found, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type })); array_push(*found, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type, bytes }));
} }
reflect_t member_find(const char *T, const char *M) { reflect_t member_find(const char *T, const char *M) {
reflect_init(); reflect_init();
@ -96,53 +96,42 @@ void reflect_print(const char *symbol) {
// -- tests // -- tests
enum { // type0 is reserved (no type)
MYVALUE0 = 0, // type1 reserved for objs
MYVALUE1, // type2 reserved for entities
MYVALUE2, // @todo: type3 and 4 likely reserved for components and systems??
MYVALUEA = 123, // enum { OBJTYPE_vec3 = 0x03 };
};
typedef struct MyVec4 {
float x,y,z,w;
} MyVec4;
enum { OBJTYPE_MyVec4 = 0x01 };
AUTOTEST { AUTOTEST {
// register structs, enums and functions // register structs, enums and functions. with and without comments+tags
STRUCT( MyVec4, float, x, "Right" ); STRUCT( vec3, float, x );
STRUCT( MyVec4, float, y, "Forward" ); STRUCT( vec3, float, y );
STRUCT( MyVec4, float, z, "Up" ); STRUCT( vec3, float, z, "Up" );
STRUCT( MyVec4, float, w, "W" );
ENUM( MYVALUE0, "bla bla #0" ); ENUM( IMAGE_RGB );
ENUM( MYVALUE1, "bla bla #1" ); ENUM( TEXTURE_RGB, "3-channel Red+Green+Blue texture flag" );
ENUM( MYVALUE2, "bla bla #2" ); ENUM( TEXTURE_RGBA, "4-channel Red+Green+Blue+Alpha texture flag" );
ENUM( MYVALUEA, "bla bla (A)" );
FUNCTION( puts, "handy function that I use a lot" ); FUNCTION( puts );
FUNCTION( printf, "handy function that I use a lot" ); FUNCTION( printf, "function that prints formatted text to stdout" );
// verify some reflected infos // verify some reflected infos
test( function_find("puts") == puts ); test( function_find("puts") == puts );
test( function_find("printf") == printf ); test( function_find("printf") == printf );
test( enum_find("MYVALUE0") == MYVALUE0 ); test( enum_find("TEXTURE_RGB") == TEXTURE_RGB );
test( enum_find("MYVALUE1") == MYVALUE1 ); test( enum_find("TEXTURE_RGBA") == TEXTURE_RGBA );
test( enum_find("MYVALUE2") == MYVALUE2 );
test( enum_find("MYVALUEA") == MYVALUEA );
// iterate reflected struct // iterate reflected struct
for each_member("MyVec4", R) { for each_member("vec3", R) {
// printf("+%s MyVec4.%s // %s\n", R->type, R->name, R->info); //printf("+%s vec3.%s (+%x) // %s\n", R->type, R->name, R->member_offset, R->info);
} }
// reflect_print("puts"); // reflect_print("puts");
// reflect_print("MYVALUE0"); //reflect_print("TEXTURE_RGBA");
// reflect_print("MyVec4"); //reflect_print("vec3");
// reflect_dump("*"); // reflect_dump("*");
} }

View File

@ -10,26 +10,31 @@
typedef struct reflect_t { typedef struct reflect_t {
unsigned id, objtype; unsigned id, objtype;
union {
unsigned sz; unsigned sz;
unsigned member_offset;
unsigned enum_value;
};
const char *name; const char *name;
const char *info; const char *info;
void *addr; void *addr;
unsigned parent; unsigned parent;
const char *type; const char *type;
unsigned bytes;
} reflect_t; } reflect_t;
// inscribe api // inscribe api
#define ENUM(V, value_annotations) \ #define ENUM(V, .../*value_annotations*/) \
enum_inscribe(#V,intern(#V),V, value_annotations) enum_inscribe(#V,intern(#V),V, "" __VA_ARGS__/*value_annotations*/)
#define FUNCTION(F, function_annotations) \ #define FUNCTION(F, .../*function_annotations*/) \
function_inscribe(#F,intern(#F),(void*)F, function_annotations) function_inscribe(#F,intern(#F),(void*)F, "" __VA_ARGS__/*function_annotations*/)
#define STRUCT(T, type, member, member_annotations) \ #define STRUCT(T, type, member, .../*member_annotations*/) \
struct_inscribe(#T,intern(#T),sizeof(T),OBJTYPE(T),NULL), \ struct_inscribe(#T,intern(#T),sizeof(T),OBJTYPE(T),NULL), \
type_inscribe(#type,intern(#type),sizeof(((T){0}).member),member_annotations), \ type_inscribe(#type,intern(#type),sizeof(((T){0}).member),"" __VA_ARGS__/*member_annotations*/), \
member_inscribe(intern(#T), #member,intern(#member),(uintptr_t)&((T*)0)->member, member_annotations, #type ) member_inscribe(intern(#T), #member,intern(#member),(uintptr_t)&((T*)0)->member, "" __VA_ARGS__/*member_annotations*/, #type, sizeof(((T){0}).member) )
// find api // find api
@ -37,7 +42,7 @@ API unsigned enum_find(const char *E);
API void * function_find(const char *F); API void * function_find(const char *F);
API reflect_t member_find(const char *T, const char *M); /// find specific member API reflect_t member_find(const char *T, const char *M); /// find specific member
API void * member_findptr(void *obj, const char *T, const char *M); API void * member_findptr(void *obj, const char *T, const char *M); // @deprecate
API array(reflect_t) members_find(const char *T); API array(reflect_t) members_find(const char *T);
// iterate members in a struct // iterate members in a struct
@ -52,7 +57,7 @@ API array(reflect_t) members_find(const char *T);
API void type_inscribe(const char *TY,unsigned TYid,unsigned TYsz,const char *infos); API void type_inscribe(const char *TY,unsigned TYid,unsigned TYsz,const char *infos);
API void enum_inscribe(const char *E,unsigned Eid,unsigned Eval,const char *infos); API void enum_inscribe(const char *E,unsigned Eid,unsigned Eval,const char *infos);
API void struct_inscribe(const char *T,unsigned Tid,unsigned Tsz,unsigned OBJTYPEid, const char *infos); API void struct_inscribe(const char *T,unsigned Tid,unsigned Tsz,unsigned OBJTYPEid, const char *infos);
API void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type); API void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type, unsigned bytes);
API void function_inscribe(const char *F,unsigned Fid,void *func,const char *infos); API void function_inscribe(const char *F,unsigned Fid,void *func,const char *infos);
API void reflect_print(const char *symbol); API void reflect_print(const char *symbol);

View File

@ -271,6 +271,8 @@ void glNewFrame() {
} }
bool window_create_from_handle(void *handle, float scale, unsigned flags) { bool window_create_from_handle(void *handle, float scale, unsigned flags) {
ifdef(debug, if( flag("--tests") ) exit(0));
glfw_init(); glfw_init();
v4k_init(); v4k_init();
if(!t) t = glfwGetTime(); if(!t) t = glfwGetTime();

View File

@ -12017,7 +12017,7 @@ int msgpack(const char *fmt, ... ) {
va_end(vl); va_end(vl);
return count; return count;
} }
bool msgunpack(const char *fmt, ... ) { int msgunpack(const char *fmt, ... ) {
int count = 0; int count = 0;
va_list vl; va_list vl;
va_start(vl, fmt); va_start(vl, fmt);
@ -12032,7 +12032,7 @@ bool msgunpack(const char *fmt, ... ) {
// break; case 'b': { bool *v = !!va_arg(vl, bool*); count += msgunpack_chr(v); } // break; case 'b': { bool *v = !!va_arg(vl, bool*); count += msgunpack_chr(v); }
// break; case 'e': { uint8_t k = va_arg(vl, uint64_t); void *v = va_arg(vl, void*); size_t l = va_arg(vl, uint64_t); count += msgunpack_ext( k, v, l ); } // break; case 'e': { uint8_t k = va_arg(vl, uint64_t); void *v = va_arg(vl, void*); size_t l = va_arg(vl, uint64_t); count += msgunpack_ext( k, v, l ); }
// break; case 'n': { count += msgunpack_nil(); } // break; case 'n': { count += msgunpack_nil(); }
// break; case 'p': { void *p = va_arg(vl, void*); size_t l = va_arg(vl, uint64_t); count += msgunpack_bin( p, l ); } break; case 'p': { void *p = va_arg(vl, void*); uint64_t l = va_arg(vl, uint64_t); count += msgunpack_bin( p, &l ); }
// break; case 'u': { uint64_t v = va_arg(vl, uint64_t); count += msgunpack_uns(v); } // break; case 'u': { uint64_t v = va_arg(vl, uint64_t); count += msgunpack_uns(v); }
// break; case 'd': case 'i': { int64_t v = va_arg(vl, int64_t); count += msgunpack_int(v); } // break; case 'd': case 'i': { int64_t v = va_arg(vl, int64_t); count += msgunpack_int(v); }
default: /*count = 0;*/ break; default: /*count = 0;*/ break;
@ -12818,13 +12818,13 @@ void struct_inscribe(const char *T,unsigned Tid,unsigned Tsz,unsigned OBJTYPEid,
reflect_init(); reflect_init();
map_find_or_add(reflects, Tid, ((reflect_t){Tid, OBJTYPEid, Tsz, T, infos})); map_find_or_add(reflects, Tid, ((reflect_t){Tid, OBJTYPEid, Tsz, T, infos}));
} }
void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type) { void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type, unsigned bytes) {
reflect_init(); reflect_init();
map_find_or_add(reflects, (Mid<<16)|Tid, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type })); map_find_or_add(reflects, (Mid<<16)|Tid, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type }));
// add member separately as well // add member separately as well
if(!members) map_init_int(members); if(!members) map_init_int(members);
array(reflect_t) *found = map_find_or_add(members, Tid, 0); array(reflect_t) *found = map_find_or_add(members, Tid, 0);
array_push(*found, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type })); array_push(*found, ((reflect_t){Mid, 0, Msz, M, infos, NULL, Tid, type, bytes }));
} }
reflect_t member_find(const char *T, const char *M) { reflect_t member_find(const char *T, const char *M) {
reflect_init(); reflect_init();
@ -12875,53 +12875,42 @@ void reflect_print(const char *symbol) {
// -- tests // -- tests
enum { // type0 is reserved (no type)
MYVALUE0 = 0, // type1 reserved for objs
MYVALUE1, // type2 reserved for entities
MYVALUE2, // @todo: type3 and 4 likely reserved for components and systems??
MYVALUEA = 123, // enum { OBJTYPE_vec3 = 0x03 };
};
typedef struct MyVec4 {
float x,y,z,w;
} MyVec4;
enum { OBJTYPE_MyVec4 = 0x01 };
AUTOTEST { AUTOTEST {
// register structs, enums and functions // register structs, enums and functions. with and without comments+tags
STRUCT( MyVec4, float, x, "Right" ); STRUCT( vec3, float, x );
STRUCT( MyVec4, float, y, "Forward" ); STRUCT( vec3, float, y );
STRUCT( MyVec4, float, z, "Up" ); STRUCT( vec3, float, z, "Up" );
STRUCT( MyVec4, float, w, "W" );
ENUM( MYVALUE0, "bla bla #0" ); ENUM( IMAGE_RGB );
ENUM( MYVALUE1, "bla bla #1" ); ENUM( TEXTURE_RGB, "3-channel Red+Green+Blue texture flag" );
ENUM( MYVALUE2, "bla bla #2" ); ENUM( TEXTURE_RGBA, "4-channel Red+Green+Blue+Alpha texture flag" );
ENUM( MYVALUEA, "bla bla (A)" );
FUNCTION( puts, "handy function that I use a lot" ); FUNCTION( puts );
FUNCTION( printf, "handy function that I use a lot" ); FUNCTION( printf, "function that prints formatted text to stdout" );
// verify some reflected infos // verify some reflected infos
test( function_find("puts") == puts ); test( function_find("puts") == puts );
test( function_find("printf") == printf ); test( function_find("printf") == printf );
test( enum_find("MYVALUE0") == MYVALUE0 ); test( enum_find("TEXTURE_RGB") == TEXTURE_RGB );
test( enum_find("MYVALUE1") == MYVALUE1 ); test( enum_find("TEXTURE_RGBA") == TEXTURE_RGBA );
test( enum_find("MYVALUE2") == MYVALUE2 );
test( enum_find("MYVALUEA") == MYVALUEA );
// iterate reflected struct // iterate reflected struct
for each_member("MyVec4", R) { for each_member("vec3", R) {
// printf("+%s MyVec4.%s // %s\n", R->type, R->name, R->info); //printf("+%s vec3.%s (+%x) // %s\n", R->type, R->name, R->member_offset, R->info);
} }
// reflect_print("puts"); // reflect_print("puts");
// reflect_print("MYVALUE0"); //reflect_print("TEXTURE_RGBA");
// reflect_print("MyVec4"); //reflect_print("vec3");
// reflect_dump("*"); // reflect_dump("*");
} }
@ -23637,6 +23626,8 @@ void glNewFrame() {
} }
bool window_create_from_handle(void *handle, float scale, unsigned flags) { bool window_create_from_handle(void *handle, float scale, unsigned flags) {
ifdef(debug, if( flag("--tests") ) exit(0));
glfw_init(); glfw_init();
v4k_init(); v4k_init();
if(!t) t = glfwGetTime(); if(!t) t = glfwGetTime();

View File

@ -269,7 +269,8 @@ extern "C" {
#define macro(name) concat(name, __LINE__) #define macro(name) concat(name, __LINE__)
#define defer(begin,end) for(int macro(i) = ((begin), 0); !macro(i); macro(i) = ((end), 1)) #define defer(begin,end) for(int macro(i) = ((begin), 0); !macro(i); macro(i) = ((end), 1))
#define scope(end) defer((void)0, end) #define scope(end) defer((void)0, end)
#define benchmark for(double macro(i) = 1, macro(t) = -time_ss(); macro(i); macro(t)+=time_ss(), macro(i)=0, printf("%.4fs %2.f%% (" FILELINE ")\n", macro(t), macro(t)*100/0.0166667 )) #define benchmark for(double macro(i) = 1, macro(t) = (time_ss(),-time_ss()); macro(i); macro(t)+=time_ss(), macro(i)=0, printf("%.4fs %2.f%% (" FILELINE ")\n", macro(t), macro(t)*100/0.0166667 ))
#define benchmark_ms for(double macro(i) = 1, macro(t) = (time_ss(),-time_ss()); macro(i); macro(t)+=time_ss(), macro(i)=0, printf("%.2fms %2.f%% (" FILELINE ")\n", macro(t)*1000, macro(t)*100/0.016666667 ))
#define do_once static int macro(once) = 0; for(;!macro(once);macro(once)=1) #define do_once static int macro(once) = 0; for(;!macro(once);macro(once)=1)
#if is(cl) #if is(cl)
@ -385,7 +386,7 @@ extern "C" {
static void fn(void) static void fn(void)
#else // gcc,tcc,clang,clang-cl... #else // gcc,tcc,clang,clang-cl...
#define AUTORUN_(fn) \ #define AUTORUN_(fn) \
__attribute__((constructor)) \ __attribute__((constructor(__COUNTER__+101))) \
static void fn(void) static void fn(void)
#endif #endif
@ -2195,8 +2196,8 @@ API uint64_t unpack64iv( const uint8_t *buffer, int64_t *value );
// api v2 // api v2
API int msgpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{" API int msgpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{". returns number of written bytes
API bool msgunpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{" API int msgunpack(const char *fmt, ... ); // va arg pack "n,b,u,d/i,s,p,f/g,e,[,{". returns number of parsed args
// api v1 // api v1
@ -2677,26 +2678,31 @@ extern API int profiler_enabled; ///-
typedef struct reflect_t { typedef struct reflect_t {
unsigned id, objtype; unsigned id, objtype;
union {
unsigned sz; unsigned sz;
unsigned member_offset;
unsigned enum_value;
};
const char *name; const char *name;
const char *info; const char *info;
void *addr; void *addr;
unsigned parent; unsigned parent;
const char *type; const char *type;
unsigned bytes;
} reflect_t; } reflect_t;
// inscribe api // inscribe api
#define ENUM(V, value_annotations) \ #define ENUM(V, .../*value_annotations*/) \
enum_inscribe(#V,intern(#V),V, value_annotations) enum_inscribe(#V,intern(#V),V, "" __VA_ARGS__/*value_annotations*/)
#define FUNCTION(F, function_annotations) \ #define FUNCTION(F, .../*function_annotations*/) \
function_inscribe(#F,intern(#F),(void*)F, function_annotations) function_inscribe(#F,intern(#F),(void*)F, "" __VA_ARGS__/*function_annotations*/)
#define STRUCT(T, type, member, member_annotations) \ #define STRUCT(T, type, member, .../*member_annotations*/) \
struct_inscribe(#T,intern(#T),sizeof(T),OBJTYPE(T),NULL), \ struct_inscribe(#T,intern(#T),sizeof(T),OBJTYPE(T),NULL), \
type_inscribe(#type,intern(#type),sizeof(((T){0}).member),member_annotations), \ type_inscribe(#type,intern(#type),sizeof(((T){0}).member),"" __VA_ARGS__/*member_annotations*/), \
member_inscribe(intern(#T), #member,intern(#member),(uintptr_t)&((T*)0)->member, member_annotations, #type ) member_inscribe(intern(#T), #member,intern(#member),(uintptr_t)&((T*)0)->member, "" __VA_ARGS__/*member_annotations*/, #type, sizeof(((T){0}).member) )
// find api // find api
@ -2704,7 +2710,7 @@ API unsigned enum_find(const char *E);
API void * function_find(const char *F); API void * function_find(const char *F);
API reflect_t member_find(const char *T, const char *M); /// find specific member API reflect_t member_find(const char *T, const char *M); /// find specific member
API void * member_findptr(void *obj, const char *T, const char *M); API void * member_findptr(void *obj, const char *T, const char *M); // @deprecate
API array(reflect_t) members_find(const char *T); API array(reflect_t) members_find(const char *T);
// iterate members in a struct // iterate members in a struct
@ -2719,7 +2725,7 @@ API array(reflect_t) members_find(const char *T);
API void type_inscribe(const char *TY,unsigned TYid,unsigned TYsz,const char *infos); API void type_inscribe(const char *TY,unsigned TYid,unsigned TYsz,const char *infos);
API void enum_inscribe(const char *E,unsigned Eid,unsigned Eval,const char *infos); API void enum_inscribe(const char *E,unsigned Eid,unsigned Eval,const char *infos);
API void struct_inscribe(const char *T,unsigned Tid,unsigned Tsz,unsigned OBJTYPEid, const char *infos); API void struct_inscribe(const char *T,unsigned Tid,unsigned Tsz,unsigned OBJTYPEid, const char *infos);
API void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type); API void member_inscribe(unsigned Tid, const char *M,unsigned Mid,unsigned Msz, const char *infos, const char *type, unsigned bytes);
API void function_inscribe(const char *F,unsigned Fid,void *func,const char *infos); API void function_inscribe(const char *F,unsigned Fid,void *func,const char *infos);
API void reflect_print(const char *symbol); API void reflect_print(const char *symbol);