Main Page | Modules | Class Hierarchy | Class List | File List | Class Members | Related Pages

cmodule.h

00001 //==========================================================================
00002 //   CMODULE.H  -  header for
00003 //                     OMNeT++/OMNEST
00004 //            Discrete System Simulation in C++
00005 //
00006 //
00007 //  Declaration of the following classes:
00008 //    cModule        : common base for cCompoundModule and cSimpleModule
00009 //    cCompoundModule: compound module
00010 //
00011 //==========================================================================
00012 
00013 /*--------------------------------------------------------------*
00014   Copyright (C) 1992-2005 Andras Varga
00015 
00016   This file is distributed WITHOUT ANY WARRANTY. See the file
00017   `license' for details on this and other legal matters.
00018 *--------------------------------------------------------------*/
00019 
00020 #ifndef __CMODULE_H
00021 #define __CMODULE_H
00022 
00023 #include "defs.h"
00024 
00025 #include <time.h>     // time_t, clock_t in cSimulation
00026 #include "cobject.h"
00027 #include "ccoroutine.h"
00028 #include "globals.h"
00029 #include "carray.h"
00030 #include "cqueue.h"
00031 #include "cgate.h"
00032 #include "csimul.h"
00033 #include "cdefaultlist.h"
00034 
00035 //=== module state codes
00036 enum {
00037        sENDED,    // module terminated
00038        sREADY     // module is active
00039 };
00040 
00041 //=== display string selector (DEPRECATED)
00042 enum {
00043        dispSUBMOD=0,        // display string: "as submodule"
00044        dispENCLOSINGMOD=1,  // display string: "as enclosing module"
00045        dispNUMTYPES         // this one must always be the last element
00046 };
00047 
00048 //=== classes mentioned/declared here:
00049 class  cMessage;
00050 class  cGate;
00051 class  cModulePar;
00052 class  cModule;
00053 class  cCompoundModule;
00054 class  cSimulation;
00055 class  cModuleType;
00056 
00057 
00063 
00069 SIM_API void connect(cModule *frm, int frg,
00070                      cChannelType *linkp,
00071                      cModule *tom, int tog);
00072 
00078 SIM_API void connect(cModule *frm, int frg,
00079                      cPar *delayp, cPar *errorp, cPar *dataratep,
00080                      cModule *tom, int tog);
00082 
00091 typedef void (*DisplayStringNotifyFunc)(cModule*,bool,void*);
00092 
00093 //==========================================================================
00094 
00106 class SIM_API cModule : public cDefaultList
00107 {
00108     friend class cGate;
00109     friend class cSimulation;
00110     friend class cModuleType;
00111     friend class cSubModIterator;
00112 
00113   public:
00114     static bool pause_in_sendmsg; // if true, split send() with transferToMain()
00115     static std::string lastmodulefullpath; // cached result of last fullPath() call
00116     static const cModule *lastmodulefullpathmod; // module of lastmodulefullpath
00117 
00118   protected:
00119     mutable char *fullname; // buffer to store full name of object
00120     cModuleType *mod_type;  // type of this module
00121     int mod_id;             // id (subscript into cSimulation)
00122 
00123     // Note: parent module is stored in ownerp -- a module is always owned by its parent
00124     // module. If ownerp cannot be cast to a cModule, the module has no parent module
00125     // (e.g. the system module which is owned by the global object 'simulation').
00126     cModule *prevp, *nextp; // pointers to sibling submodules
00127     cModule *firstsubmodp;  // pointer to first submodule
00128     cModule *lastsubmodp;   // pointer to last submodule (needed for efficient append operation)
00129 
00130   public:
00131     // The following members are only made public for use by the inspector
00132     // classes. Do not use them directly from simple modules.
00133     cArray gatev;           // vector of gates
00134     cArray paramv;          // vector of parameters
00135 
00136   protected:
00137     int  idx;               // index if module vector, 0 otherwise
00138     int  vectsize;          // vector size, -1 if not a vector
00139 
00140     cDisplayString *dispstr;   // display string as submodule (icon, etc)
00141     cDisplayString *bgdispstr; // display string when enclosing module (background color, etc)
00142 
00143     bool ev_enabled;        // in Cmdenv this tells if ev<< output if printed for this module
00144 
00145     short rngmapsize;       // size of rngmap array (RNGs>=rngmapsize are mapped one-to-one to physical RNGs)
00146     int *rngmap;            // maps local RNG numbers (may be NULL if rngmapsize==0)
00147 
00148   public:
00149     // internal: used from Tkenv: find out if cGate has a display string.
00150     // displayString() would create the object immediately which we want to avoid.
00151     bool hasDisplayString() {return dispstr!=NULL;}
00152     bool hasBackgroundDisplayString() {return bgdispstr!=NULL;}
00153 
00154     // internal: currently used by Cmdenv
00155     void setEvEnabled(bool e)  {ev_enabled = e;}
00156     bool isEvEnabled() {return ev_enabled;}
00157 
00158     // internal: invoked from within cEnvir::getRNGMappingFor(mod)
00159     void setRNGMap(short size, int *map) {rngmapsize=size; rngmap=map;}
00160 
00161   protected:
00162     // internal: called when a message arrives at a gate which is no further
00163     // connected (that is, toGate() is NULL)
00164     virtual void arrived(cMessage *msg,int n,simtime_t t) = 0;
00165 
00166     // internal: sets the module ID. Called as part of the module creation process.
00167     virtual void setId(int n);
00168 
00169     // internal: sets module index within vector (if module is part of
00170     // a module vector). Called as part of the module creation process.
00171     virtual void setIndex(int i, int n);
00172 
00173     // internal: sets associated cModuleType for the module. Called as part of
00174     // the module creation process.
00175     virtual void setModuleType(cModuleType *mtype);
00176 
00177     // internal: inserts a submodule. Called as part of the module creation process.
00178     void insertSubmodule(cModule *mod);
00179 
00180     // internal: removes a submodule
00181     void removeSubmodule(cModule *mod);
00182 
00183     // internal: "virtual ctor" for cGate, because in cPlaceHolderModule
00184     // we'll need different gate objects
00185     virtual cGate *createGateObject(const char *gname, char tp);
00186 
00187   protected:
00210 
00221     virtual void doBuildInside() {}
00222 
00227     virtual void initialize(int stage) {if(stage==0) initialize();}
00228 
00234     virtual int  numInitStages() const  {return 1;}
00235 
00240     virtual void initialize();
00241 
00246     virtual void finish();
00248 
00249   public:
00252 
00256     cModule(const cModule& mod);
00257 
00265     cModule(const char *name, cModule *parentmod);
00266 
00270     virtual ~cModule();
00271 
00276     cModule& operator=(const cModule& mod);
00278 
00281 
00282     /* No dup() because this is an abstract class. */
00283 
00288     virtual void forEachChild(cVisitor *v);
00289 
00293     virtual void setName(const char *s);
00294 
00300     virtual const char *fullName() const;
00301 
00305     virtual std::string fullPath() const;
00306 
00312     virtual const char *fullPath(char *buffer, int bufsize) const;
00314 
00317 
00322     cGate *addGate(const char *s, char tp, bool isvector=false);
00323 
00339     int setGateSize(const char *s, int size);
00340 
00344     cPar *addPar(const char *s);
00345 
00367     virtual int buildInside();
00369 
00372 
00377     virtual bool isSimple() const;
00378 
00382     cModuleType *moduleType() const  {return mod_type;}
00383 
00391     int id() const  {return mod_id;}
00392 
00397     cModule *parentModule() const  {return dynamic_cast<cModule *>(owner());}
00398 
00402     bool isVector() const  {return vectsize>=0;}
00403 
00407     int index() const  {return idx;}
00408 
00413     int size() const  {return vectsize<0?1:vectsize;}
00414 
00420     cRNG *rng(int k) const  {return ev.rng(k<rngmapsize ? rngmap[k] : k);}
00422 
00425 
00431     int findSubmodule(const char *submodname, int idx=-1);
00432 
00438     cModule *submodule(const char *submodname, int idx=-1);
00439 
00446     cModule *moduleByRelativePath(const char *path);
00448 
00451 
00456     int gates() const {return gatev.items();}
00457 
00463     cGate *gate(int g) {return (cGate*)gatev[g];}
00464 
00470     const cGate *gate(int g) const {return (const cGate*)gatev[g];}
00471 
00476     cGate *gate(const char *gatename,int sn=-1);
00477 
00481     const cGate *gate(const char *gatename,int sn=-1) const;
00482 
00491     int gateSize(const char *gatename) const;
00492 
00497     int findGate(const char *gatename, int sn=-1) const;
00498 
00502     bool hasGate(const char *gatename, int sn=-1) const {return findGate(gatename,sn)>=0;}
00503 
00510     bool checkInternalConnections() const;
00512 
00515 
00519     int params() const {return paramv.items();}
00520 
00525     cPar& par(int p);
00526 
00531     cPar& par(const char *parname);
00532 
00537     int findPar(const char *parname) const;
00538 
00543     cPar& ancestorPar(const char *parname);
00544 
00548     bool hasPar(const char *s) const {return findPar(s)>=0;}
00550 
00556 
00561     virtual void callInitialize();
00562 
00567     virtual bool callInitialize(int stage);
00568 
00572     virtual void callFinish();
00574 
00577 
00584     virtual void scheduleStart(simtime_t t) = 0;
00585 
00591     virtual void deleteModule();
00592 
00614     virtual void changeParentTo(cModule *mod);
00616 
00619 
00624     cDisplayString& displayString();
00625 
00630     cDisplayString& backgroundDisplayString();
00631 
00635     void setDisplayString(const char *dispstr, bool immediate=true);
00636 
00640     void setBackgroundDisplayString(const char *dispstr, bool immediate=true);
00641 
00646     const char *displayString(int type);
00647 
00652     void setDisplayString(int type, const char *dispstr, bool immediate=true);
00653 
00658     void bubble(const char *text);
00660 };
00661 
00662 //==========================================================================
00663 
00671 class SIM_API cCompoundModule : public cModule
00672 {
00673     friend class TCompoundModInspector;
00674 
00675   protected:
00676     // internal use
00677     virtual void arrived(cMessage *msg,int n,simtime_t t);
00678 
00679   public:
00682 
00686     cCompoundModule(const cCompoundModule& mod);
00687 
00692     cCompoundModule(const char *name, cModule *parentmod);
00693 
00697     virtual ~cCompoundModule();
00698 
00702     cCompoundModule& operator=(const cCompoundModule& mod);
00704 
00707 
00712     virtual cObject *dup() const   {return new cCompoundModule(*this);}
00713 
00718     virtual std::string info() const;
00720 
00723 
00728     virtual void scheduleStart(simtime_t t);
00730 };
00731 
00732 //==========================================================================
00733 
00746 class SIM_API cSubModIterator
00747 {
00748   private:
00749     cModule *p;
00750 
00751   public:
00755     cSubModIterator(const cModule& h)  {p = &h ? h.firstsubmodp : NULL;}
00756 
00760     void init(const cModule& h)  {p = &h ? h.firstsubmodp : NULL;}
00761 
00767     cModule *operator()() const {return p;}
00768 
00772     bool end() const  {return (bool)(p==NULL);}
00773 
00779     cModule *operator++(int)  {if (!p) return NULL; cModule *t=p; p=p->nextp; return t;}
00780 };
00781 
00782 
00783 
00784 #endif
00785 

Generated on Fri Apr 1 12:25:32 2005 for OMNeT++/OMNEST Simulation Library by  doxygen 1.3.9.1