ROOT logo
// $Id: ZGlass.h 2486 2011-06-25 04:07:48Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#ifndef GledCore_ZGlass_H
#define GledCore_ZGlass_H

#include <Gled/GledTypes.h>
#include <Gled/GMutex.h>

class AList;
class Saturn;
class ZMIR;
class Ray;
class ZQueen;
class ZMirFilter;
class ZComet;
class GThread;

namespace GledNS
{
  class ClassInfo;
  class LinkMemberInfo;
}


//==============================================================================
// ZLinkBase and ZLink<>
//==============================================================================

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)
};


//==============================================================================
// Virtual bases for rulers etc. Should be somewhere else
//==============================================================================

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);
};


//==============================================================================
// ZGlass
//==============================================================================

class ZGlass : public TObject
{
  MAC_RNR_FRIENDS(ZGlass);
  friend class Saturn;
  friend class ZQueen;
  friend class ZComet;

public:
#ifndef __CINT__
  struct LinkRep
  {
    ZGlass*&                fLinkRef;
    GledNS::LinkMemberInfo* fLinkInfo;

    LinkRep(ZGlass*& r, GledNS::LinkMemberInfo* li) :
      fLinkRef(r), fLinkInfo(li) {}
  };
#else
  struct LinkRep;
#endif
  typedef list<LinkRep>           lLinkRep_t;
  typedef list<LinkRep>::iterator lLinkRep_i;

  enum Bits_e
  {
    kFixedNameBit = 0x1,
    kDyingBit     = 0x2
  };

private:
  void		_init();

protected:
  Saturn*	mSaturn;	//! X{g}
  ZQueen*	mQueen;		//! X{g}

  UInt_t	mGlassBits;	//  X{g}
  TString	mName;		//  X{RGE} 7 Textor()
  TString	mTitle;		//  X{RGE} 7 Textor()
  ID_t		mSaturnID;	//  X{G}   7 ValOut(-range=>[0,MAX_ID,1], -width=>10)
  ZLink<ZMirFilter> mGuard;     //  X{E} L{}

  Bool_t	bMIRActive;	//  X{GS} 7 BoolOut(-join=>1)
  Bool_t	bAcceptRefs;	//  X{GS} 7 BoolOut()

#ifndef __CINT__
  hpZGlass2Int_t mReverseRefs;  //! lenses that reference *this*
  void dec_ref_count(hpZGlass2Int_i& i, UShort_t n);
#endif
  UShort_t	mRefCount;	//! X{G}  7 ValOut(-width=>4, -join=>1)
  UShort_t	mMoonRefCount;	//! X{G}  7 ValOut(-width=>4)
  UShort_t	mSunRefCount;	//! X{G}  7 ValOut(-width=>4, -join=>1)
  UShort_t	mFireRefCount;	//! X{G}  7 ValOut(-width=>4)
  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)
  {
    // Instantiate a lens and set link. To be used in AdEnlightenment().
    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);

  // Mutexen
  mutable GMutex mReadMutex;    //!
public:
  void ReadLock()   const { mReadMutex.Lock(); }
  void ReadUnlock() const { mReadMutex.Unlock(); }
  void WriteLock();
  void WriteUnlock();

protected:
  // Handlers of lens-state change notfications ... called from Saturn/Queen
  virtual void AdEnlightenment() {}	// called by Saturn on Enlight
  virtual void AdEndarkenment() {}	// called by Saturn on Endark
  virtual void AdUnfoldment() {}	// called by Queen after comet unpacking

  // MIR stuff
  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);

  // TimeStaps
  TimeStamp_t	 mTimeStamp;	   //! X{GS} TimeStamp of last change
  TimeStamp_t	 mStampReqTring;   //! X{GS} TimeStamp of last change that requires retriangulation

