diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-09-27 03:00:09 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-09-27 03:00:09 +0200 |
commit | ec1991ba992640171eabe2f5d1029a2836624c58 (patch) | |
tree | ec98c0c0bc54e9e8d784d989b44a9f6525342f7f /layer.cpp | |
parent | e22d703662aef2d756162c3800c542075c372666 (diff) | |
download | osc-graphics-ec1991ba992640171eabe2f5d1029a2836624c58.tar.gz |
make layer list double-linked
* does not in any way affect rendering performance
* inserting is a bit more complex, but still O(1)
* deleting is a lot faster (O(1)) since we do not have to search by name
Diffstat (limited to 'layer.cpp')
-rw-r--r-- | layer.cpp | 32 |
1 files changed, 14 insertions, 18 deletions
@@ -16,37 +16,33 @@ Layer::Layer(const char *_name) : mutex(SDL_CreateMutex()), name(strdup(_name)) void LayerList::insert(int pos, Layer *layer) { - Layer *cur, **prev; + Layer *cur, *prev = NULL; lock(); - SLIST_FOREACH_PREVPTR(cur, prev, &head, layers) + LIST_FOREACH(cur, &head, layers) { if (!pos--) break; + prev = cur; + } - SLIST_NEXT(layer, layers) = cur; - *prev = layer; + if (prev) + LIST_INSERT_AFTER(prev, layer, layers); + else + LIST_INSERT_HEAD(&head, layer, layers); unlock(); } -bool -LayerList::delete_by_name(const char *name) +void +LayerList::delete_layer(Layer *layer) { - Layer *cur, **prev; - lock(); - - SLIST_FOREACH_PREVPTR(cur, prev, &head, layers) - if (!strcmp(cur->name, name)) { - *prev = SLIST_NEXT(cur, layers); - delete cur; - break; - } - + LIST_REMOVE(layer, layers); unlock(); - return cur == NULL; + /* layer is guaranteed not to be rendered */ + delete layer; } void @@ -57,7 +53,7 @@ LayerList::render(SDL_Surface *target) lock(); Layer *cur; - SLIST_FOREACH(cur, &head, layers) { + LIST_FOREACH(cur, &head, layers) { cur->lock(); cur->frame(target); cur->unlock(); |