00001 #ifndef ERIS_DISPATCH_H
00002 #define ERIS_DISPATCH_H
00003
00004 #include <string>
00005 #include <map>
00006 #include <deque>
00007 #include <list>
00008
00009 namespace Atlas { namespace Message { class Element; } }
00010
00011 namespace Eris {
00012
00013 class StdBranchDispatcher;
00014 class ClassDispatcher;
00015
00016
00017 typedef std::deque<Atlas::Message::Element> DispatchContextDeque;
00018
00020
00024 class Dispatcher
00025 {
00026 public:
00027 explicit Dispatcher(const std::string &nm);
00028 virtual ~Dispatcher();
00029
00030 virtual Dispatcher* addSubdispatch(Dispatcher *sub, const std::string data = std::string()) = 0;
00031 virtual void rmvSubdispatch(Dispatcher *sub) = 0;
00032
00034 virtual Dispatcher* getSubdispatch(const std::string &nm) = 0;
00035
00037 virtual bool dispatch(DispatchContextDeque &dq) = 0;
00038
00039 virtual bool empty() = 0;
00040
00041 const std::string& getName() const
00042 { return _name; }
00043
00044 virtual const std::string& getData() const
00045 { return _name; }
00046
00047 static std::string getAnonymousSuffix(Dispatcher *d);
00048
00049 static void enter();
00050 static void exit();
00051 protected:
00052 friend class StdBranchDispatcher;
00053 friend class ClassDispatcher;
00054
00055 virtual void purge() = 0;
00056
00057 const std::string _name;
00058 public:
00059 void addRef()
00060 {++_refcount;}
00061
00062 void decRef()
00063 {if (!(--_refcount)) delete this; }
00064 private:
00065 unsigned int _refcount;
00066
00067 static bool global_inDispatch;
00068 static std::list<Dispatcher*> global_needsPurging;
00069 };
00070
00073 class LeafDispatcher : public Dispatcher
00074 {
00075 public:
00076 explicit LeafDispatcher(const std::string &nm);
00077 virtual ~LeafDispatcher() {;}
00078
00079 virtual bool dispatch(DispatchContextDeque &dq);
00080
00081 virtual Dispatcher* addSubdispatch(Dispatcher*, const std::string);
00082
00083 virtual void rmvSubdispatch(Dispatcher*);
00084
00085 virtual Dispatcher* getSubdispatch(const std::string &nm);
00086
00087 virtual bool empty();
00088
00089 protected:
00090 virtual void purge();
00091 };
00092
00093 class StdBranchDispatcher: public Dispatcher
00094 {
00095 public:
00096 explicit StdBranchDispatcher(const std::string nm = "__branch");
00097 virtual ~StdBranchDispatcher();
00098
00099 virtual bool dispatch(DispatchContextDeque &dq)
00100 { return subdispatch(dq); }
00101
00102 virtual Dispatcher* addSubdispatch(Dispatcher *sub, const std::string data);
00103 virtual void rmvSubdispatch(Dispatcher *sub);
00104 virtual Dispatcher* getSubdispatch(const std::string &nm);
00105
00106 virtual bool empty()
00107 { return _subs.empty(); }
00108 protected:
00109 typedef std::map<std::string, Dispatcher*> DispatcherDict;
00110
00112 bool subdispatch(DispatchContextDeque &dq);
00113 void safeSubErase(const DispatcherDict::iterator &d);
00114
00115 virtual void purge();
00116
00117 DispatcherDict _subs;
00118 };
00119
00120 }
00121
00122 #endif