#include <iostream>
#include <map>
namespace detail {
struct FuncPtrMap {
friend struct FuncPtrRegisterer;
typedef void(*FuncPtr)();
static std::map<std::string, FuncPtr> const &getMap() {
return getWritableMap();
}
private:
// SIOF-proof singleton
static std::map<std::string, FuncPtr> &getWritableMap() {
static std::map<std::string, FuncPtr> theMap;
return theMap;
}
};
// Each static instance will register one function pointer
struct FuncPtrRegisterer {
FuncPtrRegisterer(FuncPtrMap::FuncPtr funcPtr, char const *funcName) {
FuncPtrMap::getWritableMap().insert(std::make_pair(funcName, funcPtr));
}
};
}
// Public access to the function pointers map
typedef std::map<std::string, detail::FuncPtrMap::FuncPtr> FunctionPointersMap;
FunctionPointersMap const &gFunctionPointersMap = detail::FuncPtrMap::getMap();
#define DO_CAT(A, B) A##B
#define CAT(A, B) DO_CAT(A, B)
// Registering macro : defines a static registerer
// with a (hopefully) unique name.
#define REGISTER_FUNC(NAME) detail::FuncPtrRegisterer \
CAT(fpreg, __COUNTER__) (&NAME, #NAME)
//
// Test
//
void myFunc1() {
std::cout << "func1\n";
}
REGISTER_FUNC(myFunc1);
void myFunc2() {
std::cout << "func2\n";
}
REGISTER_FUNC(myFunc2);
int main()
{
for(FunctionPointersMap::const_iterator
ite = gFunctionPointersMap.begin(),
end = gFunctionPointersMap.end();
ite != end; ++ite) {
std::cout << "Calling " << ite->first << " : ";
ite->second();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgoKbmFtZXNwYWNlIGRldGFpbCB7CiAgICBzdHJ1Y3QgRnVuY1B0ck1hcCB7CiAgICAgICAgZnJpZW5kIHN0cnVjdCBGdW5jUHRyUmVnaXN0ZXJlcjsKICAgICAgICB0eXBlZGVmIHZvaWQoKkZ1bmNQdHIpKCk7CiAgICAgICAgc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBGdW5jUHRyPiBjb25zdCAmZ2V0TWFwKCkgewogICAgICAgICAgICByZXR1cm4gZ2V0V3JpdGFibGVNYXAoKTsKICAgICAgICB9CiAgICAgICAgCiAgICBwcml2YXRlOgogICAgICAgIC8vIFNJT0YtcHJvb2Ygc2luZ2xldG9uCiAgICAgICAgc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBGdW5jUHRyPiAmZ2V0V3JpdGFibGVNYXAoKSB7CiAgICAgICAgICAgIHN0YXRpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgRnVuY1B0cj4gdGhlTWFwOwogICAgICAgICAgICByZXR1cm4gdGhlTWFwOwogICAgICAgIH0KICAgIH07CgogICAgLy8gRWFjaCBzdGF0aWMgaW5zdGFuY2Ugd2lsbCByZWdpc3RlciBvbmUgZnVuY3Rpb24gcG9pbnRlcgogICAgc3RydWN0IEZ1bmNQdHJSZWdpc3RlcmVyIHsKICAgICAgICBGdW5jUHRyUmVnaXN0ZXJlcihGdW5jUHRyTWFwOjpGdW5jUHRyIGZ1bmNQdHIsIGNoYXIgY29uc3QgKmZ1bmNOYW1lKSB7CiAgICAgICAgICAgIEZ1bmNQdHJNYXA6OmdldFdyaXRhYmxlTWFwKCkuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGZ1bmNOYW1lLCBmdW5jUHRyKSk7CiAgICAgICAgfQogICAgfTsKfQoKLy8gUHVibGljIGFjY2VzcyB0byB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgbWFwCnR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGRldGFpbDo6RnVuY1B0ck1hcDo6RnVuY1B0cj4gRnVuY3Rpb25Qb2ludGVyc01hcDsKRnVuY3Rpb25Qb2ludGVyc01hcCBjb25zdCAmZ0Z1bmN0aW9uUG9pbnRlcnNNYXAgPSBkZXRhaWw6OkZ1bmNQdHJNYXA6OmdldE1hcCgpOwoKI2RlZmluZSBET19DQVQoQSwgQikgQSMjQgojZGVmaW5lIENBVChBLCBCKSBET19DQVQoQSwgQikKCi8vIFJlZ2lzdGVyaW5nIG1hY3JvIDogZGVmaW5lcyBhIHN0YXRpYyByZWdpc3RlcmVyCi8vIHdpdGggYSAoaG9wZWZ1bGx5KSB1bmlxdWUgbmFtZS4KI2RlZmluZSBSRUdJU1RFUl9GVU5DKE5BTUUpIGRldGFpbDo6RnVuY1B0clJlZ2lzdGVyZXIgXAogICAgQ0FUKGZwcmVnLCBfX0NPVU5URVJfXykgKCZOQU1FLCAjTkFNRSkKCgovLwovLyBUZXN0Ci8vCgp2b2lkIG15RnVuYzEoKSB7CiAgICBzdGQ6OmNvdXQgPDwgImZ1bmMxXG4iOwp9ClJFR0lTVEVSX0ZVTkMobXlGdW5jMSk7Cgp2b2lkIG15RnVuYzIoKSB7CiAgICBzdGQ6OmNvdXQgPDwgImZ1bmMyXG4iOwp9ClJFR0lTVEVSX0ZVTkMobXlGdW5jMik7CgppbnQgbWFpbigpCnsKICAgIGZvcihGdW5jdGlvblBvaW50ZXJzTWFwOjpjb25zdF9pdGVyYXRvcgogICAgICAgIGl0ZSA9IGdGdW5jdGlvblBvaW50ZXJzTWFwLmJlZ2luKCksCiAgICAgICAgZW5kID0gZ0Z1bmN0aW9uUG9pbnRlcnNNYXAuZW5kKCk7CiAgICAgICAgaXRlICE9IGVuZDsgKytpdGUpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkNhbGxpbmcgIiA8PCBpdGUtPmZpcnN0IDw8ICIgOiAiOwogICAgICAgIGl0ZS0+c2Vjb25kKCk7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9