public:

  ZGlass(const Text_t* n="ZGlass", const Text_t* t=0) :
    mName(n), mTitle(t), mReadMutex(GMutex::recursive)
  { _init(); }

  virtual ~ZGlass();

  virtual AList* AsAList() { return 0; }

  virtual Int_t RebuildAllRefs(An_ID_Demangler* idd);

  void UpdateGlassView();   //! X{E} 7 MButt(-join=>1)
  void UpdateAllViews();    //! X{E} 7 MButt()
  void ReTriangulate();     //! X{E} 7 MButt(-join=>1)
  void RebuildRnrScheme();  //! X{E} 7 MButt()
protected:
  Bool_t bUseDispList;      // X{GST} 7 Bool(-join=>1)
  Bool_t bUseNameStack;     // X{GS}  7 Bool()
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);

  // Saturnalia
  bool IsSunSpace();
  bool IsSunOrFireSpace();

  virtual Int_t DetachedThreadNice(const ZMIR* mir) const { return 0; }

  // RefCount
  Short_t IncRefCount(ZGlass* from);
  Short_t DecRefCount(ZGlass* from, UShort_t n=1);
  // here also need ReRef(from, old_queen, new_queen) or sth.
  Short_t IncEyeRefCount();
  Short_t DecEyeRefCount();

  // Link handling
  void         ClearLinks();
  virtual void ClearAllReferences();
  Int_t        RemoveReferencesTo(ZGlass* lens);

  // Queries
  virtual ZGlass* GetLinkByName(const TString& link_name);
  virtual ZGlass* FindLensByPath(const TString& url, bool throwp=false);

  // Stamps
  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); // X{ED} 7 MCWButt()

  //----------------------------------------------------------------------
  // RayAbsorber and NameChangeCB
  //----------------------------------------------------------------------

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); // Base class of Gled enabled classes.
}; // endclass ZGlass

#include <Glasses/ZMirFilter.h>

/**************************************************************************/
// Strange defines.
/**************************************************************************/

