#ifndef GledCore_ZGlass_H
#define GledCore_ZGlass_H
#include <Gled/GledTypes.h>
#include <Gled/GMutex.h>
class ZLinkBase
{
protected:
ZGlass* _lens;
public:
ZLinkBase() : _lens(0) {}
ZLinkBase(ZGlass* l) : _lens(l) {}
virtual ~ZLinkBase() {}
void set_link(ZGlass* l) { _lens = l; }
ZGlass** ptr_link() { return &_lens; }
ZGlass*& ref_link() { return _lens; }
ZGlass* get_link() { return _lens; }
Bool_t is_set() { return _lens != 0; }
Bool_t empty() { return _lens == 0; }
ID_t get_id();
void set_id(ID_t id);
ZLinkBase& operator=(ZGlass* l) { _lens = l; return *this; }
ClassDef(ZLinkBase, 0);
};
template <class T>
class ZLink : public ZLinkBase
{
public:
ZLink() : ZLinkBase() {}
ZLink(T* l) : ZLinkBase(l) {}
virtual ~ZLink() {}
T* operator*() { return (T*)_lens; }
T* operator->() { return (T*)_lens; }
T* get() { return (T*)_lens; }
void set(T* l) { _lens = l; }
ZLink<T>& operator=(T* l) { _lens = l; return *this; }
bool operator==(T* l) { return _lens == l; }
bool operator!=(T* l) { return _lens != l; }
ClassDef(ZLink<T>, 0)
};
class Saturn;
class ZMIR;
class Ray;
class ZQueen;
class ZMirFilter;
class ZComet;
class GThread;
class TBuffer; class TMessage;
namespace GledNS
{
class ClassInfo;
class LinkMemberInfo;
}
class An_ID_Demangler
{
public:
virtual ~An_ID_Demangler() {}
virtual ZGlass* DemangleID(ID_t) = 0;
ClassDef(An_ID_Demangler, 0);
};
class MIR_Priest
{
friend class Saturn;
public:
virtual ~MIR_Priest () {}
protected:
virtual void BlessMIR(ZMIR& mir) = 0;
ClassDef(MIR_Priest, 0);
};
class ZGlass : public TObject
{
MAC_RNR_FRIENDS(ZGlass);
friend class Saturn;
friend class ZQueen;
friend class ZComet;
public:
struct LinkRep {
ZGlass*& fLinkRef;
GledNS::LinkMemberInfo* fLinkInfo;
LinkRep(ZGlass*& r, GledNS::LinkMemberInfo* li) :
fLinkRef(r), fLinkInfo(li) {}
};
typedef list<LinkRep> lLinkRep_t;
typedef list<LinkRep>::iterator lLinkRep_i;
enum Bits_e
{
kFixedNameBit = 0x1,
kDyingBit = 0x2
};
private:
void _init();
protected:
Saturn* mSaturn;
ZQueen* mQueen;
UInt_t mGlassBits;
TString mName;
TString mTitle;
ID_t mSaturnID;
ZLink<ZMirFilter> mGuard;
Bool_t bMIRActive;
Bool_t bAcceptRefs;
#ifndef __CINT__
hpZGlass2Int_t mReverseRefs;
void dec_ref_count(hpZGlass2Int_i& i, UShort_t n);
#endif
UShort_t mRefCount;
UShort_t mMoonRefCount;
UShort_t mSunRefCount;
UShort_t mFireRefCount;
UShort_t mEyeRefCount;
void queen_check_in(ZGlass* l);
void set_link_or_die(ZGlass*& link, ZGlass* new_val, FID_t fid);
template <class GLASS>
void assign_link(ZLinkBase& link, FID_t stamp_fid, const char* name, const char* title=0)
{
GLASS *l = new GLASS(name, title);
queen_check_in(l);
set_link_or_die(link.ref_link(), l, stamp_fid);
}
virtual void reference_all();
virtual void unreference_all();
virtual void reference_links();
virtual void unreference_links();
virtual Int_t remove_references_to(ZGlass* lens);
mutable GMutex mReadMutex;
public:
void ReadLock() const { mReadMutex.Lock(); }
void ReadUnlock() const { mReadMutex.Unlock(); }
void WriteLock();
void WriteUnlock();
protected:
virtual void AdEnlightenment() {}
virtual void AdEndarkenment() {}
virtual void AdUnfoldment() {}
enum MirComponents_e {
MC_Any = 0,
MC_IsFlare = 1,
MC_IsBeam = 2,
MC_HasResultReq = 4,
MC_IsDetached = 8
};
ZMIR* get_MIR();
ZMIR* assert_MIR_presence (const Exc_t& header, int what=0);
ZMIR* suggest_MIR_presence(const Exc_t& header, int what=0);
void warn_caller(const TString& warning);
TimeStamp_t mTimeStamp;
TimeStamp_t mStampReqTring;
public:
ZGlass(const Text_t* n="ZGlass", const Text_t* t=0) :
mName(n), mTitle(t), mReadMutex(GMutex::recursive)
{ _init(); }
virtual ~ZGlass();
virtual Int_t RebuildAllRefs(An_ID_Demangler* idd);
void UpdateGlassView();
void UpdateAllViews();
void ReTriangulate();
void RebuildRnrScheme();
protected:
Bool_t bUseDispList;
Bool_t bUseNameStack;
public:
Bool_t CheckBit(Bits_e bit) const { return mGlassBits & bit; }
TString Identify() const;
void SetName(const Text_t* n);
void SetTitle(const Text_t* t);
ZMirFilter* GetGuard();
void SetGuard(ZMirFilter* guard);
bool IsSunSpace();
bool IsSunOrFireSpace();
virtual Int_t DetachedThreadNice(const ZMIR* mir) const { return 0; }
Short_t IncRefCount(ZGlass* from);
Short_t DecRefCount(ZGlass* from, UShort_t n=1);
Short_t IncEyeRefCount();
Short_t DecEyeRefCount();
void ClearLinks();
virtual void ClearAllReferences();
Int_t RemoveReferencesTo(ZGlass* lens);
virtual ZGlass* GetLinkByName(const TString& link_name);
virtual ZGlass* FindLensByPath(const TString& url, bool throwp=false);
virtual void SetStamps(TimeStamp_t s)
{ mTimeStamp = mStampReqTring = s; }
virtual TimeStamp_t Stamp(FID_t fid, UChar_t eye_bits=0);
TimeStamp_t Stamp() { return Stamp(FID_t(0,0)); }
TimeStamp_t StampVFID() { return Stamp(VFID()); }
virtual TimeStamp_t StampLink(FID_t fid);
TimeStamp_t StampLink() { return StampLink(FID_t(0,0)); }
TimeStamp_t StampLinkVFID() { return StampLink(VFID()); }
virtual void MarkStampReqTring()
{ mStampReqTring = ++mTimeStamp; }
virtual void StampReqTring(FID_t fid = FID_t(0,0))
{ mStampReqTring = Stamp(fid); }
void SetUseDLRec(Bool_t state);
public:
class RayAbsorber
{
public:
virtual ~RayAbsorber() {}
virtual void AbsorbRay(Ray& ray) = 0;
ClassDef(RayAbsorber, 0);
};
void register_ray_absorber (RayAbsorber* ra);
void unregister_ray_absorber(RayAbsorber* ra);
class NameChangeCB
{
public:
virtual ~NameChangeCB() {}
virtual void name_change_cb(ZGlass* g, const TString& new_name) = 0;
ClassDef(NameChangeCB, 0);
};
void register_name_change_cb (NameChangeCB* nccb);
void unregister_name_change_cb(NameChangeCB* nccb);
protected:
set<RayAbsorber*>* pspRayAbsorber;
set<NameChangeCB*>* pspNameChangeCB;
public:
#include "ZGlass.h7"
ClassDef(ZGlass, 1);
};
#include <Glasses/ZMirFilter.h>
#define LIST_CALL(_cont_, _type_, _method_) \
for(lpZGlass_i __iter=_cont_.begin(); __iter!=_cont_.end(); ++__iter) { \
if(_type_* __t = dynamic_cast<_type_*>(*__iter)) { __t->_method_ } }
#define IF_ZGLASS_RAY(...) { \
bool queenray_p = mQueen && mSaturn && mSaturn->AcceptsRays(); \
bool absorber_p = pspRayAbsorber != 0; \
if(queenray_p || absorber_p) { \
auto_ptr<Ray> ray(Ray::PtrCtor(__VA_ARGS__));
#define IF_ZGLASS_CHANGE_RAY(...) { \
bool queenray_p = mQueen && mSaturn && mQueen->GetStamping() && mSaturn->AcceptsRays(); \
bool absorber_p = pspRayAbsorber != 0; \
if(queenray_p || absorber_p) { \
auto_ptr<Ray> ray(Ray::PtrCtor(__VA_ARGS__));
#define ZGLASS_SEND_RAY \
if(absorber_p) \
for(set<RayAbsorber*>::iterator i=pspRayAbsorber->begin(); i!=pspRayAbsorber->end(); ++i) \
(*i)->AbsorbRay(*ray); \
if(queenray_p) \
mQueen->EmitRay(ray); \
} \
}
#endif