# cobject.h

    00001 //==========================================================================
    00002 //  COBJECT.H - part of
    00003 //                     OMNeT++/OMNEST
    00004 //            Discrete System Simulation in C++
    00005 //
    00006 //  Declaration of the following classes:
    00007 //    cObject      : general base class
    00008 //
    00009 //==========================================================================
    00010
    00011 /*--------------------------------------------------------------*
    00012   Copyright (C) 1992-2005 Andras Varga
    00013
    00014   This file is distributed WITHOUT ANY WARRANTY. See the file
    00015   `license' for details on this and other legal matters.
    00016 *--------------------------------------------------------------*/
    00017
    00018 #ifndef __COBJECT_H
    00019 #define __COBJECT_H
    00020
    00021 #include <typeinfo>
    00022 #include <iostream>
    00023 #include "cenvir.h"
    00024 #include "defs.h"
    00025 #include "util.h"
    00026 #include "cpolymorphic.h"
    00027 #include "cexception.h"
    00028 #include "cvisitor.h"
    00029
    00030
    00031 #define MAX_INTERNAL_NAME 11  /* should be 4n+3 */
    00032
    00033
    00034 //=== classes declared here
    00035 class cObject;
    00036 class cStaticFlag;
    00037
    00038 //=== classes mentioned
    00039 class cCommBuffer;
    00040 class cArray;
    00041 class cDefaultList;
    00042
    00043
    00053 typedef int (*CompareFunc)(cObject *a, cObject *b);
    00054
    00055
    00135 class SIM_API cObject : public cPolymorphic
    00136 {
    00137   private:
    00138     friend class cDefaultList;
    00139     friend class cSimulation;
    00140     friend class cMessage;  // because of refcounting business
    00141
    00142     union
    00143     {
    00144         char *p;
    00145         char chars[MAX_INTERNAL_NAME+1];
    00146         // last char: !=0 if p is used; =0 if chars[] is used (then also serves as EOS for 10-long strings)
    00147     } nameunion;
    00148
    00149     cObject *ownerp;       // owner pointer
    00150     int pos;               // used only if owner is a cDefaultList
    00151
    00152     // list in which objects are accumulated if there's no simple module in context
    00153     // (see also setDefaultOwner() and cSimulation::setContextModule())
    00154     static cDefaultList *defaultowner;
    00155
    00156     // global variables for statistics
    00157     static long total_objs;
    00158     static long live_objs;
    00159
    00160   protected:
    00161     static char fullpathbuf[MAX_OBJECTFULLPATH]; // buffer for fullPath()
    00162
    00163   private:
    00164     // internal
    00165     virtual void ownedObjectDeleted(cObject *obj);
    00166
    00167     // internal
    00168     virtual void yieldOwnership(cObject *obj, cObject *to);
    00169
    00170   public:
    00171     // internal
    00172     virtual void removeFromOwnershipTree();
    00173
    00174     // internal
    00175     static void setDefaultOwner(cDefaultList *list);
    00176
    00177     // called internally by cSimpleModule::snapshot(), and in turn it calls writeContents()
    00178     virtual void writeTo(std::ostream& os);
    00179
    00180   protected:
    00188
    00196     virtual void take(cObject *obj);
    00197
    00207     virtual void drop(cObject *obj);
    00208
    00222     void dropAndDelete(cObject *obj);
    00224
    00227
    00234     void copyNotSupported() const;
    00236
    00237   public:
    00240
    00245     cObject(const cObject& obj);
    00246
    00254     cObject();
    00255
    00260     explicit cObject(const char *name);
    00261
    00274     virtual ~cObject();
    00275
    00282     virtual cPolymorphic *dup() const    {return new cObject(*this);}
    00283
    00294     cObject& operator=(const cObject& o);
    00296
    00303
    00308     virtual void setName(const char *s);
    00309
    00314     const char *name() const  {return nameunion.chars[MAX_INTERNAL_NAME] ? nameunion.p : nameunion.chars;}
    00315
    00320     bool isName(const char *s) const {return !opp_strcmp(name(),s);}
    00321
    00327     virtual const char *fullName() const  {return name();}
    00328
    00334     virtual std::string fullPath() const;
    00335
    00340     virtual const char *fullPath(char *buffer, int buffersize) const;
    00342
    00345
    00349     cObject *owner() const {return ownerp;}
    00350
    00357     virtual bool isSoftOwner()  {return false;}
    00358
    00364     static cDefaultList *defaultOwner();
    00365
    00367
    00379     virtual void writeContents(std::ostream& os);
    00381
    00389
    00393     virtual void netPack(cCommBuffer *buffer);
    00394
    00398     virtual void netUnpack(cCommBuffer *buffer);
    00400
    00403
    00412     virtual void forEachChild(cVisitor *v);
    00413
    00425     cObject *findObject(const char *name, bool deep=true);
    00426
    00431     static int cmpbyname(cObject *one, cObject *other);
    00433
    00443     static long totalObjectCount() {return total_objs;}
    00444
    00451     static long liveObjectCount() {return live_objs;}
    00452
    00457     static void resetMessageCounters()  {total_objs=live_objs=0L;}
    00459 };
    00460
    00461
    00462 //
    00463 // Internal helper class for cObject.
    00464 //
    00465 class cStaticFlag
    00466 {
    00467   private:
    00468     static bool staticflag;  // set to true while in main()
    00469   public:
    00470     cStaticFlag()  {staticflag = true;}
    00471     ~cStaticFlag() {staticflag = false;}
    00472     static bool isSet() {return staticflag;}
    00473 };
    00474
    00475 std::ostream& operator<< (std::ostream& os, const cObject *p);
    00476 std::ostream& operator<< (std::ostream& os, const cObject& o);
    00477
    00478 inline std::ostream& operator<< (std::ostream& os, cObject *p) {
    00479     return os << (const cObject *)p;
    00480 }
    00481
    00482 inline std::ostream& operator<< (std::ostream& os, cObject& o) {
    00483     return os << (const cObject&)o;
    00484 }
    00485
    00486
    00503 // Note: this function cannot be put into utils.h (circular dependencies)
    00504 template<class T>
    00505 T check_and_cast(cPolymorphic *p)
    00506 {
    00507     if (!p)
    00508         throw new cRuntimeError("check_and_cast(): cannot cast NULL pointer to type '%s'",opp_typename(typeid(T)));
    00509     T ret = dynamic_cast<T>(p);
    00510     if (!ret)
    00511         throw new cRuntimeError("check_and_cast(): cannot cast (%s *)%s to type '%s'",p->className(),p->fullPath().c_str(),opp_typename(typeid(T)));
    00512     return ret;
    00513 }
    00514
    00518 template<class T>
    00519 const T check_and_cast(const cPolymorphic *p)
    00520 {
    00521     return check_and_cast<T>(const_cast<cPolymorphic *>(p));
    00522 }
    00523
    00524 #endif
    00525