view 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 source

/*!
  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;
}