00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef SST_EVENTFUNCTOR_H
00014 #define SST_EVENTFUNCTOR_H
00015
00016 #include <sst/core/debug.h>
00017 #include <sst/core/sst.h>
00018
00019 namespace SST {
00020
00021 class Event;
00022
00023
00024 template <typename ReturnT, typename Param1T>
00025 class EventHandlerBase
00026 {
00027 public:
00028 friend class boost::serialization::access;
00029 template<class Archive>
00030 void serialize(Archive & ar, const unsigned int version )
00031 {
00032 _AR_DBG(EventHandlerBase,"\n");
00033 }
00034
00035 virtual ReturnT operator()(Param1T) = 0;
00036 virtual ~EventHandlerBase() {
00037 }
00038 };
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 template <typename ConsumerT, typename ReturnT,typename Param1T>
00052 class EventHandler: public EventHandlerBase<ReturnT,Param1T>
00053 {
00054 private:
00055 typedef ReturnT (ConsumerT::*PtrMember)(Param1T);
00056
00057 public:
00058
00059
00060
00061
00062
00063
00064 EventHandler( ConsumerT* const object, PtrMember member) :
00065 object(object), member(member) {
00066 }
00067
00068
00069 EventHandler( const EventHandler<ConsumerT,ReturnT,Param1T>& e ) :
00070 object(e.object), member(e.member) {
00071 }
00072
00073
00074
00075
00076 virtual ReturnT operator()(Param1T param1) {
00077 return (const_cast<ConsumerT*>(object)->*member)(param1);
00078 }
00079
00080 protected:
00081 EventHandler() :
00082 object(NULL), member(NULL)
00083 { }
00084
00085 private:
00086
00087
00088 ConsumerT* const object;
00089 const PtrMember member;
00090
00091 friend class boost::serialization::access;
00092 template<class Archive>
00093 void serialize(Archive & ar, const unsigned int version )
00094 {
00095 _AR_DBG(EventHandler,"start\n");
00096 typedef EventHandler<ConsumerT,ReturnT,Param1T> tmp1;
00097 typedef EventHandlerBase<ReturnT,Param1T> tmp2;
00098 boost::serialization::
00099 void_cast_register(static_cast<tmp1*>(NULL),
00100 static_cast<tmp2*>(NULL));
00101 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(tmp2);
00102 _AR_DBG(EventHandler,"done\n");
00103 }
00104
00105 typedef struct {
00106 uint64_t data[2];
00107 } member_t;
00108
00109 template<class Archive>
00110 friend void save_construct_data
00111 (Archive & ar, const EventHandler<ConsumerT,ReturnT,Param1T> * t,
00112 const unsigned int file_version)
00113 {
00114 ConsumerT* object = t->object;
00115 PtrMember tmp = t->member;
00116
00117 member_t *member_ptr = reinterpret_cast<member_t*>(&tmp);
00118 uint64_t member0 = member_ptr->data[0];
00119 uint64_t member1 = member_ptr->data[1];
00120
00121 _AR_DBG(EventHandler,"object=%p member=%#lx %#lx\n",
00122 object,
00123 (unsigned long) member1,
00124 (unsigned long) member0);
00125
00126 ar << BOOST_SERIALIZATION_NVP( object );
00127 ar << BOOST_SERIALIZATION_NVP( member0 );
00128 ar << BOOST_SERIALIZATION_NVP( member1 );
00129 }
00130
00131 template<class Archive>
00132 friend void load_construct_data
00133 (Archive & ar, EventHandler<ConsumerT,ReturnT,Param1T> * t,
00134 const unsigned int file_version)
00135 {
00136 _AR_DBG(EventHandler,"\n");
00137 ConsumerT* object;
00138 member_t member;
00139 uint64_t member0;
00140 uint64_t member1;
00141
00142 ar >> BOOST_SERIALIZATION_NVP( object );
00143 ar >> BOOST_SERIALIZATION_NVP( member0 );
00144 ar >> BOOST_SERIALIZATION_NVP( member1 );
00145
00146 member.data[0] = member0;
00147 member.data[1] = member1;
00148
00149 _AR_DBG(EventHandler,"object=%p member=%#lx %#lx\n",
00150 object,
00151 (unsigned long) member1,
00152 (unsigned long) member0);
00153
00154 PtrMember* tmp_ptr;
00155 tmp_ptr = reinterpret_cast<PtrMember*>(&member);
00156
00157 ::new(t)EventHandler<ConsumerT,ReturnT,Param1T>
00158 (object,*tmp_ptr );
00159 }
00160 };
00161
00162 typedef EventHandlerBase<bool,Event*> EventHandler_t;
00163
00164
00165 }
00166
00167 #endif