00001
#ifndef ERIS_SIGNAL_DISPATCH_H
00002
#define ERIS_SIGNAL_DISPATCH_H
00003
00004
#include <Eris/Dispatcher.h>
00005
00006
#include <Atlas/Message/Element.h>
00007
00008
#include <sigc++/object.h>
00009
#include <sigc++/signal.h>
00010
00011
namespace Eris {
00012
00013
template <
class T>
00014
class SignalDispatcher :
00015
public LeafDispatcher,
00016
virtual public SigC::Object
00017 {
00018
public:
00019 SignalDispatcher(
const std::string &nm,
const SigC::Slot1<void, const T& > &slot) :
00020 LeafDispatcher(nm)
00021 { Signal.connect(slot); }
00022
00023
virtual ~SignalDispatcher() {;}
00024
00026
virtual bool dispatch(DispatchContextDeque &dq)
00027 {
00028 T object;
00029 Atlas::Message::Element::MapType::const_iterator I = dq.front().asMap().begin();
00030
00031
for (; I != dq.front().asMap().end(); ++I)
00032 object.setAttr(I->first, I->second);
00033 Signal.emit(object);
00034
00035
return LeafDispatcher::dispatch(dq);
00036 }
00037
00039 SigC::Signal1<void, const T&> Signal;
00040
protected:
00041
00042 };
00043
00044
class SignalDispatcher0 :
00045
public LeafDispatcher,
00046
virtual public SigC::Object
00047 {
00048
public:
00049 SignalDispatcher0(
const std::string &nm,
const SigC::Slot0<void> &slot) :
00050 LeafDispatcher(nm)
00051 { Signal.connect(slot); }
00052
00053
virtual ~SignalDispatcher0() {;}
00054
00056
virtual bool dispatch(DispatchContextDeque &dq)
00057 {
00058 Signal.emit();
00059
return LeafDispatcher::dispatch(dq);
00060 }
00061
00063 SigC::Signal0<void> Signal;
00064
protected:
00065
00066 };
00067
00068
template <
class T,
class S>
00069
class SignalDispatcher2 :
00070
public LeafDispatcher,
00071
virtual public SigC::Object
00072 {
00073
public:
00074 SignalDispatcher2(
const std::string &nm,
00075
const SigC::Slot2<void, const T&, const S& > &slot) :
00076 LeafDispatcher(nm)
00077 { Signal.connect(slot); }
00078
00079
virtual ~SignalDispatcher2() {;}
00080
00082
virtual bool dispatch(DispatchContextDeque &dq)
00083 {
00084 DispatchContextDeque::iterator Q = dq.begin();
00085
00086 S object;
00087 Atlas::Message::Element::MapType::const_iterator I = Q->asMap().begin();
00088
00089
for (; I != Q->asMap().end(); ++I)
00090 object.setAttr(I->first, I->second);
00091 ++Q;
00092 T parent;
00093 I = Q->asMap().begin();
00094
for (; I != Q->asMap().end(); ++I)
00095 parent.setAttr(I->first, I->second);
00096
00097 Signal.emit(parent, object);
00098
return LeafDispatcher::dispatch(dq);
00099 }
00100
00104 SigC::Signal2<void, const T&, const S&> Signal;
00105 };
00106
00107
template <
class U,
class T,
class S >
00108
class SignalDispatcher3 :
00109
public LeafDispatcher,
00110
virtual public SigC::Object
00111 {
00112
public:
00113 SignalDispatcher3(
const std::string &nm,
00114
const SigC::Slot3<void,const U&, const T&, const S&> &slot) :
00115 LeafDispatcher(nm)
00116 { Signal.connect(slot); }
00117
00118
virtual ~SignalDispatcher3() {;}
00119
00121
virtual bool dispatch(DispatchContextDeque &dq)
00122 {
00123 DispatchContextDeque::iterator Q = dq.begin();
00124
00125 S object;
00126 Atlas::Message::Element::MapType::const_iterator I = Q->asMap().begin();
00127
00128
for (; I != Q->asMap().end(); ++I)
00129 object.setAttr(I->first, I->second);
00130 ++Q;
00131 T parent;
00132 I = Q->asMap().begin();
00133
for (; I != Q->asMap().end(); ++I)
00134 parent.setAttr(I->first, I->second);
00135
00136 ++Q;
00137 U grandparent;
00138 I = Q->asMap().begin();
00139
for (; I != Q->asMap().end(); ++I)
00140 grandparent.setAttr(I->first, I->second);
00141
00142 Signal.emit(grandparent, parent, object);
00143
return LeafDispatcher::dispatch(dq);
00144 }
00145
00149 SigC::Signal3<void, const U&, const T&, const S&> Signal;
00150 };
00151
00155 class MessageDispatcher :
00156
public Dispatcher,
00157
virtual public SigC::Object
00158 {
00159
public:
00163 MessageDispatcher(
const std::string &nm,
const SigC::Slot1<void, const Atlas::Message::Element&> &slot) :
00164
Dispatcher(nm)
00165 { Signal.connect(slot); }
00166
00167
virtual ~
MessageDispatcher() {;}
00168
00169 virtual bool dispatch(DispatchContextDeque &dq)
00170 {
00171 Signal.emit(dq.front());
00172
return false;
00173 }
00174
protected:
00175 SigC::Signal1<void, const Atlas::Message::Element&> Signal;
00176 };
00177
00178
00179 }
00180
00181
#endif