dispatcher.h
来自「一个语言识别引擎」· C头文件 代码 · 共 74 行
H
74 行
// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-
/*
* Copyright (C) 2006 Paul Fitzpatrick
* CopyPolicy: Released under the terms of the GNU GPL v2.0.
*
*/
#ifndef _YARP2_DISPATCHER_
#define _YARP2_DISPATCHER_
#include <yarp/String.h>
#include <ace/Hash_Map_Manager.h>
#include <ace/Null_Mutex.h>
#include <ace/Vector_T.h>
#include <ace/OS_NS_stdio.h>
namespace yarp {
template <class T, class RET> class Dispatcher;
}
/**
* Dispatch to named methods based on string input.
*/
template <class T, class RET>
class yarp::Dispatcher {
private:
class Entry {
public:
String name;
RET (T::*fn)(int argc, char *argv[]);
Entry(const char *name, RET (T::*fn)(int argc, char *argv[])) :
name(name),
fn(fn)
{}
Entry() {
}
};
ACE_Hash_Map_Manager<String,Entry,ACE_Null_Mutex> action;
ACE_Vector<String> names;
public:
void add(const char *name, RET (T::*fn)(int argc, char *argv[])) {
Entry e(name,fn);
action.bind(String(name),e);
// maintain a record of order of keys
names.push_back(String(name));
}
RET dispatch(T *owner, const char *name, int argc, char *argv[]) {
String sname(name);
Entry e;
int result = action.find(sname,e);
if (result!=-1) {
return (owner->*(e.fn))(argc,argv);
} else {
ACE_DEBUG((LM_ERROR,"Could not find command \"%s\"",name));
}
return RET();
}
ACE_Vector<String> getNames() {
return names;
}
};
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?