Jpp
JFunctionAdaptor.hh
Go to the documentation of this file.
1 #ifndef __JEEP__JFUNCTIONADAPTOR__
2 #define __JEEP__JFUNCTIONADAPTOR__
3 
4 #include <istream>
5 #include <ostream>
6 #include <string>
7 #include <dlfcn.h>
8 
9 #include "JLang/JException.hh"
10 #include "JLang/JNullType.hh"
11 #include "JLang/JSharedCounter.hh"
12 
13 
14 /**
15  * \author mdejong
16  */
17 
18 namespace JEEP {}
19 namespace JPP { using namespace JEEP; }
20 
21 namespace JEEP {
22 
26  using JLANG::JNullType;
27 
28 
29  /**
30  * Auxiliary base class for function adaptor.
31  */
32  template<class pF>
35  {
36  /**
37  * Virtual destructor.
38  */
40  {
41  if (detach()) {
42  close();
43  }
44  }
45 
46 
47  /**
48  * Check validity.
49  *
50  * \return true if valid function; else false
51  */
52  bool is_valid() const
53  {
54  return (function != NULL);
55  }
56 
57 
58  /**
59  * Reset function adaptor helper.
60  */
61  void reset()
62  {
63  if (detach()) {
64  close();
65  }
66 
67  function = NULL;
68  }
69 
70 
71  /**
72  * Set function.
73  *
74  * \param pf pointer to function
75  */
76  void set(pF pf)
77  {
78  reset();
79 
80  function = pf;
81  }
82 
83 
84  /**
85  * Open file.
86  *
87  * \param file_name file name
88  */
89  void open(const char* file_name)
90  {
91  reset();
92 
93  handle = dlopen(file_name, RTLD_LAZY);
94 
95  if (!handle) {
96  THROW(JLANG::JFileOpenException, dlerror());
97  }
98 
99  initialise();
100  }
101 
102 
103  /**
104  * Close file.
105  *
106  * Note that the file should remain open as long as the library method is used.
107  */
108  void close()
109  {
110  if (handle != NULL) {
111  dlclose(handle);
112  }
113 
114  handle = NULL;
115  }
116 
117 
118  /**
119  * Read function adaptor helper from input stream.
120  *
121  * \param in input stream
122  * \param object function adaptor helper
123  * \return input stream
124  */
125  friend std::istream& operator>>(std::istream& in, JFunctionAdaptorHelper& object)
126  {
127  using namespace std;
128 
129  object.reset();
130 
131  string file_name, function_name;
132 
133  if (in >> file_name >> function_name) {
134 
135  object.open(file_name.c_str());
136 
137  object.get(function_name.c_str());
138  }
139 
140  return in;
141  }
142 
143 
144  /**
145  * Write function adaptor helper to output stream.
146  *
147  * \param out output stream
148  * \param object function adaptor helper
149  * \return output stream
150  */
151  friend std::ostream& operator<<(std::ostream& out, const JFunctionAdaptorHelper& object)
152  {
153  return out;
154  }
155 
156  protected:
157  /**
158  * Default constructor.
159  */
161  handle (NULL),
162  function(NULL)
163  {}
164 
165 
166  /**
167  * Copy constructor.
168  *
169  * \param helper helper
170  */
172  handle (helper.handle),
173  function(helper.function)
174  {
175  attach(helper);
176  }
177 
178 
179  /**
180  * Constructor.
181  *
182  * \param pf pointer to function
183  */
185  handle (NULL),
186  function(pf)
187  {}
188 
189 
190  /**
191  * Constructor.
192  *
193  * \param file_name file name
194  * \param function_name function name
195  */
196  JFunctionAdaptorHelper(const char* file_name,
197  const char* function_name) :
198  handle (NULL),
199  function(NULL)
200  {
201  this->open(file_name);
202 
203  this->get(function_name);
204  }
205 
206 
207  /**
208  * Get function with given name according to specific protocol.
209  *
210  * \param function_name function name
211  */
212  void get(const char* function_name)
213  {
214  function = NULL;
215 
216  if (handle != NULL) {
217 
218  dlerror(); // reset errors
219 
220  function = (pF) dlsym(handle, function_name);
221 
222  const char* error = dlerror();
223 
224  if (error != NULL) {
226  }
227 
228  } else {
229 
230  THROW(JLANG::JFileReadException, "Invalid handle.");
231  }
232  }
233 
234  void* handle;
235  pF function;
236  };
237 
238 
239  /**
240  * Function adaptor.
241  */
242  template<class JReturn_t = void, class JFirst_t = void, class JSecond_t = void>
244 
245 
246  /**
247  * Function adaptor for function with one argument.
248  */
249  template<class JReturn_t, class JFirst_t>
250  struct JFunctionAdaptor<JReturn_t, JFirst_t, void> :
251  public JFunctionAdaptorHelper<JReturn_t (*)(JFirst_t)>
252  {
253  /**
254  * Type definition of method.
255  */
256  typedef JReturn_t (*pF)(JFirst_t);
257 
258 
259  /**
260  * Default constructor.
261  */
264  {}
265 
266 
267  /**
268  * Copy constructor.
269  *
270  * \param adaptor adaptor
271  */
273  JFunctionAdaptorHelper<pF>(adaptor)
274  {}
275 
276 
277  /**
278  * Constructor.
279  *
280  * \param pf pointer to function
281  */
283  JFunctionAdaptorHelper<pF>(pf)
284  {}
285 
286 
287  /**
288  * Constructor.
289  *
290  * \param file_name file name
291  * \param function_name function name
292  */
293  JFunctionAdaptor(const char* file_name,
294  const char* function_name) :
295  JFunctionAdaptorHelper<pF>(file_name, function_name)
296  {}
297 
298 
299  /**
300  * Function operation.
301  *
302  * \param first first argument
303  * \return return value
304  */
305  JReturn_t operator()(JFirst_t first) const
306  {
307  return this->function(first);
308  }
309  };
310 
311 
312  /**
313  * Function adaptor for function with two arguments.
314  */
315  template<class JReturn_t, class JFirst_t, class JSecond_t>
316  struct JFunctionAdaptor :
317  public JFunctionAdaptorHelper<JReturn_t (*)(JFirst_t, JSecond_t)>
318  {
319  /**
320  * Type definition of method.
321  */
322  typedef JReturn_t (*pF)(JFirst_t, JSecond_t);
323 
324 
325  /**
326  * Default constructor.
327  */
330  {}
331 
332 
333  /**
334  * Copy constructor.
335  *
336  * \param adaptor adaptor
337  */
339  JFunctionAdaptorHelper<pF>(adaptor)
340  {}
341 
342 
343  /**
344  * Constructor.
345  *
346  * \param pf pointer to function
347  */
349  JFunctionAdaptorHelper<pF>(pf)
350  {}
351 
352 
353  /**
354  * Constructor.
355  *
356  * \param file_name file name
357  * \param function_name function name
358  */
359  JFunctionAdaptor(const char* file_name,
360  const char* function_name) :
361  JFunctionAdaptorHelper<pF>(file_name, function_name)
362  {}
363 
364 
365  /**
366  * Function operation.
367  *
368  * \param first first argument
369  * \param second second argument
370  * \return return value
371  */
372  JReturn_t operator()(JFirst_t first, JSecond_t second) const
373  {
374  return this->function(first, second);
375  }
376  };
377 }
378 
379 #endif
JException.hh
JLANG::JSharedCounter::detach
bool detach()
Detach.
Definition: JSharedCounter.hh:63
JEEP::JFunctionAdaptorHelper::~JFunctionAdaptorHelper
virtual ~JFunctionAdaptorHelper()
Virtual destructor.
Definition: JFunctionAdaptor.hh:39
JEEP::JFunctionAdaptor::JFunctionAdaptor
JFunctionAdaptor()
Default constructor.
Definition: JFunctionAdaptor.hh:328
JLANG::JFileReadException
Exception for reading of file.
Definition: JException.hh:360
JEEP::JFunctionAdaptorHelper::operator<<
friend std::ostream & operator<<(std::ostream &out, const JFunctionAdaptorHelper &object)
Write function adaptor helper to output stream.
Definition: JFunctionAdaptor.hh:151
JEEP::JFunctionAdaptor::JFunctionAdaptor
JFunctionAdaptor(const JFunctionAdaptor &adaptor)
Copy constructor.
Definition: JFunctionAdaptor.hh:338
JEEP
General puprpose classes and methods.
Definition: JArgs.hh:15
JEEP::JFunctionAdaptorHelper::set
void set(pF pf)
Set function.
Definition: JFunctionAdaptor.hh:76
JEEP::JFunctionAdaptorHelper::is_valid
bool is_valid() const
Check validity.
Definition: JFunctionAdaptor.hh:52
JLANG::JFileOpenException
Exception for opening of file.
Definition: JException.hh:342
JLANG::JSharedCounter
Shared counter.
Definition: JSharedCounter.hh:19
JEEP::JFunctionAdaptorHelper::open
void open(const char *file_name)
Open file.
Definition: JFunctionAdaptor.hh:89
JLANG::JNullType
Auxiliary class for no type definition.
Definition: JNullType.hh:19
JEEP::JFunctionAdaptorHelper::get
void get(const char *function_name)
Get function with given name according to specific protocol.
Definition: JFunctionAdaptor.hh:212
JEEP::JFunctionAdaptorHelper::reset
void reset()
Reset function adaptor helper.
Definition: JFunctionAdaptor.hh:61
JEEP::JFunctionAdaptor::operator()
JReturn_t operator()(JFirst_t first, JSecond_t second) const
Function operation.
Definition: JFunctionAdaptor.hh:372
JEEP::JFunctionAdaptorHelper::JFunctionAdaptorHelper
JFunctionAdaptorHelper(const JFunctionAdaptorHelper &helper)
Copy constructor.
Definition: JFunctionAdaptor.hh:171
JLANG::JSharedCounter::attach
void attach(const JSharedCounter &object)
Attach this counter to given shared counter object.
Definition: JSharedCounter.hh:46
JEEP::JFunctionAdaptor
Function adaptor.
Definition: JFunctionAdaptor.hh:243
JPP
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JAAnetToolkit.hh:37
JEEP::JFunctionAdaptor< JReturn_t, JFirst_t, void >::JFunctionAdaptor
JFunctionAdaptor(const JFunctionAdaptor &adaptor)
Copy constructor.
Definition: JFunctionAdaptor.hh:272
JEEP::JFunctionAdaptor< JReturn_t, JFirst_t, void >::JFunctionAdaptor
JFunctionAdaptor()
Default constructor.
Definition: JFunctionAdaptor.hh:262
JEEP::JFunctionAdaptorHelper::close
void close()
Close file.
Definition: JFunctionAdaptor.hh:108
JEEP::JFunctionAdaptor< JReturn_t, JFirst_t, void >::JFunctionAdaptor
JFunctionAdaptor(const char *file_name, const char *function_name)
Constructor.
Definition: JFunctionAdaptor.hh:293
JEEP::JFunctionAdaptorHelper::JFunctionAdaptorHelper
JFunctionAdaptorHelper(const char *file_name, const char *function_name)
Constructor.
Definition: JFunctionAdaptor.hh:196
THROW
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
Definition: JException.hh:670
JLANG::JSharedCounter::initialise
void initialise()
Initialise counter.
Definition: JSharedCounter.hh:33
JEEP::JFunctionAdaptorHelper::handle
void * handle
Definition: JFunctionAdaptor.hh:234
JSharedCounter.hh
JEEP::JFunctionAdaptor::JFunctionAdaptor
JFunctionAdaptor(const char *file_name, const char *function_name)
Constructor.
Definition: JFunctionAdaptor.hh:359
JEEP::JFunctionAdaptorHelper::operator>>
friend std::istream & operator>>(std::istream &in, JFunctionAdaptorHelper &object)
Read function adaptor helper from input stream.
Definition: JFunctionAdaptor.hh:125
JEEP::JFunctionAdaptorHelper::function
pF function
Definition: JFunctionAdaptor.hh:235
JEEP::JFunctionAdaptor< JReturn_t, JFirst_t, void >::JFunctionAdaptor
JFunctionAdaptor(pF pf)
Constructor.
Definition: JFunctionAdaptor.hh:282
std
Definition: jaanetDictionary.h:36
JNullType.hh
JEEP::JFunctionAdaptor< JReturn_t, JFirst_t, void >::operator()
JReturn_t operator()(JFirst_t first) const
Function operation.
Definition: JFunctionAdaptor.hh:305
JEEP::JFunctionAdaptorHelper::JFunctionAdaptorHelper
JFunctionAdaptorHelper(pF pf)
Constructor.
Definition: JFunctionAdaptor.hh:184
JEEP::JFunctionAdaptorHelper
Auxiliary base class for function adaptor.
Definition: JFunctionAdaptor.hh:33
JEEP::JFunctionAdaptor::JFunctionAdaptor
JFunctionAdaptor(pF pf)
Constructor.
Definition: JFunctionAdaptor.hh:348
JEEP::JFunctionAdaptorHelper::JFunctionAdaptorHelper
JFunctionAdaptorHelper()
Default constructor.
Definition: JFunctionAdaptor.hh:160