1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
#include "filter.h"
#include "filter_step.h"
struct FilterChainData {
FilterFactory factory;
STD_list<FilterStep*> filters;
};
/////////////////////////////////////////////////////////
FilterChain::FilterChain() : filterchaindata(new FilterChainData) {}
FilterChain::~FilterChain() {
delete filterchaindata;
}
bool FilterChain::create(const svector& args) {
Log<Filter> odinlog("FilterChain","create");
filterchaindata->filters.clear();
ODINLOG(odinlog,normalDebug) << "args=" << args.printbody() << STD_endl;
unsigned int nargs=args.size();
for(unsigned int i=0; i<nargs; i++){
if(args[i].length() && args[i][0]=='-') {
STD_string filterlabel=args[i].substr(1,args[i].length()-1);
FilterStep* filter=filterchaindata->factory.create(filterlabel);
if(filter) {
if(i<(nargs-1) && filter->numof_args()) {
STD_string argstr=args[i+1];
ODINLOG(odinlog,normalDebug) << "argstr=" << argstr << STD_endl;
if(argstr.length()) filter->set_args(argstr);
i++;
}
filterchaindata->filters.push_back(filter);
}
}
}
return true;
}
FilterChain::FilterChain(const STD_string& argstr) : filterchaindata(new FilterChainData) {
init(argstr);
}
FilterChain::FilterChain(int argc,char *argv[]) : filterchaindata(new FilterChainData) {
Log<Filter> odinlog("FilterChain","FilterChain");
int nargs=argc-1;
if(nargs<=0) return;
svector args; args.resize(nargs);
for(int i=0; i<nargs; i++) args[i]=argv[i+1];
create(args);
}
bool FilterChain::apply(FileIO::ProtocolDataMap& pdmap) const {
Log<Filter> odinlog("FilterChain","apply");
for(STD_list<FilterStep*>::const_iterator fit=filterchaindata->filters.begin();fit!=filterchaindata->filters.end();fit++){
ODINLOG(odinlog,loglevel()) << "Applying filter " << (*fit)->label() << "(" << (*fit)->args_values() << ")" << STD_endl;
FilterStep *step=*fit;
if(!step->process(pdmap)) return false;
}
return true;
}
bool FilterChain::apply(Protocol& prot, Data<float,4>& data) const {
Log<Filter> odinlog("FilterChain","apply");
for(STD_list<FilterStep*>::const_iterator fit=filterchaindata->filters.begin();fit!=filterchaindata->filters.end();fit++){
ODINLOG(odinlog,loglevel()) << "Applying filter '" << (*fit)->label() << "'" << STD_endl;
if(!(*fit)->process(data, prot)) return false;
}
return true;
}
STD_string FilterChain::get_cmdline_usage(const STD_string& lineprefix) const {
return filterchaindata->factory.get_cmdline_usage(lineprefix);
}
|