// LIST_CALL: calls _method_ on all objects of type _type_ in container _cont_
#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
 ZGlass.h:1
 ZGlass.h:2
 ZGlass.h:3
 ZGlass.h:4
 ZGlass.h:5
 ZGlass.h:6
 ZGlass.h:7
 ZGlass.h:8
 ZGlass.h:9
 ZGlass.h:10
 ZGlass.h:11
 ZGlass.h:12
 ZGlass.h:13
 ZGlass.h:14
 ZGlass.h:15
 ZGlass.h:16
 ZGlass.h:17
 ZGlass.h:18
 ZGlass.h:19
 ZGlass.h:20
 ZGlass.h:21
 ZGlass.h:22
 ZGlass.h:23
 ZGlass.h:24
 ZGlass.h:25
 ZGlass.h:26
 ZGlass.h:27
 ZGlass.h:28
 ZGlass.h:29
 ZGlass.h:30
 ZGlass.h:31
 ZGlass.h:32
 ZGlass.h:33
 ZGlass.h:34
 ZGlass.h:35
 ZGlass.h:36
 ZGlass.h:37
 ZGlass.h:38
 ZGlass.h:39
 ZGlass.h:40
 ZGlass.h:41
 ZGlass.h:42
 ZGlass.h:43
 ZGlass.h:44
 ZGlass.h:45
 ZGlass.h:46
 ZGlass.h:47
 ZGlass.h:48
 ZGlass.h:49
 ZGlass.h:50
 ZGlass.h:51
 ZGlass.h:52
 ZGlass.h:53
 ZGlass.h:54
 ZGlass.h:55
 ZGlass.h:56
 ZGlass.h:57
 ZGlass.h:58
 ZGlass.h:59
 ZGlass.h:60
 ZGlass.h:61
 ZGlass.h:62
 ZGlass.h:63
 ZGlass.h:64
 ZGlass.h:65
 ZGlass.h:66
 ZGlass.h:67
 ZGlass.h:68
 ZGlass.h:69
 ZGlass.h:70
 ZGlass.h:71
 ZGlass.h:72
 ZGlass.h:73
 ZGlass.h:74
 ZGlass.h:75
 ZGlass.h:76
 ZGlass.h:77
 ZGlass.h:78
 ZGlass.h:79
 ZGlass.h:80
 ZGlass.h:81
 ZGlass.h:82
 ZGlass.h:83
 ZGlass.h:84
 ZGlass.h:85
 ZGlass.h:86
 ZGlass.h:87
 ZGlass.h:88
 ZGlass.h:89
 ZGlass.h:90
 ZGlass.h:91
 ZGlass.h:92
 ZGlass.h:93
 ZGlass.h:94
 ZGlass.h:95
 ZGlass.h:96
 ZGlass.h:97
 ZGlass.h:98
 ZGlass.h:99
 ZGlass.h:100
 ZGlass.h:101
 ZGlass.h:102
 ZGlass.h:103
 ZGlass.h:104
 ZGlass.h:105
 ZGlass.h:106
 ZGlass.h:107
 ZGlass.h:108
 ZGlass.h:109
 ZGlass.h:110
 ZGlass.h:111
 ZGlass.h:112
 ZGlass.h:113
 ZGlass.h:114
 ZGlass.h:115
 ZGlass.h:116
 ZGlass.h:117
 ZGlass.h:118
 ZGlass.h:119
 ZGlass.h:120
 ZGlass.h:121
 ZGlass.h:122
 ZGlass.h:123
 ZGlass.h:124
 ZGlass.h:125
 ZGlass.h:126
 ZGlass.h:127
 ZGlass.h:128
 ZGlass.h:129
 ZGlass.h:130
 ZGlass.h:131
 ZGlass.h:132
 ZGlass.h:133
 ZGlass.h:134
 ZGlass.h:135
 ZGlass.h:136
 ZGlass.h:137
 ZGlass.h:138
 ZGlass.h:139
 ZGlass.h:140
 ZGlass.h:141
 ZGlass.h:142
 ZGlass.h:143
 ZGlass.h:144
 ZGlass.h:145
 ZGlass.h:146
 ZGlass.h:147
 ZGlass.h:148
 ZGlass.h:149
 ZGlass.h:150
 ZGlass.h:151
 ZGlass.h:152
 ZGlass.h:153
 ZGlass.h:154
 ZGlass.h:155
 ZGlass.h:156
 ZGlass.h:157
 ZGlass.h:158
 ZGlass.h:159
 ZGlass.h:160
 ZGlass.h:161
 ZGlass.h:162
 ZGlass.h:163
 ZGlass.h:164
 ZGlass.h:165
 ZGlass.h:166
 ZGlass.h:167
 ZGlass.h:168
 ZGlass.h:169
 ZGlass.h:170
 ZGlass.h:171
 ZGlass.h:172
 ZGlass.h:173
 ZGlass.h:174
 ZGlass.h:175
 ZGlass.h:176
 ZGlass.h:177
 ZGlass.h:178
 ZGlass.h:179
 ZGlass.h:180
 ZGlass.h:181
 ZGlass.h:182
 ZGlass.h:183
 ZGlass.h:184
 ZGlass.h:185
 ZGlass.h:186
 ZGlass.h:187
 ZGlass.h:188
 ZGlass.h:189
 ZGlass.h:190
 ZGlass.h:191
 ZGlass.h:192
 ZGlass.h:193
 ZGlass.h:194
 ZGlass.h:195
 ZGlass.h:196
 ZGlass.h:197
 ZGlass.h:198
 ZGlass.h:199
 ZGlass.h:200
 ZGlass.h:201
 ZGlass.h:202
 ZGlass.h:203
 ZGlass.h:204
 ZGlass.h:205
 ZGlass.h:206
 ZGlass.h:207
 ZGlass.h:208
 ZGlass.h:209
 ZGlass.h:210
 ZGlass.h:211
 ZGlass.h:212
 ZGlass.h:213
 ZGlass.h:214
 ZGlass.h:215
 ZGlass.h:216
 ZGlass.h:217
 ZGlass.h:218
 ZGlass.h:219
 ZGlass.h:220
 ZGlass.h:221
 ZGlass.h:222
 ZGlass.h:223
 ZGlass.h:224
 ZGlass.h:225
 ZGlass.h:226
 ZGlass.h:227
 ZGlass.h:228
 ZGlass.h:229
 ZGlass.h:230
 ZGlass.h:231
 ZGlass.h:232
 ZGlass.h:233
 ZGlass.h:234
 ZGlass.h:235
 ZGlass.h:236
 ZGlass.h:237
 ZGlass.h:238
 ZGlass.h:239
 ZGlass.h:240
 ZGlass.h:241
 ZGlass.h:242
 ZGlass.h:243
 ZGlass.h:244
 ZGlass.h:245
 ZGlass.h:246
 ZGlass.h:247
 ZGlass.h:248
 ZGlass.h:249
 ZGlass.h:250
 ZGlass.h:251
 ZGlass.h:252
 ZGlass.h:253
 ZGlass.h:254
 ZGlass.h:255
 ZGlass.h:256
 ZGlass.h:257
 ZGlass.h:258
 ZGlass.h:259
 ZGlass.h:260
 ZGlass.h:261
 ZGlass.h:262
 ZGlass.h:263
 ZGlass.h:264
 ZGlass.h:265
 ZGlass.h:266
 ZGlass.h:267
 ZGlass.h:268
 ZGlass.h:269
 ZGlass.h:270
 ZGlass.h:271
 ZGlass.h:272
 ZGlass.h:273
 ZGlass.h:274
 ZGlass.h:275
 ZGlass.h:276
 ZGlass.h:277
 ZGlass.h:278
 ZGlass.h:279
 ZGlass.h:280
 ZGlass.h:281
 ZGlass.h:282
 ZGlass.h:283
 ZGlass.h:284
 ZGlass.h:285
 ZGlass.h:286
 ZGlass.h:287
 ZGlass.h:288
 ZGlass.h:289
 ZGlass.h:290
 ZGlass.h:291
 ZGlass.h:292
 ZGlass.h:293
 ZGlass.h:294
 ZGlass.h:295
 ZGlass.h:296
 ZGlass.h:297
 ZGlass.h:298
 ZGlass.h:299
 ZGlass.h:300
 ZGlass.h:301
 ZGlass.h:302
 ZGlass.h:303
 ZGlass.h:304
 ZGlass.h:305
 ZGlass.h:306
 ZGlass.h:307
 ZGlass.h:308
 ZGlass.h:309
 ZGlass.h:310
 ZGlass.h:311
 ZGlass.h:312
 ZGlass.h:313
 ZGlass.h:314
 ZGlass.h:315
 ZGlass.h:316
 ZGlass.h:317
 ZGlass.h:318
 ZGlass.h:319
 ZGlass.h:320
 ZGlass.h:321
 ZGlass.h:322
 ZGlass.h:323
 ZGlass.h:324
 ZGlass.h:325
 ZGlass.h:326
 ZGlass.h:327
 ZGlass.h:328
 ZGlass.h:329
 ZGlass.h:330
 ZGlass.h:331
 ZGlass.h:332
 ZGlass.h:333
 ZGlass.h:334
 ZGlass.h:335
 ZGlass.h:336
 ZGlass.h:337
 ZGlass.h:338
 ZGlass.h:339
 ZGlass.h:340
 ZGlass.h:341
 ZGlass.h:342
 ZGlass.h:343
 ZGlass.h:344
 ZGlass.h:345
 ZGlass.h:346
 ZGlass.h:347
 ZGlass.h:348
 ZGlass.h:349
 ZGlass.h:350
 ZGlass.h:351
 ZGlass.h:352
 ZGlass.h:353