declared Asset trait combining Drop with a getter and setter for an asset id
This commit is contained in:
		
							parent
							
								
									67b751c136
								
							
						
					
					
						commit
						6e61a7666a
					
				
							
								
								
									
										34
									
								
								src/asset.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/asset.h
									
									
									
									
									
										Normal 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
 | 
				
			||||||
		Loading…
	
		Reference in a new issue