Logo ROOT  
Reference Guide
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Loading...
Searching...
No Matches
TClassRef.h
Go to the documentation of this file.
1// @(#)root/meta:$Id$
2// Author: Philippe Canal 15/03/2005
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#ifndef ROOT_TClassRef
13#define ROOT_TClassRef
14
15//////////////////////////////////////////////////////////////////////////
16// //
17// TClassRef //
18// //
19// Reference to a TClass object and intrusive list of other //
20// to thise same TClass object references //
21// //
22//////////////////////////////////////////////////////////////////////////
23
24#include "TClass.h"
25
26#include <string>
27#include <atomic>
28
29class TClassRef {
30
31private:
32 std::string fClassName; //Name of referenced class
33 std::atomic<TClass *const*> fClassPtr; //! Ptr to the permanent TClass ptr/reference
34
35 friend class TClass;
36
37 void Assign(const TClassRef &);
38 void Assign(TClass *);
39 TClass *InternalGetClass() const;
40public:
41 TClassRef() : fClassName(), fClassPtr(nullptr) {}
42 TClassRef(TClass *cl);
43 TClassRef(const char *classname);
44 TClassRef(const TClassRef&);
45 inline TClassRef &operator=(const TClassRef &rhs) {
46 // Inline implementation of operator= to speed the no-op case.
47 if (this != &rhs && (!fClassPtr || fClassPtr != rhs.fClassPtr)) {
48 this->Assign(rhs);
49 }
50 return *this;
51 }
53 // Inline implementation of operator= to speed the no-op case.
54 if ( !this->fClassPtr|| *(this->fClassPtr) != rhs) {
55 this->Assign(rhs);
56 }
57 return *this;
58 }
59
61
62 void SetName(const char* new_name) {
63 if ( fClassPtr && fClassName != new_name ) Reset();
65 }
66 const char *GetClassName() { return fClassName.c_str(); }
67 TClass *GetClass() const { return (fClassPtr && *fClassPtr) ? *fClassPtr : InternalGetClass(); }
68 void Reset() { fClassPtr = nullptr; }
69
71 operator TClass*() const { return (fClassPtr && *fClassPtr )? *fClassPtr : InternalGetClass(); }
72
73};
74
75#endif
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
TClassRef is used to implement a permanent reference to a TClass object.
Definition TClassRef.h:29
std::atomic< TClass *const * > fClassPtr
Definition TClassRef.h:33
void SetName(const char *new_name)
Definition TClassRef.h:62
TClassRef & operator=(TClass *rhs)
Definition TClassRef.h:52
TClass * InternalGetClass() const
Return the current TClass object corresponding to fClassName.
Definition TClassRef.cxx:83
TClass * GetClass() const
Definition TClassRef.h:67
std::string fClassName
Definition TClassRef.h:32
TClassRef & operator=(const TClassRef &rhs)
Definition TClassRef.h:45
TClass * operator->() const
Definition TClassRef.h:70
void Reset()
Definition TClassRef.h:68
const char * GetClassName()
Definition TClassRef.h:66
void Assign(const TClassRef &)
Assignment operator implementation, increases reference count to original class object.
Definition TClassRef.cxx:59
TClass instances represent classes, structs and namespaces in the ROOT type system.
Definition TClass.h:84