summaryrefslogtreecommitdiff
path: root/decoder/ff_factory.cc
blob: f45d86957a2c4b3c2d37e391b97a81c0b8199312 (plain)
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
#include "ff_factory.h"

#include "ff.h"
#include "stringlib.h"
#include <stdexcept>

using boost::shared_ptr;
using namespace std;

// global ff registry
FFRegistry ff_registry;

UntypedFactory::~UntypedFactory() {  }

void UntypedFactoryRegistry::clear() {
  reg_.clear();
}

bool UntypedFactoryRegistry::have(std::string const& ffname) {
  return reg_.find(ffname)!=reg_.end();
}

void UntypedFactoryRegistry::DisplayList() const {
  for (Factmap::const_iterator it = reg_.begin();
       it != reg_.end(); ++it) {
    cerr << "  " << it->first << endl;
  }
}

string UntypedFactoryRegistry::usage(string const& ffname,bool params,bool verbose) const {
  Factmap::const_iterator it = reg_.find(ffname);
  return it == reg_.end()
    ? "Unknown feature " + ffname
    : it->second->usage(params,verbose);
}

void UntypedFactoryRegistry::Register(const string& ffname, UntypedFactory* factory) {
  if (reg_.find(ffname) != reg_.end()) {
    cerr << "Duplicate registration of FeatureFunction with name " << ffname << "!\n";
    abort();
  }
  reg_[ffname].reset(factory);
}


void UntypedFactoryRegistry::Register(UntypedFactory* factory) {
  Register(factory->usage(false,false),factory);
}


void ff_usage(std::string const& n,std::ostream &out) {
  bool have=ff_registry.have(n);
  if (have)
    out << "FF " << ff_registry.usage(n,true,true) << endl;
  else {
    cerr << "Unknown feature: " << n << endl;
    abort();
  }
}