/**
* 这是今天看到的一种写法,以前没有注意,今天其他
* 需求又看了一下,有点感触,精简一下分享出来。
*
* register和call里面的while循环是此方法的精髓。
* 同一个id可以有很多个不同的注册函数,
* 这些函数通过register中的while循环添加到链表中,
* 又通过call中的while循环一个一个的调用。
*
* 在复杂重复逻辑的地方用起来会很方便,会显得很巧妙。
* 我感觉这种方法在某种语言中应该是很常见的,但是我
* 只对C有简单的了解,就不知道出处了。读者如果知道
* 希望能够留言指点一下。谢谢。
*/
/**
* 函数指针(回调函数)原型
*/
typedef int (*f)(void* param);
/**
* 操作最小结构体
*/
typedef struct _mapping{
int id;
f fun;
struct mapping* next;
}mapping;
/**
* 最多支持128个不同的id的回调函数
*/
mapping* registry[128];
/**
* 注册方法
*/
void register(int _id, f function){
mapping* item = malloc(sizeof(mapping));
item->id = _id;
item->fun = function;
item->next = NULL;
for(int i=0; i<(registry/sizeof(registry[0])), i++){
if(!registry)
registry[i] = item;
else if(registry[i]->id == _id){
mapping* map = registry[i];
while(map->next){
map = registry[i]->next;
}
map->next = item;
}
}
}
/**
* 调用方法
*/
void call(void* param){
mapping* map;
for(int i=0; i<(sizeof(registry)/registry[0]); i++){
if(!registry[i])
break;
if(registry[i]->id != param->id)
continue;
map = registry[i];
while (map){
map->fun(param);
map = map->next;
}
}
}