File: filter.cpp

package info (click to toggle)
odin 2.0.5-8
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,196 kB
  • sloc: cpp: 62,638; sh: 4,541; makefile: 779
file content (90 lines) | stat: -rw-r--r-- 2,555 bytes parent folder | download | duplicates (3)
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);
}