/**
* 這是今天看到的一種寫法,以前沒有注意,今天其他
* 需求又看了一下,有點感觸,精簡一下分享出來。
*
* 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;
}
}
}