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