/*---------------------------------------------------------------------------* Project: Horizon File: fnd_DetailList.cpp Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 12449 $ *---------------------------------------------------------------------------*/ #include "./fnd_DetailList.h" namespace nn { namespace fnd { namespace detail { #define OBJ_TO_LINK(list,obj) ((NNSFndLink*)(((u32)(obj))+(list)->offset)) /*---------------------------------------------------------------------------* Name: InitList Description: リスト構造体を初期化します。 Arguments: list: リスト構造体へのポインタ。 offset: リストに繋げたい構造体の中に存在する、NNSFndLink型の メンバ変数の構造体内でのオフセットを指定します。 stddef.hで定義されているoffsetofマクロを使用すると、 便利です。 Returns: なし。 *---------------------------------------------------------------------------*/ void InitList(NNSFndList* list, u16 offset) { NN_TASSERT_(list); list->headObject = NULL; list->tailObject = NULL; list->numObjects = 0; list->offset = offset; } /*---------------------------------------------------------------------------* Name: SetFirstObject [static] Description: 最初のオブジェクトをリストに加えます。 Arguments: list: リスト構造体へのポインタ。 object: リストに繋げたいオブジェクトへのポインタ。 Returns: なし。 *---------------------------------------------------------------------------*/ static void SetFirstObject(NNSFndList* list, void* object) { NNSFndLink* link; NN_TASSERT_(list ); NN_TASSERT_(object); link = OBJ_TO_LINK(list, object); link->nextObject = NULL; link->prevObject = NULL; list->headObject = object; list->tailObject = object; list->numObjects++; } /*---------------------------------------------------------------------------* Name: AppendListObject Description: オブジェクトをリストの最後に追加します。 Arguments: list: リスト構造体へのポインタ。 object: リストに繋げたいオブジェクトへのポインタ。 Returns: なし。 *---------------------------------------------------------------------------*/ void AppendListObject(NNSFndList* list, void* object) { NN_TASSERT_(list ); NN_TASSERT_(object); if (list->headObject == NULL) { // リストが空の時。 SetFirstObject(list, object); } else { NNSFndLink* link = OBJ_TO_LINK(list, object); link->prevObject = list->tailObject; link->nextObject = NULL; OBJ_TO_LINK(list, list->tailObject)->nextObject = object; list->tailObject = object; list->numObjects++; } } /*---------------------------------------------------------------------------* Name: PrependListObject Description: オブジェクトをリストの先頭に挿入します。 Arguments: list: リスト構造体へのポインタ。 object: リストに繋げたいオブジェクトへのポインタ。 Returns: なし。 *---------------------------------------------------------------------------*/ void PrependListObject(NNSFndList* list, void* object) { NN_TASSERT_(list ); NN_TASSERT_(object); if (list->headObject == NULL) { // リストが空の時。 SetFirstObject(list, object); } else { NNSFndLink* link = OBJ_TO_LINK(list, object); link->prevObject = NULL; link->nextObject = list->headObject; OBJ_TO_LINK(list, list->headObject)->prevObject = object; list->headObject = object; list->numObjects++; } } /*---------------------------------------------------------------------------* Name: InsertListObject Description: オブジェクトを指定された位置に挿入します。オブジェクトは、 targetで指定されたオブジェクトの前に挿入されます。挿入先が指 定されていない場合(targetがNULLの場合)、オブジェクトはリス トの最後に追加されます。 Arguments: list: リスト構造体へのポインタ。 target: 挿入したい位置にあるオブジェクトへのポインタ。 object: リストに繋げたいオブジェクトへのポインタ。 Returns: なし。 *---------------------------------------------------------------------------*/ void InsertListObject(NNSFndList* list, void* target, void* object) { NN_TASSERT_(list ); NN_TASSERT_(object); if (target == NULL) { // targetが指定されていない場合は、AppendListObject()と同じ。 AppendListObject(list, object); } else if (target == list->headObject) { // targetがリストの先頭である場合はPrependListObject()と同じ。 PrependListObject(list, object); } else { NNSFndLink* link = OBJ_TO_LINK(list, object); void* prevObj = OBJ_TO_LINK(list, target)->prevObject; NNSFndLink* prevLnk = OBJ_TO_LINK(list, prevObj); link->prevObject = prevObj; link->nextObject = target; prevLnk->nextObject = object; OBJ_TO_LINK(list, target)->prevObject = object; list->numObjects++; } } /*---------------------------------------------------------------------------* Name: RemoveListObject Description: オブジェクトをリストから削除します。 Arguments: list: リスト構造体へのポインタ。 object: リストから削除したいオブジェクトへのポインタ。 Returns: なし。 *---------------------------------------------------------------------------*/ void RemoveListObject(NNSFndList* list, void* object) { NNSFndLink* link; NN_TASSERT_(list ); NN_TASSERT_(object); link = OBJ_TO_LINK(list, object); if (link->prevObject == NULL) { list->headObject = link->nextObject; } else { OBJ_TO_LINK(list, link->prevObject)->nextObject = link->nextObject; } if (link->nextObject == NULL) { list->tailObject = link->prevObject; } else { OBJ_TO_LINK(list, link->nextObject)->prevObject = link->prevObject; } link->prevObject = NULL; link->nextObject = NULL; list->numObjects--; } /*---------------------------------------------------------------------------* Name: GetNextListObject Description: objectで指定されたオブジェクトの次に繋がれているオブジェクト を返します。objectにNULLが指定されていた場合には、リストの先 頭に繋がれているオブジェクトを返します。 Arguments: list: リスト構造体へのポインタ。 object: リスト中のオブジェクトへのポインタ。 Returns: 指定されたオブジェクトの次のオブジェクトへのポインタを返しま す。もし、次のオブジェクトが無ければ、NULLを返します。 *---------------------------------------------------------------------------*/ void* GetNextListObject(const NNSFndList* list, const void* object) { NN_TASSERT_(list); if (object == NULL) { return list->headObject; } return OBJ_TO_LINK(list, object)->nextObject; } /*---------------------------------------------------------------------------* Name: GetPrevListObject Description: objectで指定されたオブジェクトの前に繋がれているオブジェクト を返します。objectにNULLが指定されていた場合には、リストの後 尾に繋がれているオブジェクトを返します。 Arguments: list: リスト構造体へのポインタ。 object: リスト中のオブジェクトへのポインタ。 Returns: 指定されたオブジェクトの前のオブジェクトへのポインタを返しま す。もし、前のオブジェクトが無ければ、NULLを返します。 *---------------------------------------------------------------------------*/ void* GetPrevListObject(const NNSFndList* list, const void* object) { NN_TASSERT_(list); if (object == NULL) { return list->tailObject; } return OBJ_TO_LINK(list, object)->prevObject; } /*---------------------------------------------------------------------------* Name: GetNthListObject Description: リストのN番目に繋がれているオブジェクトへのポインタを返しま す。先頭から順番にリストをたどる為、リストの後部に繋がれてい オブジェクト程、時間がかかります。 Arguments: index: オブジェクトのインデックス。 Returns: オブジェクトへのポインタを返します。もし、指定されたインデッ クスのオブジェクトが無かった場合には、NULLが返ります。 *---------------------------------------------------------------------------*/ void* GetNthListObject(const NNSFndList* list, u16 index) { int count = 0; NNSFndLink* object = NULL; NN_TASSERT_(list); // while ((object = GetNextListObject(list, object)) != NULL) // for Horizon while ((object = reinterpret_cast( GetNextListObject(list, object))) != NULL) { if (index == count) { return object; } count++; } return NULL; } }}} // namespace nn::os::fnd