1 #include <config.h>
2 #include <compiler/ObsFuncTab.h>
3 #include <function/FunctionPtr.h>
4 #include <distribution/Distribution.h>
5
6 #include <functional>
7 #include <algorithm>
8
9 using std::binary_function;
10 using std::find_if;
11
12 namespace jags {
13
14 typedef std::pair<DistPtr, FunctionPtr> ObsFunc;
15 typedef std::list<ObsFunc> OFList;
16
17 struct isDist: public binary_function<ObsFunc, DistPtr, bool>
18 {
19 // Adaptable binary predicate for find_if algorithm
operator ()jags::isDist20 bool operator()(ObsFunc const &f, DistPtr const &dist) const
21 {
22 return f.first == dist;
23 }
24 };
25
ObsFuncTab()26 ObsFuncTab::ObsFuncTab()
27 : _flist(), _nullfun()
28 {
29 //Required by Solaris Studio, which won't create a default constructor
30 //with -std=c++11
31 }
32
insert(DistPtr const & dist,FunctionPtr const & func)33 void ObsFuncTab::insert (DistPtr const &dist, FunctionPtr const &func)
34 {
35 ObsFunc f(dist, func);
36 if (std::find(_flist.begin(), _flist.end(), f) == _flist.end()) {
37 _flist.push_front(f);
38 }
39 }
40
find(DistPtr const & dist) const41 FunctionPtr const &ObsFuncTab::find(DistPtr const &dist) const
42 {
43 OFList::const_iterator p =
44 find_if(_flist.begin(), _flist.end(), bind2nd(isDist(), dist));
45
46 return (p == _flist.end()) ? _nullfun : p->second;
47 }
48
erase(DistPtr const & dist,FunctionPtr const & func)49 void ObsFuncTab::erase(DistPtr const &dist, FunctionPtr const &func)
50 {
51 _flist.remove(ObsFunc(dist, func));
52 }
53
54 } //namespace jags
55