00001
00031 #ifndef __adevs_simpledigraph_h_
00032 #define __adevs_simpledigraph_h_
00033 #include "adevs.h"
00034 #include <map>
00035 #include <set>
00036 #include <cstdlib>
00037
00038 namespace adevs
00039 {
00040
00046 template <class VALUE, class T = double> class SimpleDigraph:
00047 public Network<VALUE,T>
00048 {
00049 public:
00051 typedef Devs<VALUE,T> Component;
00052
00054 SimpleDigraph():
00055 Network<VALUE,T>()
00056 {
00057 }
00059 void add(Component* model);
00061 void couple(Component* src, Component* dst);
00063 void getComponents(Set<Component*>& c);
00065 void route(const VALUE& x, Component* model,
00066 Bag<Event<VALUE,T> >& r);
00068 ~SimpleDigraph();
00069
00070 private:
00071
00072 Set<Component*> models;
00073
00074 std::map<Component*,Bag<Component*> > graph;
00075 };
00076
00077 template <class VALUE, class T>
00078 void SimpleDigraph<VALUE,T>::add(Component* model)
00079 {
00080 assert(model != this);
00081 models.insert(model);
00082 model->setParent(this);
00083 }
00084
00085 template <class VALUE, class T>
00086 void SimpleDigraph<VALUE,T>::couple(Component* src, Component* dst)
00087 {
00088 if (src != this) add(src);
00089 if (dst != this) add(dst);
00090 graph[src].insert(dst);
00091 }
00092
00093 template <class VALUE, class T>
00094 void SimpleDigraph<VALUE,T>::getComponents(Set<Component*>& c)
00095 {
00096 c = models;
00097 }
00098
00099 template <class VALUE, class T>
00100 void SimpleDigraph<VALUE,T>::
00101 route(const VALUE& x, Component* model,
00102 Bag<Event<VALUE,T> >& r)
00103 {
00104
00105 typename std::map<Component*,Bag<Component*> >::iterator graph_iter;
00106 graph_iter = graph.find(model);
00107
00108 if (graph_iter == graph.end()) return;
00109
00110 Event<VALUE,T> event;
00111 typename Bag<Component*>::iterator node_iter;
00112 for (node_iter = (*graph_iter).second.begin();
00113 node_iter != (*graph_iter).second.end(); node_iter++)
00114 {
00115 event.model = *node_iter;
00116 event.value = x;
00117 r.insert(event);
00118 }
00119 }
00120
00121 template <class VALUE, class T>
00122 SimpleDigraph<VALUE,T>::~SimpleDigraph()
00123 {
00124 typename Set<Component*>::iterator i;
00125 for (i = models.begin(); i != models.end(); i++)
00126 {
00127 delete *i;
00128 }
00129 }
00130
00131 }
00132
00133 #endif