#include <stdio.h>
#define BYPASS NULL
typedef void(*callback)(int key,void* val);
typedef int(*predicate)(void* elem1,void* elem2);
void call_where(
void *arr,
int elemCount,
int elemSize,
callback call,
predicate when,
void* elem
)
{
int i;
for(i = 0; i < elemCount; i++)
if(when == BYPASS
|| when(elem, (char*)arr + i * elemSize) )
call(i, (char*)arr + i * elemSize);
}
void IntRandom(int key, void* val)
{
}
void IntPrint(int key, void* val)
{
printf("%d => %d\n",key
,*(int*)val
); }
int IntEquals(void* a, void* b)
{
return *(int*)a == *(int*)b;
}
int main()
{
int arr[50];
int searchFor = 3;
call_where(arr,50,sizeof(int),IntRandom,BYPASS,BYPASS);
call_where(arr,50,sizeof(int),IntPrint,BYPASS,BYPASS);
call_where(arr,50,sizeof(int),IntPrint,IntEquals,&searchFor);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNkZWZpbmUgQllQQVNTIE5VTEwKdHlwZWRlZiB2b2lkKCpjYWxsYmFjaykoaW50IGtleSx2b2lkKiB2YWwpOwp0eXBlZGVmIGludCgqcHJlZGljYXRlKSh2b2lkKiBlbGVtMSx2b2lkKiBlbGVtMik7CgoKdm9pZCBjYWxsX3doZXJlKAoJdm9pZCAqYXJyLAoJaW50IGVsZW1Db3VudCwKCWludCBlbGVtU2l6ZSwKCWNhbGxiYWNrIGNhbGwsCglwcmVkaWNhdGUgd2hlbiwKCXZvaWQqIGVsZW0KCSkKewoJaW50IGk7Cglmb3IoaSA9IDA7IGkgPCBlbGVtQ291bnQ7IGkrKykKCQlpZih3aGVuID09IEJZUEFTUyAKCQkJfHwgd2hlbihlbGVtLCAoY2hhciopYXJyICsgaSAqIGVsZW1TaXplKSApCgkJCWNhbGwoaSwgKGNoYXIqKWFyciArIGkgKiBlbGVtU2l6ZSk7Cn0KCgoKdm9pZCBJbnRSYW5kb20oaW50IGtleSwgdm9pZCogdmFsKQp7CgkqKGludCopdmFsID0gcmFuZCgpJTEwOwp9CnZvaWQgSW50UHJpbnQoaW50IGtleSwgdm9pZCogdmFsKQp7CglwcmludGYoIiVkID0+ICVkXG4iLGtleSwqKGludCopdmFsKTsKfQppbnQgSW50RXF1YWxzKHZvaWQqIGEsIHZvaWQqIGIpCnsKCXJldHVybiAqKGludCopYSA9PSAqKGludCopYjsKfQppbnQgbWFpbigpCnsKCglpbnQgYXJyWzUwXTsKCWludCBzZWFyY2hGb3IgPSAzOwoJY2FsbF93aGVyZShhcnIsNTAsc2l6ZW9mKGludCksSW50UmFuZG9tLEJZUEFTUyxCWVBBU1MpOwoJcHJpbnRmKCJJbml0IEFycmF5XG4iKTsKCWNhbGxfd2hlcmUoYXJyLDUwLHNpemVvZihpbnQpLEludFByaW50LEJZUEFTUyxCWVBBU1MpOwoJcHJpbnRmKCJGb3VuZCAzIGF0XG4iKTsKCWNhbGxfd2hlcmUoYXJyLDUwLHNpemVvZihpbnQpLEludFByaW50LEludEVxdWFscywmc2VhcmNoRm9yKTsKCglyZXR1cm4gMDsKfQo=