5 // Created by 西田 耀 on 13/01/28.
\r
6 // Copyright (c) 2013年 Hikaru Nishida. All rights reserved.
\r
9 //UIPArray関連のうち、このソースファイルで完結する関数群
\r
23 #define CHNLIB_UIPArray_INTERNAL_PACKDATAS 7
\r
26 //Declare internal functions
\r
28 CHNLIB_UIPArray *CHNLIB_UIPArray_Internal_Allocate(void);
\r
33 typedef struct CHNLIB_UIPARRAY_INTERNAL_TAG CHNLIB_UIPArray_Internal_Tag;
\r
34 struct CHNLIB_UIPARRAY_INTERNAL_TAG {
\r
35 //UIPArrayの一つの添字に対応するデータを格納する構造体
\r
40 struct CHNLIB_UIPARRAY {
\r
41 //UnsignedIntとPointerを格納するArray構造体
\r
42 CHNLIB_StructureHeader header;
\r
44 int using_tags; //Number of using tags in this pack.
\r
45 CHNLIB_UIPArray_Internal_Tag tag[CHNLIB_UIPArray_INTERNAL_PACKDATAS];
\r
46 CHNLIB_UIPArray *next;
\r
52 CHNLIB_UIPArray *CHNLIB_UIPArray_Initialize(void)
\r
54 //ポインタを初期化する(NULLを返す)。
\r
58 int CHNLIB_UIPArray_AppendLast(CHNLIB_UIPArray **array, uint data32, void *pointer)
\r
60 //Arrayの末尾にデータを追加する。
\r
64 for(; *array != NULL && (*array)->using_tags == CHNLIB_UIPArray_INTERNAL_PACKDATAS; array = &((*array)->next)){
\r
65 index += CHNLIB_UIPArray_INTERNAL_PACKDATAS;
\r
69 *array = CHNLIB_UIPArray_Internal_Allocate();
\r
71 (*array)->tag[(*array)->using_tags].data32 = data32;
\r
72 (*array)->tag[(*array)->using_tags].pointer = pointer;
\r
73 (*array)->using_tags++;
\r
75 return index + (*array)->using_tags - 1;
\r
78 int CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(CHNLIB_UIPArray **array, uint data32, void *pointer, int (*IsDuplicated)(const void *listtag, const void *newtag))
\r
80 //戻り値:IsAdded(True/False)
\r
81 //int (*IsDuplicated)(void *listtag, void *newtag)は、重複を確認する関数へのポインタ。
\r
82 //listtagにarrayのすべてのpointerを与え、すべてがFalseだった場合追加してFalseを返す。
\r
83 //Trueが返った時点で、追加をせずTrueを返す。
\r
86 i_max = CHNLIB_UIPArray_GetNumberOfDatas(*array);
\r
87 for(i = 0; i < i_max; i++){
\r
88 if(IsDuplicated(CHNLIB_UIPArray_GetPointerByIndex(*array, i), pointer)){
\r
93 CHNLIB_UIPArray_AppendLast(array, data32, pointer);
\r
98 void CHNLIB_UIPArray_FreeOnlyArray(CHNLIB_UIPArray **array)
\r
100 //ArrayそのものをFreeする。
\r
101 //Pointerの参照先については関知しない。
\r
102 CHNLIB_UIPArray *now, *next;
\r
107 for(; now != NULL; ){
\r
115 void CHNLIB_UIPArray_FreeOnlyAllPointer(CHNLIB_UIPArray *array)
\r
117 //Pointerの参照先をすべてFree.
\r
121 for(; array != NULL; array = array->next){
\r
122 for(i = 0; i < array->using_tags; i++){
\r
123 if(array->tag[i].pointer != NULL){
\r
124 free(array->tag[i].pointer);
\r
125 array->tag[i].pointer = NULL;
\r
132 void CHNLIB_UIPArray_FreeOnlySelectedPointer(CHNLIB_UIPArray *array)
\r
134 //Pointerの参照先で、data32==FalseのものをFree.
\r
138 for(; array != NULL; array = array->next){
\r
139 for(i = 0; i < array->using_tags; i++){
\r
140 if(array->tag[i].pointer != NULL && !array->tag[i].data32){
\r
141 free(array->tag[i].pointer);
\r
142 array->tag[i].pointer = NULL;
\r
149 void CHNLIB_UIPArray_FreeAll(CHNLIB_UIPArray **array)
\r
151 //Array及びすべてのPointerをFree.
\r
152 CHNLIB_UIPArray_FreeOnlyAllPointer(*array);
\r
153 CHNLIB_UIPArray_FreeOnlyArray(array);
\r
157 void CHNLIB_UIPArray_FreeSelectedAll(CHNLIB_UIPArray **array)
\r
159 //Array及びdata32==TrueのPointerをFree.
\r
160 CHNLIB_UIPArray_FreeOnlySelectedPointer(*array);
\r
161 CHNLIB_UIPArray_FreeOnlyArray(array);
\r
165 int CHNLIB_UIPArray_GetNumberOfDatas(const CHNLIB_UIPArray *array)
\r
167 //Arrayで現在使用中のデータの個数を返す。
\r
172 for(; array != NULL; array = array->next){
\r
173 tags += array->using_tags;
\r
178 uint CHNLIB_UIPArray_GetData32ByIndex(const CHNLIB_UIPArray *array, int index)
\r
180 //retv:array[index]->data32
\r
181 for(; (index / CHNLIB_UIPArray_INTERNAL_PACKDATAS) > 0; index -= CHNLIB_UIPArray_INTERNAL_PACKDATAS){
\r
185 array = array->next;
\r
190 return array->tag[index].data32;
\r
193 uint CHNLIB_UIPArray_SetData32ByIndex(CHNLIB_UIPArray *array, int index, uint data32)
\r
195 //retv = old data32
\r
199 for(; (index / CHNLIB_UIPArray_INTERNAL_PACKDATAS) > 0; index -= CHNLIB_UIPArray_INTERNAL_PACKDATAS){
\r
203 array = array->next;
\r
208 olddata = array->tag[index].data32;
\r
209 array->tag[index].data32 = data32;
\r
213 void *CHNLIB_UIPArray_GetPointerByIndex(const CHNLIB_UIPArray *array, int index)
\r
215 //retv:array[index]->pointer
\r
216 for(; (index / CHNLIB_UIPArray_INTERNAL_PACKDATAS) > 0; index -= CHNLIB_UIPArray_INTERNAL_PACKDATAS){
\r
220 array = array->next;
\r
225 return array->tag[index].pointer;
\r
228 int CHNLIB_UIPArray_GetIndexByData32(const CHNLIB_UIPArray *array, uint data32)
\r
230 //指定されたdata32を持つ最小のIndexを返す。
\r
233 i_max = CHNLIB_UIPArray_GetNumberOfDatas(array);
\r
234 for(i = 0; i < i_max; i++){
\r
235 if(CHNLIB_UIPArray_GetData32ByIndex(array, i) == data32){
\r
239 return CHNLIB_UIPArray_INDEX_NOTFOUND;
\r
242 void *CHNLIB_UIPArray_GetPointerByData32(const CHNLIB_UIPArray *array, uint data32)
\r
244 //指定されたdata32を持つindexのデータのPointerを返す。
\r
245 return CHNLIB_UIPArray_GetPointerByIndex(array, CHNLIB_UIPArray_GetIndexByData32(array, data32));
\r
249 //Internal functions
\r
251 CHNLIB_UIPArray *CHNLIB_UIPArray_Internal_Allocate(void)
\r
254 //このソース以外から呼び出してはならない。
\r
255 CHNLIB_UIPArray *tag;
\r
257 tag = (CHNLIB_UIPArray *)CHNLIB_System_AllocateMemory_Strict(sizeof(CHNLIB_UIPArray), CHNLIB_DEBUG_ARGUMENTS);
\r
259 CHNLIB_StructureHeader_Initialize(&tag->header, CHNLIB_STRUCT_ID_UIPArray);
\r