// @(#)root/meta:$Id$
// Author: Philippe Canal 15/03/2005

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TClassRef
#define ROOT_TClassRef

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TClassRef                                                            //
//                                                                      //
// Reference to a TClass object and intrusive list of other             //
// to thise same TClass object references                               //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TClass
#include "TClass.h"
#endif
#ifndef ROOT_TRef
#include "TRef.h"
#endif

#include <string>

class TClassRef {

private:
   std::string   fClassName; //Name of referenced class
#ifdef __CINT__
   TClass      **fClassPtr;  //! Ptr to the permanent TClass ptr/reference
#else
   TClass *const*fClassPtr;  //! Ptr to the permanent TClass ptr/reference
#endif

   friend class TClass;

   void Assign(const TClassRef &);
   void Assign(TClass *);
   TClass   *InternalGetClass() const;
public:
   TClassRef() : fClassName(), fClassPtr(0) {}
   TClassRef(TClass *cl);
   TClassRef(const char *classname);
   TClassRef(const TClassRef&);
   inline TClassRef &operator=(const TClassRef &rhs) {
      // Inline implementation of operator= to speed the no-op case.
      if (this != &rhs && (fClassPtr == 0 || fClassPtr != rhs.fClassPtr)) {
         this->Assign(rhs);
      }
      return *this;
   }
   inline TClassRef &operator=(TClass *rhs) {
      // Inline implementation of operator= to speed the no-op case.
      if ( this->fClassPtr==0 || *(this->fClassPtr) != rhs) {
         this->Assign(rhs);
      }
      return *this;
   }

   ~TClassRef() { };

   void SetName(const char* new_name) {
      if ( fClassPtr && fClassName != new_name ) Reset();
      fClassName = new_name;
   }
   const char *GetClassName() { return fClassName.c_str(); }
   TClass *GetClass()  const { return (fClassPtr && *fClassPtr) ? *fClassPtr : InternalGetClass(); }
   void Reset() { fClassPtr = 0; }

   TClass* operator->() const { return (fClassPtr && *fClassPtr) ? *fClassPtr : InternalGetClass(); }
   operator TClass*() const { return (fClassPtr && *fClassPtr )? *fClassPtr : InternalGetClass(); }

};

#endif
 TClassRef.h:1
 TClassRef.h:2
 TClassRef.h:3
 TClassRef.h:4
 TClassRef.h:5
 TClassRef.h:6
 TClassRef.h:7
 TClassRef.h:8
 TClassRef.h:9
 TClassRef.h:10
 TClassRef.h:11
 TClassRef.h:12
 TClassRef.h:13
 TClassRef.h:14
 TClassRef.h:15
 TClassRef.h:16
 TClassRef.h:17
 TClassRef.h:18
 TClassRef.h:19
 TClassRef.h:20
 TClassRef.h:21
 TClassRef.h:22
 TClassRef.h:23
 TClassRef.h:24
 TClassRef.h:25
 TClassRef.h:26
 TClassRef.h:27
 TClassRef.h:28
 TClassRef.h:29
 TClassRef.h:30
 TClassRef.h:31
 TClassRef.h:32
 TClassRef.h:33
 TClassRef.h:34
 TClassRef.h:35
 TClassRef.h:36
 TClassRef.h:37
 TClassRef.h:38
 TClassRef.h:39
 TClassRef.h:40
 TClassRef.h:41
 TClassRef.h:42
 TClassRef.h:43
 TClassRef.h:44
 TClassRef.h:45
 TClassRef.h:46
 TClassRef.h:47
 TClassRef.h:48
 TClassRef.h:49
 TClassRef.h:50
 TClassRef.h:51
 TClassRef.h:52
 TClassRef.h:53
 TClassRef.h:54
 TClassRef.h:55
 TClassRef.h:56
 TClassRef.h:57
 TClassRef.h:58
 TClassRef.h:59
 TClassRef.h:60
 TClassRef.h:61
 TClassRef.h:62
 TClassRef.h:63
 TClassRef.h:64
 TClassRef.h:65
 TClassRef.h:66
 TClassRef.h:67
 TClassRef.h:68
 TClassRef.h:69
 TClassRef.h:70
 TClassRef.h:71
 TClassRef.h:72
 TClassRef.h:73
 TClassRef.h:74
 TClassRef.h:75
 TClassRef.h:76
 TClassRef.h:77
 TClassRef.h:78
 TClassRef.h:79
 TClassRef.h:80
 TClassRef.h:81
 TClassRef.h:82
 TClassRef.h:83