diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2020-04-20 14:00:17 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2020-04-20 14:00:17 -0700 |
commit | fc879e25fd4b45ec3520b4bd0cbfb4bec4ad1590 (patch) | |
tree | 731c4a8a3e510c886bb1177ae8b2002912b97bee | |
parent | 020c6b59045f04b14a0898d2c373b6a09b39fe31 (diff) |
libstage: introduce 'adopt' flag to stage_conf_t
When set, this turns stage_new() into a stage_replace() against the
supplied parent.
So if you have an existing stage_t and you wish to turn it into
something else directly via stage_new(), simply pass it in as the
parent with the adopt flag set.
Previously it was rather contorted to do this kind of thing, and
kind of impossible really. This way avoids the allocation of the
new stage_t while preserving the usability of all existing components
build around the stage_new/stage_conf_t API.
This is kind of experimental and I haven't tested it yet, just a wart
I tripped over in the "sars" Blender 2020 project and wanted to do
something quick about before it falls off my radar as I'm busy with
unrelated things.
-rw-r--r-- | src/stage.c | 5 | ||||
-rw-r--r-- | src/stage.h | 1 |
2 files changed, 6 insertions, 0 deletions
diff --git a/src/stage.c b/src/stage.c index 13519b9..8a540a8 100644 --- a/src/stage.c +++ b/src/stage.c @@ -88,14 +88,19 @@ 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 */ +/* if adopt is set, parent must be set and is instead replaced internally and returned */ stage_t * stage_new(const stage_conf_t *conf, const stage_ops_t *ops, void *object) { stage_t *stage; assert(conf); assert(conf->parent || !conf->layer); + assert(conf->parent || !conf->adopt); assert(conf->layer < STAGE_LAYERS_MAX); + if (conf->adopt) + return stage_replace(conf->parent, conf->name, ops, object); + stage = _stage_new(conf->name, ops, object); if (!stage) return NULL; diff --git a/src/stage.h b/src/stage.h index ec0a72b..785ddf5 100644 --- a/src/stage.h +++ b/src/stage.h @@ -40,6 +40,7 @@ typedef struct stage_conf_t { unsigned active:1; unsigned locked:1; unsigned dirty:1; + unsigned adopt:1; } stage_conf_t; stage_t * stage_new(const stage_conf_t *conf, const stage_ops_t *ops, void *object); |