00001
00031 #ifndef __adevs_digraph_h_
00032 #define __adevs_digraph_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 PORT=int> class PortValue
00047 {
00048 public:
00050 PortValue():
00051 port(),
00052 value()
00053 {
00054 }
00056 PortValue(const PortValue& src):
00057 port(src.port),
00058 value(src.value)
00059 {
00060 }
00062 PortValue(PORT port, const VALUE& value):
00063 port(port),
00064 value(value)
00065 {
00066 }
00068 const PortValue<VALUE,PORT>& operator=(const PortValue<VALUE,PORT>& src)
00069 {
00070 port = src.port;
00071 value = src.value;
00072 return *this;
00073 }
00075 ~PortValue()
00076 {
00077 }
00079 PORT port;
00081 VALUE value;
00082 };
00083
00088 template <class VALUE, class PORT=int, class T = double> class Digraph:
00089 public Network<PortValue<VALUE,PORT>,T>
00090 {
00091 public:
00093 typedef PortValue<VALUE,PORT> IO_Type;
00095 typedef Devs<IO_Type,T> Component;
00096
00098 Digraph():
00099 Network<IO_Type,T>()
00100 {
00101 }
00103 void add(Component* model);
00105 void couple(Component* src, PORT srcPort,
00106 Component* dst, PORT dstPort);
00108 void getComponents(Set<Component*>& c);
00110 void route(const IO_Type& x, Component* model,
00111 Bag<Event<IO_Type,T> >& r);
00113 ~Digraph();
00114
00115 private:
00116
00117 struct node
00118 {
00119 node():
00120 model(NULL),
00121 port()
00122 {
00123 }
00124 node(Component* model, PORT port):
00125 model(model),
00126 port(port)
00127 {
00128 }
00129 const node& operator=(const node& src)
00130 {
00131 model = src.model;
00132 port = src.port;
00133 return *this;
00134 }
00135 Component* model;
00136 PORT port;
00137
00138
00139 bool operator<(const node& other) const
00140 {
00141 if (model == other.model) return port < other.port;
00142 return model < other.model;
00143 }
00144 };
00145
00146 Set<Component*> models;
00147
00148 std::map<node,Bag<node> > graph;
00149 };
00150
00151 template <class VALUE, class PORT, class T>
00152 void Digraph<VALUE,PORT,T>::add(Component* model)
00153 {
00154 assert(model != this);
00155 models.insert(model);
00156 model->setParent(this);
00157 }
00158
00159 template <class VALUE, class PORT, class T>
00160 void Digraph<VALUE,PORT,T>::couple(Component* src, PORT srcPort,
00161 Component* dst, PORT dstPort)
00162 {
00163 if (src != this) add(src);
00164 if (dst != this) add(dst);
00165 node src_node(src,srcPort);
00166 node dst_node(dst,dstPort);
00167 graph[src_node].insert(dst_node);
00168 }
00169
00170 template <class VALUE, class PORT, class T>
00171 void Digraph<VALUE,PORT,T>::getComponents(Set<Component*>& c)
00172 {
00173 c = models;
00174 }
00175
00176 template <class VALUE, class PORT, class T>
00177 void Digraph<VALUE,PORT,T>::
00178 route(const IO_Type& x, Component* model,
00179 Bag<Event<IO_Type,T> >& r)
00180 {
00181
00182 node src_node(model,x.port);
00183 typename std::map<node,Bag<node> >::iterator graph_iter;
00184 graph_iter = graph.find(src_node);
00185
00186 if (graph_iter == graph.end()) return;
00187
00188 Event<IO_Type,T> event;
00189 typename Bag<node>::iterator node_iter;
00190 for (node_iter = (*graph_iter).second.begin();
00191 node_iter != (*graph_iter).second.end(); node_iter++)
00192 {
00193 event.model = (*node_iter).model;
00194 event.value.port = (*node_iter).port;
00195 event.value.value = x.value;
00196 r.insert(event);
00197 }
00198 }
00199 template <class VALUE, class PORT, class T>
00200 Digraph<VALUE,PORT,T>::~Digraph()
00201 {
00202 typename Set<Component*>::iterator i;
00203 for (i = models.begin(); i != models.end(); i++)
00204 {
00205 delete *i;
00206 }
00207 }
00208
00209 }
00210
00211 #endif