00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef GWENHYWFAR_IDMAP_H
00029 #define GWENHYWFAR_IDMAP_H
00030
00031
00032 #include <gwenhywfar/types.h>
00033
00034 #include <stdio.h>
00035
00036 #ifdef __cplusplus
00037 extern "C" {
00038 #endif
00039
00040
00041 typedef struct GWEN_IDMAP GWEN_IDMAP;
00042
00043 typedef enum {
00044 GWEN_IdMapResult_Ok=0,
00045 GWEN_IdMapResult_NoFit,
00046 GWEN_IdMapResult_NotFound
00047 } GWEN_IDMAP_RESULT;
00048
00049
00050 typedef enum {
00051 GWEN_IdMapAlgo_Unknown=0,
00052 GWEN_IdMapAlgo_Hex4
00053 } GWEN_IDMAP_ALGO;
00054
00055
00060 #ifndef GWEN_DUMMY_EMPTY_ARG
00061
00063 # define GWEN_DUMMY_EMPTY_ARG
00064 #endif
00065
00066
00067 #define GWEN_IDMAP_FUNCTION_LIB_DEFS(t, pr, decl) \
00068 typedef GWEN_IDMAP t##_IDMAP; \
00069 \
00070 decl t##_IDMAP *pr##_IdMap_new(GWEN_IDMAP_ALGO algo); \
00071 decl void pr##_IdMap_free(t##_IDMAP *l); \
00072 decl void pr##_IdMap_freeAll(t##_IDMAP *l); \
00073 decl void pr##_IdMap_FreeItems(t##_IDMAP *l); \
00074 decl GWEN_IDMAP_RESULT pr##_IdMap_Insert(t##_IDMAP *l, \
00075 GWEN_TYPE_UINT32 id, \
00076 t* ptr); \
00077 decl GWEN_IDMAP_RESULT pr##_IdMap_Remove(t##_IDMAP *l, \
00078 GWEN_TYPE_UINT32 id); \
00079 decl t* pr##_IdMap_Find(t##_IDMAP *l, GWEN_TYPE_UINT32 id); \
00080 decl GWEN_IDMAP_RESULT pr##_IdMap_GetFirst(const t##_IDMAP *map, \
00081 GWEN_TYPE_UINT32 *pid); \
00082 decl GWEN_IDMAP_RESULT pr##_IdMap_GetNext(const t##_IDMAP *map, \
00083 GWEN_TYPE_UINT32 *pid); \
00084 decl GWEN_TYPE_UINT32 pr##_IdMap_GetSize(const GWEN_IDMAP *map); \
00085 decl void pr##_IdMap_Clear(GWEN_IDMAP *l);
00086
00087
00088 #define GWEN_IDMAP_FUNCTION_DEFS(t, pr) \
00089 GWEN_IDMAP_FUNCTION_LIB_DEFS(t, pr, GWEN_DUMMY_EMPTY_ARG)
00090
00091
00092 #define GWEN_IDMAP_FUNCTIONS(t, pr) \
00093 t##_IDMAP *pr##_IdMap_new(GWEN_IDMAP_ALGO algo) { \
00094 return (t##_IDMAP*)GWEN_IdMap_new(algo); \
00095 } \
00096 \
00097 void pr##_IdMap_free(t##_IDMAP *l) { \
00098 GWEN_IdMap_free((GWEN_IDMAP*)l); \
00099 } \
00100 \
00101 void pr##_IdMap_freeAll(t##_IDMAP *l) { \
00102 GWEN_IDMAP_RESULT res; \
00103 GWEN_TYPE_UINT32 id; \
00104 \
00105 res=pr##_IdMap_GetFirst(l, &id); \
00106 while(res==GWEN_IdMapResult_Ok) { \
00107 GWEN_TYPE_UINT32 nextId; \
00108 t *ptr; \
00109 \
00110 nextId=id; \
00111 res=pr##_IdMap_GetNext(l, &nextId); \
00112 ptr=pr##_IdMap_Find(l, id); \
00113 if (ptr) \
00114 pr##_free(ptr); \
00115 id=nextId; \
00116 } \
00117 pr##_IdMap_free(l); \
00118 } \
00119 \
00120 void pr##_IdMap_FreeItems(t##_IDMAP *l) { \
00121 GWEN_IDMAP_RESULT res; \
00122 GWEN_TYPE_UINT32 id; \
00123 \
00124 res=pr##_IdMap_GetFirst(l, &id); \
00125 while(res==GWEN_IdMapResult_Ok) { \
00126 GWEN_TYPE_UINT32 nextId; \
00127 t *ptr; \
00128 \
00129 nextId=id; \
00130 res=pr##_IdMap_GetNext(l, &nextId); \
00131 ptr=pr##_IdMap_Find(l, id); \
00132 if (ptr) \
00133 pr##_free(ptr); \
00134 pr##_IdMap_Remove(l, id); \
00135 id=nextId; \
00136 } \
00137 } \
00138 \
00139 GWEN_IDMAP_RESULT pr##_IdMap_Insert(t##_IDMAP *l, \
00140 GWEN_TYPE_UINT32 id, \
00141 t* ptr) { \
00142 return GWEN_IdMap_Insert((GWEN_IDMAP*)l, id, (void*) ptr); \
00143 } \
00144 \
00145 GWEN_IDMAP_RESULT pr##_IdMap_Remove(t##_IDMAP *l, \
00146 GWEN_TYPE_UINT32 id){ \
00147 return GWEN_IdMap_Remove((GWEN_IDMAP*)l, id); \
00148 } \
00149 \
00150 t* pr##_IdMap_Find(t##_IDMAP *l, GWEN_TYPE_UINT32 id) { \
00151 return GWEN_IdMap_Find((GWEN_IDMAP*)l, id); \
00152 } \
00153 \
00154 GWEN_IDMAP_RESULT pr##_IdMap_GetFirst(const t##_IDMAP *l, \
00155 GWEN_TYPE_UINT32 *pid) { \
00156 return GWEN_IdMap_GetFirst((const GWEN_IDMAP*)l, pid); \
00157 } \
00158 \
00159 GWEN_IDMAP_RESULT pr##_IdMap_GetNext(const t##_IDMAP *l, \
00160 GWEN_TYPE_UINT32 *pid) { \
00161 return GWEN_IdMap_GetNext((const GWEN_IDMAP*)l, pid); \
00162 } \
00163 \
00164 GWEN_TYPE_UINT32 pr##_IdMap_GetSize(const GWEN_IDMAP *l) { \
00165 return GWEN_IdMap_GetSize((const GWEN_IDMAP*)l); \
00166 } \
00167 \
00168 void pr##_IdMap_Clear(GWEN_IDMAP *l) { \
00169 GWEN_IdMap_Clear((GWEN_IDMAP*)l); \
00170 }
00171
00175 GWENHYWFAR_API
00176 GWEN_IDMAP *GWEN_IdMap_new(GWEN_IDMAP_ALGO algo);
00177
00178 GWENHYWFAR_API
00179 void GWEN_IdMap_free(GWEN_IDMAP *map);
00180
00181 GWENHYWFAR_API
00182 GWEN_IDMAP_RESULT GWEN_IdMap_Insert(GWEN_IDMAP *map,
00183 GWEN_TYPE_UINT32 id,
00184 void *ptr);
00185
00186 GWENHYWFAR_API
00187 GWEN_IDMAP_RESULT GWEN_IdMap_Remove(GWEN_IDMAP *map,
00188 GWEN_TYPE_UINT32 id);
00189
00190 GWENHYWFAR_API
00191 void *GWEN_IdMap_Find(GWEN_IDMAP *map, GWEN_TYPE_UINT32 id);
00192
00193
00201 GWENHYWFAR_API
00202 GWEN_IDMAP_RESULT GWEN_IdMap_GetFirst(const GWEN_IDMAP *map,
00203 GWEN_TYPE_UINT32 *pid);
00204
00212 GWENHYWFAR_API
00213 GWEN_IDMAP_RESULT GWEN_IdMap_GetNext(const GWEN_IDMAP *map,
00214 GWEN_TYPE_UINT32 *pid);
00215
00216 GWENHYWFAR_API
00217 GWEN_TYPE_UINT32 GWEN_IdMap_GetSize(const GWEN_IDMAP *map);
00218
00219 GWENHYWFAR_API
00220 void GWEN_IdMap_Clear(GWEN_IDMAP *map);
00221
00222
00223 GWENHYWFAR_API
00224 void GWEN_IdMap_Dump(GWEN_IDMAP *map, FILE *f, int indent);
00225
00226
00227 #ifdef __cplusplus
00228 }
00229 #endif
00230
00231
00232 #endif
00233