idmap.h
Go to the documentation of this file.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 uint32_t id, \
00076 t* ptr); \
00077 decl GWEN_IDMAP_RESULT pr##_IdMap_Remove(t##_IDMAP *l, \
00078 uint32_t id); \
00079 decl t* pr##_IdMap_Find(t##_IDMAP *l, uint32_t id); \
00080 decl GWEN_IDMAP_RESULT pr##_IdMap_GetFirst(const t##_IDMAP *map, \
00081 uint32_t *pid); \
00082 decl GWEN_IDMAP_RESULT pr##_IdMap_GetNext(const t##_IDMAP *map, \
00083 uint32_t *pid); \
00084 decl uint32_t 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 uint32_t id; \
00104 \
00105 res=pr##_IdMap_GetFirst(l, &id); \
00106 while(res==GWEN_IdMapResult_Ok) { \
00107 uint32_t 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 uint32_t id; \
00123 \
00124 res=pr##_IdMap_GetFirst(l, &id); \
00125 while(res==GWEN_IdMapResult_Ok) { \
00126 uint32_t 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 uint32_t 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 uint32_t id){ \
00147 return GWEN_IdMap_Remove((GWEN_IDMAP*)l, id); \
00148 } \
00149 \
00150 t* pr##_IdMap_Find(t##_IDMAP *l, uint32_t id) { \
00151 return GWEN_IdMap_Find((GWEN_IDMAP*)l, id); \
00152 } \
00153 \
00154 GWEN_IDMAP_RESULT pr##_IdMap_GetFirst(const t##_IDMAP *l, \
00155 uint32_t *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 uint32_t *pid) { \
00161 return GWEN_IdMap_GetNext((const GWEN_IDMAP*)l, pid); \
00162 } \
00163 \
00164 uint32_t 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 uint32_t id,
00184 void *ptr);
00185
00186 GWENHYWFAR_API
00187 GWEN_IDMAP_RESULT GWEN_IdMap_Remove(GWEN_IDMAP *map,
00188 uint32_t id);
00189
00190 GWENHYWFAR_API
00191 void *GWEN_IdMap_Find(GWEN_IDMAP *map, uint32_t id);
00192
00193
00201 GWENHYWFAR_API
00202 GWEN_IDMAP_RESULT GWEN_IdMap_GetFirst(const GWEN_IDMAP *map,
00203 uint32_t *pid);
00204
00212 GWENHYWFAR_API
00213 GWEN_IDMAP_RESULT GWEN_IdMap_GetNext(const GWEN_IDMAP *map,
00214 uint32_t *pid);
00215
00216 GWENHYWFAR_API
00217 uint32_t 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