diff options
| author | Vito Caputo <vcaputo@pengaru.com> | 2019-05-09 20:57:01 -0700 | 
|---|---|---|
| committer | Vito Caputo <vcaputo@pengaru.com> | 2019-05-10 14:18:28 -0700 | 
| commit | f42c1887f3212c56e5c69a5f1ac26b80aabda1d9 (patch) | |
| tree | 690d4cbfddca140de3c53ef37cfd949b83f04c34 /src | |
| parent | 0c22399c957cd1936f4407a149338d7e78dea2ea (diff) | |
libstage: introduce stage_match_func_t
Preparation for adding stage_lookup_key() to search a stage
heirarchy by an opaque key the per-node functions know how to
compare against.
Diffstat (limited to 'src')
| -rw-r--r-- | src/stage.c | 16 | ||||
| -rw-r--r-- | src/stage.h | 5 | 
2 files changed, 12 insertions, 9 deletions
| diff --git a/src/stage.c b/src/stage.c index e6da788..10a7f0a 100644 --- a/src/stage.c +++ b/src/stage.c @@ -34,12 +34,13 @@ struct stage_t {  	stage_render_func_t	*render;	/* render object */  	stage_free_func_t	*free;		/* free object */ +	stage_match_func_t	*match;		/* match object against key */  	void			*object;	/* object */  };  /* minimally initialize a stage to carry an object */ -static void _stage_set_object(stage_t *stage, const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func) +static void _stage_set_object(stage_t *stage, const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func, stage_match_func_t *match_func)  {  	assert(stage);  	assert(name); @@ -47,12 +48,13 @@ static void _stage_set_object(stage_t *stage, const char *name, void *object, st  	strncpy(stage->name, name, sizeof(stage->name));  	stage->render = render_func;  	stage->free = free_func; +	stage->match = match_func;  	stage->object = object;  }  /* allocate a stage, this purely creates a stage in isolation and assigns its associated name, object and functions */ -static stage_t * _stage_new(const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func) +static stage_t * _stage_new(const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func, stage_match_func_t *match_func)  {  	stage_t	*stage; @@ -64,7 +66,7 @@ static stage_t * _stage_new(const char *name, void *object, stage_render_func_t  	for (int i = 0; i < STAGE_LAYERS_MAX; i++)  		dll_init(&stage->layers[i]); -	_stage_set_object(stage, name, object, render_func, free_func); +	_stage_set_object(stage, name, object, render_func, free_func, match_func);  	return stage;  } @@ -84,14 +86,14 @@ static void _stage_free(stage_t *stage)  /* returns a new stage, attached at the specified layer under parent if supplied */  /* layer has no effect when parent == NULL */ -stage_t * stage_new(stage_t *parent, int layer, const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func) +stage_t * stage_new(stage_t *parent, int layer, const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func, stage_match_func_t *match_func)  {  	stage_t	*stage;  	assert(parent || !layer);  	assert(layer < STAGE_LAYERS_MAX); -	stage = _stage_new(name, object, render_func, free_func); +	stage = _stage_new(name, object, render_func, free_func, match_func);  	if (!stage)  		return NULL; @@ -105,14 +107,14 @@ stage_t * stage_new(stage_t *parent, int layer, const char *name, void *object,  /* replaces a given stage's object-related properties but otherwise keeping the existing state */ -void stage_replace(stage_t *stage, const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func) +void stage_replace(stage_t *stage, const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func, stage_match_func_t *match_func)  {  	assert(stage);  	if (stage->free)  		stage->free(stage, stage->object); -	_stage_set_object(stage, name, object, render_func, free_func); +	_stage_set_object(stage, name, object, render_func, free_func, match_func);  } diff --git a/src/stage.h b/src/stage.h index 59329d7..b273b7b 100644 --- a/src/stage.h +++ b/src/stage.h @@ -24,9 +24,10 @@ typedef struct stage_t stage_t;  typedef void (stage_render_func_t)(const stage_t *stage, void *object, float alpha);  typedef void (stage_free_func_t)(const stage_t *stage, void *object); +typedef int (stage_match_func_t)(const stage_t *stage, void *object, void *key); -stage_t * stage_new(stage_t *parent, int layer, const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func); -void stage_replace(stage_t *stage, const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func); +stage_t * stage_new(stage_t *parent, int layer, const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func, stage_match_func_t *match_func); +void stage_replace(stage_t *stage, const char *name, void *object, stage_render_func_t *render_func, stage_free_func_t *free_func, stage_match_func_t *match_func);  stage_t * stage_free(stage_t *stage);  void stage_render(const stage_t *stage);  void stage_clear(stage_t *stage); | 
