Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/libsaio/CoreHash.h

1//
2// CoreHash.h
3//
4// Created by Cadet-petit Armel <armelcadetpetit@gmail.com> on 08/03/12.
5// Copyright (c) 2012 . All rights reserved.
6//
7// CoreHash allows in few lines to take full advantages of hashable structures.
8
9#ifndef CoreHash_h
10#define CoreHash_h
11
12#include "uthash.h"
13
14//CoreHash Header and reserved fields
15#define CoreHashHeader \
16 char name[10]; \
17 int id; \
18 UT_hash_handle hh; /* makes this structure hashable */
19
20
21#define __CHFindStrVar(HObj) \
22static struct HObj * HObj##_FindStrVar(const char *name, struct HObj *container) { \
23 struct HObj *var; \
24 \
25if (setjmp(h_buf_error) == -1) { \
26 \
27return NULL; \
28} else { \
29HASH_FIND_STR( container, name, var ); \
30} \
31 return var; \
32}
33
34#define __CHNewStrVar(HObj) \
35static struct HObj * HObj##_NewStrVar(const char *name, struct HObj **container ) { \
36 struct HObj *var; \
37 \
38 var = (struct HObj*)malloc(sizeof(struct HObj)); \
39 if (!var) \
40 return NULL; \
41 \
42 strlcpy(var->name, name, sizeof(var->name));\
43 \
44if (setjmp(h_buf_error) == -1) { \
45 \
46free(var); \
47return NULL; \
48} else { \
49HASH_ADD_STR( *container, name, var ); \
50\
51} \
52return var;\
53}
54
55#define __CHFindStrVarOrCreate(HObj)\
56static struct HObj * HObj##_FindStrVarOrCreate(const char *name, struct HObj *container )\
57{\
58struct HObj *var;\
59\
60 var = HObj##_FindStrVar(name,container);\
61\
62 if (!var) {\
63 HObj##_NewStrVar(name,&container); \
64 }\
65return var;\
66}
67
68#define __CHDeleteStrVar(HObj) \
69static void HObj##_DeleteStrVar(const char *name, struct HObj *container ) { \
70 struct HObj *var; \
71 \
72 var = HObj##_FindStrVar(name,container); \
73 \
74 if (!var) { \
75 return; \
76 } \
77 \
78if (setjmp(h_buf_error) == -1) { \
79return; \
80} else { \
81HASH_DEL( container, var); \
82} \
83 free(var); \
84}
85
86#define CHInitStr(HObj) \
87__CHFindStrVar(HObj) \
88__CHNewStrVar(HObj) \
89__CHFindStrVarOrCreate(HObj) \
90__CHDeleteStrVar(HObj)
91
92
93
94//CoreHash Int Implementation
95
96#define __CHFindIntVar(HObj) \
97static struct HObj * HObj##_FindIntVar(int id, struct HObj *container) {\
98 struct HObj *var; \
99 \
100 if (setjmp(h_buf_error) == -1) { \
101\
102 return NULL; \
103 } else { \
104 HASH_FIND_INT( container, &id, var ); \
105 } \
106 return var; \
107}
108
109#define __CHNewIntVar(HObj) \
110static struct HObj * HObj##_NewIntVar(int id, struct HObj **container ) {\
111 struct HObj *var; \
112\
113 var = (struct HObj*)malloc(sizeof(struct HObj)); \
114 if (!var) \
115 return NULL; \
116\
117 var->id = id;\
118\
119 if (setjmp(h_buf_error) == -1) { \
120\
121 free(var); \
122 return NULL; \
123 } else { \
124 HASH_ADD_INT( *container, id, var ); \
125 \
126 } \
127 return var;\
128}
129
130#define __CHFindIntVarOrCreate(HObj) \
131static struct HObj * HObj##_FindIntVarOrCreate(int id, struct HObj *container )\
132{ \
133 struct HObj *var; \
134 \
135 var = HObj##_FindIntVar(id,container);\
136 \
137 if (!var) { \
138 HObj##_NewIntVar(id,&container); \
139 } \
140 return var; \
141}
142
143#define __CHDeleteIntVar(HObj)\
144static void HObj##_DeleteIntVar(int id, struct HObj *container ) {\
145 struct HObj *var;\
146\
147 var = HObj##_FindIntVar(id,container);\
148\
149 if (!var) {\
150 return;\
151 }\
152\
153 if (setjmp(h_buf_error) == -1) {\
154 return;\
155 } else {\
156 HASH_DEL( container, var);\
157 }\
158 free(var);\
159}
160
161#define CHInitInt(HObj) \
162 __CHFindIntVar(HObj) \
163 __CHNewIntVar(HObj) \
164 __CHFindIntVarOrCreate(HObj) \
165 __CHDeleteIntVar(HObj)
166
167
168
169
170// CoreHash Common Implementation
171
172
173#define __CHDebug(HObj) \
174static void HObj##_Debug(struct HObj *container ) \
175{ \
176struct HObj *current_var; \
177printf("Var list: \n");\
178for(current_var=container;current_var;current_var=(struct HObj*)(current_var->hh.next)) \
179{ \
180printf(" Name = %s , id = %d\n",current_var->name, current_var->id); \
181} \
182}
183
184
185#define __CHDeleteAll(HObj) \
186static void HObj##_DeleteAll(struct HObj *container ) { \
187struct HObj *current_var, *tmp; \
188\
189if (setjmp(h_buf_error) == -1) { \
190return;\
191} else { \
192HASH_ITER(hh, container, current_var, tmp) { \
193HASH_DEL(container,current_var); \
194free(current_var); \
195} \
196} \
197}
198
199#define CHUnInit(HObj)\
200__CHDeleteAll(HObj)
201
202#define CHDebug(HObj) \
203__CHDebug(HObj)
204
205#endif
206

Archive Download this file

Revision: 1887