declared Asset trait combining Drop with a getter and setter for an asset id

This commit is contained in:
Sara 2023-11-06 21:16:06 +01:00
parent 67b751c136
commit 6e61a7666a

34
src/asset.h Normal file
View file

@ -0,0 +1,34 @@
#ifndef _fencer_asset_h
#define _fencer_asset_h
#include "drop.h"
#include "typeclass_helpers.h"
#include <SDL2/SDL_render.h>
typedef uintptr_t asset_id;
typedef struct {
asset_id (*const get_id)(void*);
void (*const set_id)(void*, asset_id);
} IAsset;
typedef struct Asset {
void* data;
IAsset const* tc;
IDrop const* drop;
} Asset;
#define impl_Asset_for(T, get_id_f, set_id_f)\
static inline Asset T##_as_Asset(T* x) {\
TC_FN_TYPECHECK(asset_id, get_id_f, T*);\
TC_FN_TYPECHECK(void, set_id_f, T*, asset_id);\
TC_FN_TYPECHECK(Drop, T##_as_Drop, T*);\
static IAsset tc = (IAsset){\
.get_id = (asset_id(*const)(void*)) get_id_f,\
.set_id = (void(*const)(void*,asset_id)) set_id_f,\
};\
IDrop const* drop = T##_as_Drop(x).tc;\
return (Asset){.data=x, .tc=&tc, .drop=drop};\
}
#endif // !_fencer_asset_h