Wednesday, 4 March 2009

Simple Function Pointers example

This example shows how function pointers work. There is also an example of how priority queues work.



//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy
//This program intents to show the use of function pointers
//This program also uses priority queues
#include<iostream>
#include<queue>

using namespace
std;

typedef
int (*fpRegCb)(int* i_p, int index);

int
funcA(int *val, int index)
{

cout<<"Func A: index = "<<index<<" val = "<<*val<<endl;
return
(*val + 10);
}


int
funcB(int *val, int index)
{

cout<<"Func B: index = "<<index<<" val = "<<*val<<endl;
return
(*val + 15);
}


class
someSimpleListType
{

private
:
someSimpleListType(); //This cant be used
public:
int
index;
int
*value;
fpRegCb callback;
someSimpleListType(fpRegCb cb, int *val, int idx):value(val),index(idx)
{

callback = cb;
};

//< operator is overloaded for use with priority queues. This will
//decide the priority of the new element, where it should be placed
const bool operator <(const someSimpleListType& sLT) const
{

return
(index < sLT.index);
}
};


priority_queue <someSimpleListType> someSimpleList;

int
main()
{

int
index=0;
int
*a=new int(22);
int
*b=new int(37);
int
*c=new int(62);

//The higher the priority, higher it is in the queue
someSimpleList.push(someSimpleListType(funcA, a, index++));
someSimpleList.push(someSimpleListType(funcB, b, index++));
someSimpleList.push(someSimpleListType(funcB, c, index++));
//The last push will end up top of queue as index(priority) is greatest

//Lets get all the elements from the list and process them
cout<<"Test 1"<<endl;
while
(!someSimpleList.empty())
{

someSimpleListType &sLT = someSimpleList.top();
cout<<"Callback["<<sLT.index<<"] = "<<sLT.callback(sLT.value,sLT.index)<<endl;
someSimpleList.pop();
}


//Since the priority queue is now empty, push some more elements
someSimpleList.push(someSimpleListType(funcA, a, index++));
someSimpleList.push(someSimpleListType(funcB, b, index++));
someSimpleList.push(someSimpleListType(funcB, c, index++));

//This time we will only process funcB and ignore funcA
cout<<endl<<"Test 2"<<endl;
while
(!someSimpleList.empty())
{

someSimpleListType &sLT = someSimpleList.top();
if
(sLT.callback == funcB)
{

cout<<"Callback["<<sLT.index<<"] = "<<sLT.callback(sLT.value,sLT.index)<<endl;
}

someSimpleList.pop();
}


return
0;
}


No comments:

Post a Comment