Bridge++  Ver. 1.3.x
parameters_factory.cpp
Go to the documentation of this file.
1 
14 #include "parameters_factory.h"
15 
16 //====================================================================
18 {
19  if (!s_instance) {
20  //
21  // acquire lock here
22  //
23  if (!s_instance) {
25  }
26  //
27  // release lock here
28  //
29  }
30 
31  return *s_instance;
32 }
33 
34 
35 //====================================================================
37 {
38  static ParametersFactory instance_;
39 
40  s_instance = &instance_;
41 }
42 
43 
44 //====================================================================
46 {
47  database_type::const_iterator q = m_map.find(realm);
48 
49  if (q == m_map.end()) {
50  vout.crucial("%s: key \'%s\' not found.\n", __func__, realm.c_str());
51  return 0;
52  }
53 
54  creator_callback_list cl = q->second;
55 
56  Parameters *param = new Parameters;
57  for (creator_callback_list::const_iterator p = cl.begin(); p != cl.end(); ++p) {
58  (*p)(*param);
59  }
60 
61  return param;
62 }
63 
64 
65 //====================================================================
66 bool ParametersFactory::register_callback(const std::string& realm, const creator_callback& cb)
67 {
68  std::vector<std::string> v = string_tokenize(realm, '.');
69 
70  while (v.size() > 0)
71  {
72  std::string subrealm = string_concat(v, '.');
73 
74 #if 0
75  // for debug: use stdio because vout is not ready at this stage.
76  printf("%s: append to %s\n", __func__, subrealm.c_str());
77  printf("%s: realm \'%s\": callback append to %s\n", __func__, realm.c_str(), subrealm.c_str());
78 #endif
79 
80  m_map[subrealm].push_back(cb);
81 
82  v.pop_back();
83  }
84 
85  return true;
86 }
87 
88 
89 //====================================================================
90 std::vector<std::string> ParametersFactory::string_tokenize(const std::string& src, const char delim)
91 {
92  std::vector<std::string> retv;
93 
94  size_t npos = src.length();
95  size_t p = 0;
96 
97  while (true)
98  {
99  size_t q = src.find(delim, p);
100 
101  if (q >= npos) { // not found
102  retv.push_back(src.substr(p)); // append rest
103  break;
104  }
105 
106  retv.push_back(src.substr(p, q - p));
107  p = q + 1; // skip delimiter.
108  }
109 
110  return retv;
111 }
112 
113 
114 //====================================================================
115 std::string ParametersFactory::string_concat(const std::vector<std::string>& src, const char delim)
116 {
117  if (src.size() == 0) return std::string();
118 
119  std::string buf = src[0];
120  for (size_t i = 1; i < src.size(); ++i) {
121  buf += delim;
122  buf += src[i];
123  }
124 
125  return buf;
126 }
127 
128 
129 //====================================================================
std::string string_concat(const std::vector< std::string > &src, const char delim= '.')
BridgeIO vout
Definition: bridgeIO.cpp:278
Parameters * create_parameters(const std::string &realm)
bool register_callback(const std::string &realm, const creator_callback &cb)
Class for parameters.
Definition: parameters.h:38
static ParametersFactory & Instance()
static ParametersFactory * s_instance
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
std::list< creator_callback > creator_callback_list
std::vector< std::string > string_tokenize(const std::string &src, const char delim= '.')
static void CreateInstance()