Remove dynamic exceptions
[anna.git] / include / anna / diameter.comm / ReceiverFactoryImpl.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_diameter_comm_ReceiverFactoryImpl_hpp
10 #define anna_diameter_comm_ReceiverFactoryImpl_hpp
11
12 #include <anna/comm/Receiver.hpp>
13 #include <anna/comm/ReceiverFactory.hpp>
14 #include <anna/core/util/Recycler.hpp>
15
16
17 namespace anna {
18
19 namespace diameter {
20
21 namespace comm {
22
23 class R;
24
25 /**
26    Default implementation for receivers factory specific for diameter
27
28    \param R Reference data member (client session or server session)
29    \param T Receiver class instantiated by this factory. Must define empty constructor, #setReference setter and
30    a #className method returning class name as:
31
32    \code
33       static const char* className () ;
34    \encode
35 */
36 template <typename R, typename T> class ReceiverFactoryImpl : public anna::comm::ReceiverFactory {
37 public:
38   /**
39      Constructor.
40   */
41   ReceiverFactoryImpl(R *reference) : anna::comm::ReceiverFactory(T::className()), a_reference(reference) {;}
42
43 private:
44   R *a_reference;
45   anna::Recycler<T> a_receivers;
46
47   anna::comm::Receiver* do_create() {
48     T *result = a_receivers.create();
49     result->setReference(a_reference);
50     return result;
51   }
52
53   void do_release(anna::comm::Receiver* receiver) { a_receivers.release(static_cast <T*>(receiver)); }
54 };
55
56 }
57 }
58 }
59
60 #endif
61