00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _ubrick_hpp_
00026 #define _ubrick_hpp_
00027
00028 #include <typeinfo>
00029 #include <stdlib.h>
00030 #include <ubit/udefs.hpp>
00031 #include <ubit/ubrickImpl.hpp>
00032 #include <ubit/uerror.hpp>
00033
00034
00035
00036
00088 class UBrick {
00089 UBrick(const UBrick&);
00090 UBrick& operator=(const UBrick&);
00092
00093 public:
00094
00095 UBrick(u_modes b_modes = 0);
00101 virtual ~UBrick() {destructs();}
00127 static const char* getUbitVersion();
00129
00130 virtual const char* getClassName() const {return typeid(*this).name();}
00132
00133 void setAutoUpdate(bool);
00135
00136 bool isAutoUpdate() const;
00137
00138
00139
00140
00141 virtual int getParentCount() const;
00144 virtual UGroup** getParents() const;
00145 virtual UGroup** getParents(int &parent_count) const;
00156 virtual int getParents(std::vector<UGroup*>& parent_vect) const;
00168 virtual UGroup* getParent(int pos) const;
00180 virtual bool isChildOf(class UGroup *possible_parent, bool indirect) const;
00188 template<class CC>
00189 static bool isInstance(const UBrick*_obj) {return dynamic_cast<const CC*>(_obj);}
00194 virtual void removeFromParents(bool update_parents = true);
00203
00204
00205
00206 friend class ULink& operator/(const UCond&, UBrick&);
00207 friend class ULink& operator/(const UCond&, UBrick*);
00214
00215
00216
00217 static void error(const char* id, const char* msg);
00218 static void error(const char* id, const char* msg, long arg);
00219 static void error(const char* id, const char* msg, const char* arg);
00220 static void error(const char* id, const char* msg, const UStr& arg);
00221 static void error(const char* id, const char* msg, const std::string& arg);
00230
00231
00232
00233 bool isBmode(u_modes some_Bmodes) const
00234 {return ((bmodes & some_Bmodes) != 0);}
00236
00237 u_modes getBmodes() const {return bmodes;}
00239
00240 void setBmodes(u_modes bmodes, bool on_off);
00242
00243 void* operator new(size_t);
00244 void operator delete(void*);
00245 void addRef() {refcount++;}
00246 void removeRef();
00247 u_count getRefCount() const {return refcount;}
00249
00250 virtual void fire(class UEvent&, const class UOn&) const;
00252
00253 virtual class UProp* propCast() {return null;}
00254 virtual class UElem* elemCast() {return null;}
00255 virtual class UStr* strCast() {return null;}
00256 virtual class UGroup* groupCast() {return null;}
00257 virtual class UBox* boxCast() {return null;}
00258 virtual class UWin* winCast() {return null;}
00259 virtual class UGroup* getSubGroup(){return null;}
00261
00262 virtual void addingTo(class ULink *selflink, class UGroup *parent);
00263 virtual void removingFrom(class ULink *selflink, class UGroup *parent);
00264 virtual void destructs();
00273 #ifndef NO_DOC // - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00274
00275 virtual const char* cname() const {return getClassName();}
00277
00278 virtual class ULink* makeLink() {return new ULink(this);}
00279 const class ULLChain& getParentList() const {return parents;}
00280 bool hasValidParent() const;
00281 bool hasValidParent(bool& fake_or_deleted_par) const;
00282
00283 void addToCache(UBrick&);
00284 void addChangeCall(UBrick&);
00285 void addCall(ULink&);
00286
00287 protected:
00288 friend class ULink;
00289 friend class UArgs;
00290 class ULLChain parents;
00291 class UChain* cache;
00292 u_modes bmodes;
00293 u_count refcount;
00294 #endif
00295 };
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338 template <class CC>
00339 class uptr {
00340 CC* obj;
00341 CC& operator[](int);
00342
00343 public:
00344 uptr() {obj = null;}
00345 uptr(CC& _obj) {obj = &_obj; obj->addRef();}
00346 uptr(CC* _obj) {obj = _obj; if(obj) obj->addRef();}
00348
00349 uptr(const uptr<CC>& ref2) {obj = ref2.obj; if(obj) obj->addRef();}
00351
00352 ~uptr() {if (obj) obj->removeRef();}
00354
00355
00356
00357 uptr<CC>& operator=(CC& _obj) {
00358 if(obj) obj->removeRef(); obj = &_obj; if(obj) obj->addRef(); return *this;
00359 }
00360 uptr<CC>& operator=(CC* _obj) {
00361 if(obj) obj->removeRef(); obj = _obj; if(obj) obj->addRef(); return *this;
00362 }
00364
00365 uptr<CC>& operator=(const uptr<CC>& p2) {
00366 if(obj) obj->removeRef(); obj = p2.obj; if(obj) obj->addRef(); return *this;
00367 }
00369
00370
00371
00372 operator CC* () const {return obj;}
00374
00375 CC* operator&() const {return obj;}
00377
00378 CC& operator*() const {
00379 if (!obj) UError::error("uptr::operator*", "attempt to derefence a uptr (Ubit smart pointer) that points to null; ref:", (long)this);
00380 return *obj;
00381 }
00383
00384 CC* operator->() const {
00385 if (!obj) UError::error("uptr::operator->", "attempt to derefence a uptr (Ubit smart pointer) that points to null; ref:", (long)this);
00386 return obj;
00387 }
00389 };
00390
00391
00392
00393 #endif