Mercurial > hg > Game > Cerium
diff Renderer/Engine/SceneGraphList.cc @ 572:096a900bd9d3 draft
merge
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 23 Oct 2009 00:40:24 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/SceneGraphList.cc Fri Oct 23 00:40:24 2009 +0900 @@ -0,0 +1,89 @@ +/*! + MemList は空にならない。最低1個は要素が入っていて + 1個目は特別扱いする。getFirst すると first->next を返す + */ +#include <stdio.h> +#include "SceneGraphList.h" + +/*! + 最初の1個は特別扱いなので、それの後に追加していく + */ +void +SceneGraphList::addFirst(SgStruct* e) +{ + e->prev = first; + e->next = first->next; + first->next->prev = e; + first->next = e; +} + +void +SceneGraphList::addLast(SgStruct* e) +{ + e->next = first; + e->prev = last; + last->next = e; + last = e; +} + +SgStruct* +SceneGraphList::getFirst() +{ + return first->next; +} + +SgStruct* +SceneGraphList::getLast() +{ + return last; +} + +int +SceneGraphList::remove(SgStruct* e) +{ + e->prev->next = e->next; + e->next->prev = e->prev; + + if (first->next == e) { + first->next = e->next; + } + if (last == e) { + last = e->prev; + } + + e->prev = NULL; + e->next = NULL; + + return 1; +} + +/*! + リストの先頭を取得および削除する。リストが空の場合は NULL を返す。 + */ + +SgStruct* +SceneGraphList::poll() +{ + SgStruct* e = first->next; + if (e == this) { + return NULL; + } + remove(e); + return e; +} + +/*! + リスト内の指定された name を持つオブジェクトを返す。 + 見つからなかった場合 NULL を返す。 + */ + +SgStruct* +SceneGraphList::get(const char *obj_name) +{ + SgStruct* e = first->next; + while (e) { + if (strcmp(e->name, obj_name) == 0) return e; + e = e->next; + } + return NULL; +}