artdaq_mfextensions  v1_06_02
ma_test_function.h
1 #ifndef ERROR_HANDLER_MA_TEST_H
2 #define ERROR_HANDLER_MA_TEST_H
3 
4 // ----------------------------------------------------------
5 //
6 // Base class for custom condition test functions
7 //
8 // ----------------------------------------------------------
9 
10 #include <boost/any.hpp>
11 #include <boost/function.hpp>
12 
13 #include <map>
14 #include <string>
15 #include <vector>
16 
17 namespace novadaq {
18 namespace errorhandler {
19 
20 class ma_condition;
21 
22 typedef std::vector<boost::any> anys_t;
23 
25 {
26 public:
27  ma_test_function() {}
28  virtual ~ma_test_function() {}
29 
30  // evaluation function
31  virtual boost::any
32  evaluate(ma_condition const& cond) = 0;
33 
34  // parse aruments
35  virtual bool
36  parse_arguments(anys_t const& /*args*/) { return true; }
37 };
38 
39 typedef boost::function<ma_test_function*()> gen_test_t;
40 
42 {
43  typedef std::map<std::string, gen_test_t> gen_map_t;
44 
45 public:
46  static void
47  reg(std::string const& func_name, gen_test_t f);
48 
49  static ma_test_function*
50  create_instance(std::string const& func_name);
51 
52 private:
54 
55  static gen_map_t&
56  get_map()
57  {
58  static gen_map_t map;
59  return map;
60  }
61 };
62 
64 {
65  ma_test_function_maker(std::string const& func_name, gen_test_t f)
66  {
67  ma_test_function_factory::reg(func_name, f);
68  }
69 };
70 
71 } // end of namespace errorhandler
72 } // end of namespace novadaq
73 
74 #define REG_MA_TEST_FUNCTION(func_name, class_name) \
75  ma_test_function* \
76  class_name##_maker_func() { return new class_name(); } \
77  ma_test_function_maker \
78  class_name##_maker_func_global_var(#func_name, class_name##_maker_func);
79 
80 #endif