ctopo.h

00001 //==========================================================================
00002 //  CTOPO.H - part of
00003 //                     OMNeT++/OMNEST
00004 //            Discrete System Simulation in C++
00005 //
00006 //
00007 //  Declaration of the following classes:
00008 //     cTopology : network topology to find shortest paths etc.
00009 //
00010 //==========================================================================
00011 
00012 /*--------------------------------------------------------------*
00013   Copyright (C) 1992-2005 Andras Varga
00014 
00015   This file is distributed WITHOUT ANY WARRANTY. See the file
00016   `license' for details on this and other legal matters.
00017 *--------------------------------------------------------------*/
00018 
00019 #ifndef __CTOPO_H
00020 #define __CTOPO_H
00021 
00022 #ifdef _MSC_VER
00023 // disable "identifier was truncated to '255' characters in the debug information" warnings
00024 #pragma warning(disable:4786)
00025 #endif
00026 
00027 #include <string>
00028 #include <vector>
00029 #include "cobject.h"
00030 
00031 class cPar;
00032 
00033 #ifndef INFINITY
00034 #define INFINITY  HUGE_VAL
00035 #endif
00036 
00037 
00059 class SIM_API cTopology : public cObject
00060 {
00061   public:
00062     class Link;
00063     class LinkIn;
00064     class LinkOut;
00065 
00069     class SIM_API Node
00070     {
00071         friend class cTopology;
00072 
00073       private:
00074         int module_id;
00075         double wgt;
00076         bool enabl;
00077 
00078         int num_in_links;
00079         Link **in_links;
00080         int num_out_links;
00081         Link *out_links;
00082 
00083         // variables used by the shortest-path algorithms
00084         bool known;
00085         double dist;
00086         Link *out_path;
00087 
00088       public:
00091 
00095         int moduleId() const         {return module_id;}
00096 
00100         cModule *module() const           {return &simulation[module_id];}
00101 
00106         double weight() const        {return wgt;}
00107 
00112         void setWeight(double d)    {wgt=d;}
00113 
00118         bool enabled() const         {return enabl;}
00119 
00124         void enable()               {enabl=true;}
00125 
00130         void disable()              {enabl=false;}
00132 
00135 
00139         int inLinks() const          {return num_in_links;}
00140 
00144         LinkIn *in(int i);
00145 
00149         int outLinks() const         {return num_out_links;}
00150 
00154         LinkOut *out(int i);
00156 
00159 
00163         double distanceToTarget() const   {return dist;}
00164 
00169         int paths() const                 {return out_path?1:0;}
00170 
00176         LinkOut *path(int) const     {return (LinkOut *)out_path;}
00178     };
00179 
00180 
00184     class SIM_API Link
00185     {
00186         friend class cTopology;
00187 
00188       protected:
00189         Node *src_node;
00190         int src_gate;
00191         Node *dest_node;
00192         int dest_gate;
00193         double wgt;
00194         bool enabl;
00195 
00196       public:
00201         double weight() const        {return wgt;}
00202 
00207         void setWeight(double d)    {wgt=d;}
00208 
00213         bool enabled() const         {return enabl;}
00214 
00219         void enable()               {enabl=true;}
00220 
00225         void disable()              {enabl=false;}
00226     };
00227 
00228 
00237     class SIM_API LinkIn : public Link
00238     {
00239       public:
00247         Node *remoteNode() const  {return src_node;}
00248 
00252         int remoteGateId() const  {return src_gate;}
00253 
00257         int localGateId() const   {return dest_gate;}
00258 
00262         cGate *remoteGate() const      {return src_node->module()->gate(src_gate);}
00263 
00267         cGate *localGate() const       {return dest_node->module()->gate(dest_gate);}
00268     };
00269 
00270 
00279     class SIM_API LinkOut : public Link
00280     {
00281       public:
00289         Node *remoteNode() const  {return dest_node;}
00290 
00294         int remoteGateId() const  {return dest_gate;}
00295 
00299         int localGateId() const   {return src_gate;}
00300 
00304         cGate *remoteGate() const      {return dest_node->module()->gate(dest_gate);}
00305 
00309         cGate *localGate() const       {return src_node->module()->gate(src_gate);}
00310     };
00311 
00312 
00313   protected:
00314     int num_nodes;
00315     Node *nodev;
00316     Node *target;
00317 
00318   public:
00321 
00325     explicit cTopology(const char *name=NULL);
00326 
00330     cTopology(const cTopology& topo);
00331 
00335     virtual ~cTopology();
00336 
00340     cTopology& operator=(const cTopology& topo);
00342 
00345 
00350     virtual cPolymorphic *dup() const     {return new cTopology(*this);}
00351 
00356     virtual std::string info() const;
00357 
00363     virtual void netPack(cCommBuffer *buffer);
00364 
00370     virtual void netUnpack(cCommBuffer *buffer);
00372 
00381 
00388     void extractFromNetwork(int (*selfunc)(cModule *,void *), void *userdata=NULL);
00389 
00401     void extractByModuleType(const char *type1,...);
00402 
00409     void extractByModuleType(const char **types);
00410 
00416     void extractByModuleType(const std::vector<std::string> types);
00417 
00423     void extractByParameter(const char *parname, cPar *value=NULL);
00424 
00428     void clear();
00430 
00437 
00441     int nodes() const  {return num_nodes;}
00442 
00447     Node *node(int i);
00448 
00456     Node *nodeFor(cModule *mod);
00458 
00460     /*
00461      * To be implemented:
00462      *    -  void unweightedMultiShortestPathsTo(Node *target);
00463      *    -  void weightedSingleShortestPathsTo(Node *target);
00464      *    -  void weightedMultiShortestPathsTo(Node *target);
00465      */
00467 
00472     void unweightedSingleShortestPathsTo(Node *target);
00473 
00478     Node *targetNode() const {return target;}
00480 };
00481 
00482 #endif

Generated on Sat Oct 21 17:47:56 2006 for OMNeT++/OMNEST Simulation Library by  doxygen 1.4.6