33 #include <type_traits>
39 #define __attribute__(unused)
48 class TMemberInspector;
60 kItimerResolution = 10
63 enum EColor { kWhite =0, kBlack =1, kGray=920,
64 kRed =632, kGreen =416, kBlue=600, kYellow=400, kMagenta=616, kCyan=432,
65 kOrange=800, kSpring=820, kTeal=840, kAzure =860, kViolet =880, kPink=900 };
69 class TMemberStreamer;
70 typedef void (*ClassStreamerFunc_t)(TBuffer&,
void*);
71 typedef void (*ClassConvStreamerFunc_t)(TBuffer&,
void*,
const TClass*);
72 typedef void (*MemberStreamerFunc_t)(TBuffer&,
void*, Int_t);
75 class TVirtualCollectionProxy;
77 typedef void (*VoidFuncPtr_t)();
78 typedef TClass* (*DictFuncPtr_t)();
83 #define BIT(n) (1ULL << (n))
84 #define SETBIT(n,i) ((n) |= BIT(i))
85 #define CLRBIT(n,i) ((n) &= ~BIT(i))
86 #define TESTBIT(n,i) ((Bool_t)(((n) & BIT(i)) != 0))
91 R__EXTERN Int_t gDebug;
96 typedef void (*ShowMembersFunc_t)(
const void *obj, TMemberInspector &R__insp, Bool_t isTransient);
97 class TVirtualIsAProxy;
98 typedef TClass *(*IsAGlobalFunc_t)(
const TClass*,
const void *obj);
101 template <
class Tmpl> TBuffer &operator>>(TBuffer &buf, Tmpl *&obj);
102 template <
class Tmpl> TBuffer &operator<<(TBuffer &buf,
const Tmpl *obj);
109 class TGenericClassInfo;
110 typedef void *(*NewFunc_t)(
void *);
111 typedef void *(*NewArrFunc_t)(Long_t size,
void *arena);
112 typedef void (*DelFunc_t)(
void *);
113 typedef void (*DelArrFunc_t)(
void *);
114 typedef void (*DesFunc_t)(
void *);
115 typedef void (*DirAutoAdd_t)(
void *, TDirectory *);
116 typedef Long64_t (*MergeFunc_t)(
void *, TCollection *, TFileMergeInfo *);
117 typedef void (*ResetAfterMergeFunc_t)(
void *, TFileMergeInfo *);
119 template <
class RootClass> Short_t SetClassVersion(RootClass *);
121 extern TClass *CreateClass(
const char *cname, Version_t
id,
122 const std::type_info &info, TVirtualIsAProxy *isa,
123 const char *dfil,
const char *ifil,
125 extern void AddClass(
const char *cname, Version_t
id,
const std::type_info &info,
126 DictFuncPtr_t dict, Int_t pragmabits);
127 extern void RemoveClass(
const char *cname);
128 extern void ResetClassVersion(TClass*,
const char*, Short_t);
129 extern void AddClassAlternate(
const char *normName,
const char *alternate);
131 extern TNamed *RegisterClassTemplate(
const char *name,
132 const char *file, Int_t line);
134 extern void Class_ShowMembers(TClass *cl,
const void *obj, TMemberInspector&);
140 template <
class T> TGenericClassInfo *GetClassInfo(
const T* t) {
141 TGenericClassInfo *GenerateInitInstance(
const T*);
142 return CreateInitInstance(t);
147 class TInitBehavior {
153 virtual ~TInitBehavior() { }
155 virtual void Register(
const char *cname, Version_t
id,
156 const std::type_info &info,
157 DictFuncPtr_t dict, Int_t pragmabits)
const = 0;
158 virtual void Unregister(
const char *classname)
const = 0;
159 virtual TClass *CreateClass(
const char *cname, Version_t
id,
160 const std::type_info &info, TVirtualIsAProxy *isa,
161 const char *dfil,
const char *ifil,
162 Int_t dl, Int_t il)
const = 0;
165 class TDefaultInitBehavior:
public TInitBehavior {
167 virtual void Register(
const char *cname, Version_t
id,
168 const std::type_info &info,
169 DictFuncPtr_t dict, Int_t pragmabits)
const {
170 ROOT::AddClass(cname,
id, info, dict, pragmabits);
173 virtual void Unregister(
const char *classname)
const {
174 ROOT::RemoveClass(classname);
177 virtual TClass *CreateClass(
const char *cname, Version_t
id,
178 const std::type_info &info, TVirtualIsAProxy *isa,
179 const char *dfil,
const char *ifil,
180 Int_t dl, Int_t il)
const {
181 return ROOT::CreateClass(cname,
id, info, isa, dfil, ifil, dl, il);
185 const TInitBehavior *DefineBehavior(
void * ,
195 typedef std::atomic<TClass*> atomic_TClass_ptr;
199 namespace ROOT {
namespace Internal {
204 static void SetInstance(::ROOT::TGenericClassInfo& R__instance,
205 NewFunc_t, NewArrFunc_t, DelFunc_t, DelArrFunc_t, DesFunc_t);
206 static void SetName(
const std::string& name, std::string& nameMember);
207 static void SetfgIsA(atomic_TClass_ptr& isA, TClass*(*dictfun)());
210 template <
typename T>
211 class ClassDefGenerateInitInstanceLocalInjector:
212 public TCDGIILIBase {
213 static atomic_TClass_ptr fgIsA;
214 static ::ROOT::TGenericClassInfo *fgGenericInfo;
216 static void *New(
void *p) {
return p ?
new(p) T :
new T; };
217 static void *NewArray(Long_t nElements,
void *p) {
218 return p ?
new(p) T[nElements] :
new T[nElements]; }
219 static void Delete(
void *p) {
delete ((T*)p); }
220 static void DeleteArray(
void *p) {
delete[] ((T*)p); }
221 static void Destruct(
void *p) { ((T*)p)->~T(); }
222 static ::ROOT::TGenericClassInfo *GenerateInitInstanceLocal() {
223 static ::TVirtualIsAProxy* isa_proxy = new ::TInstrumentedIsAProxy<T>(0);
224 static ::ROOT::TGenericClassInfo
225 R__instance(T::Class_Name(), T::Class_Version(),
226 T::DeclFileName(), T::DeclFileLine(),
227 typeid(T), ::ROOT::Internal::DefineBehavior((T*)0, (T*)0),
228 &T::Dictionary, isa_proxy, 0,
sizeof(T) );
229 SetInstance(R__instance, &New, &NewArray, &Delete, &DeleteArray, &Destruct);
236 static TClass *Dictionary() { fgIsA = fgGenericInfo->GetClass();
return fgIsA; }
237 static TClass *Class() { SetfgIsA(fgIsA, &Dictionary);
return fgIsA; }
238 static const char* Name() {
239 static std::string gName;
241 SetName(GetDemangledTypeName(
typeid(T)), gName);
242 return gName.c_str();
247 atomic_TClass_ptr ClassDefGenerateInitInstanceLocalInjector<T>::fgIsA{};
249 ::ROOT::TGenericClassInfo *ClassDefGenerateInitInstanceLocalInjector<T>::fgGenericInfo {
250 ClassDefGenerateInitInstanceLocalInjector<T>::GenerateInitInstanceLocal()
253 template <
typename T>
254 struct THashConsistencyHolder {
255 static Bool_t fgHashConsistency;
258 template <
typename T>
259 Bool_t THashConsistencyHolder<T>::fgHashConsistency;
261 void DefaultStreamer(TBuffer &R__b,
const TClass *cl,
void *objpointer);
262 Bool_t HasConsistentHashMember(TClass &clRef);
263 Bool_t HasConsistentHashMember(
const char *clName);
270 #define _ClassDefBase_(name, id, virtual_keyword, overrd) \
272 static_assert(std::is_integral<decltype(id)>::value, "ClassDef(Inline) macro: the specified class version number is not an integer."); \
273 virtual_keyword Bool_t CheckTObjectHashConsistency() const overrd \
275 static std::atomic<UChar_t> recurseBlocker(0); \
276 if (R__likely(recurseBlocker >= 2)) { \
277 return ::ROOT::Internal::THashConsistencyHolder<decltype(*this)>::fgHashConsistency; \
278 } else if (recurseBlocker == 1) { \
280 } else if (recurseBlocker++ == 0) { \
281 ::ROOT::Internal::THashConsistencyHolder<decltype(*this)>::fgHashConsistency = \
282 ::ROOT::Internal::HasConsistentHashMember(_QUOTE_(name)) || \
283 ::ROOT::Internal::HasConsistentHashMember(*IsA()); \
285 return ::ROOT::Internal::THashConsistencyHolder<decltype(*this)>::fgHashConsistency; \
291 static Version_t Class_Version() { return id; } \
292 virtual_keyword TClass *IsA() const overrd { return name::Class(); } \
293 virtual_keyword void ShowMembers(TMemberInspector &insp) const overrd \
295 ::ROOT::Class_ShowMembers(name::Class(), this, insp); \
297 void StreamerNVirtual(TBuffer &ClassDef_StreamerNVirtual_b) { name::Streamer(ClassDef_StreamerNVirtual_b); } \
298 static const char *DeclFileName() { return __FILE__; }
300 #define _ClassDefOutline_(name,id, virtual_keyword, overrd) \
301 _ClassDefBase_(name,id, virtual_keyword, overrd) \
303 static atomic_TClass_ptr fgIsA; \
305 static int ImplFileLine(); \
306 static const char *ImplFileName(); \
307 static const char *Class_Name(); \
308 static TClass *Dictionary(); \
309 static TClass *Class(); \
310 virtual_keyword void Streamer(TBuffer&) overrd;
312 #define _ClassDefInline_(name, id, virtual_keyword, overrd) \
313 _ClassDefBase_(name, id, virtual_keyword, overrd) public : static int ImplFileLine() { return -1; } \
314 static const char *ImplFileName() { return 0; } \
315 static const char *Class_Name() \
317 return ::ROOT::Internal::ClassDefGenerateInitInstanceLocalInjector<name>::Name(); \
319 static TClass *Dictionary() \
321 return ::ROOT::Internal::ClassDefGenerateInitInstanceLocalInjector<name>::Dictionary(); \
323 static TClass *Class() { return ::ROOT::Internal::ClassDefGenerateInitInstanceLocalInjector<name>::Class(); } \
324 virtual_keyword void Streamer(TBuffer &R__b) overrd { ::ROOT::Internal::DefaultStreamer(R__b, name::Class(), this); }
326 #define ClassDef(name,id) \
327 _ClassDefOutline_(name,id,virtual,) \
328 static int DeclFileLine() { return __LINE__; }
330 #define ClassDefOverride(name,id) \
331 _ClassDefOutline_(name,id,,override) \
332 static int DeclFileLine() { return __LINE__; }
334 #define ClassDefNV(name,id) \
335 _ClassDefOutline_(name,id,,) \
336 static int DeclFileLine() { return __LINE__; }
338 #define ClassDefInline(name,id) \
339 _ClassDefInline_(name,id,virtual,) \
340 static int DeclFileLine() { return __LINE__; }
342 #define ClassDefInlineOverride(name,id) \
343 _ClassDefInline_(name,id,,override) \
344 static int DeclFileLine() { return __LINE__; }
346 #define ClassDefInlineNV(name,id) \
347 _ClassDefInline_(name,id,,) \
348 static int DeclFileLine() { return __LINE__; }
352 #define R__UseDummy(name) \
353 class _NAME2_(name,_c) { public: _NAME2_(name,_c)() { if (name) { } } }
356 #define ClassImpUnique(name,key) \
358 TGenericClassInfo *GenerateInitInstance(const name*); \
360 static int _R__UNIQUE_(_NAME2_(R__dummyint,key)) __attribute__((unused)) = \
361 GenerateInitInstance((name*)0x0)->SetImplFile(__FILE__, __LINE__); \
362 R__UseDummy(_R__UNIQUE_(_NAME2_(R__dummyint,key))); \
365 #define ClassImp(name) ClassImpUnique(name,default)
369 #define NamespaceImpUnique(name,key) \
372 ::ROOT::TGenericClassInfo *GenerateInitInstance(); \
374 static int _R__UNIQUE_(_NAME2_(R__dummyint,key)) = \
375 GenerateInitInstance()->SetImplFile(__FILE__, __LINE__); \
376 R__UseDummy(_R__UNIQUE_(_NAME2_(R__dummyint,key))); \
380 #define NamespaceImp(name) NamespaceImpUnique(name,default)
392 #define ClassDefT(name,id) \
393 _ClassDefOutline_(name,id,virtual,) \
394 static int DeclFileLine() { return __LINE__; }
396 #define ClassDefTNV(name,id) \
397 _ClassDefOutline_(name,id,virtual,) \
398 static int DeclFileLine() { return __LINE__; }
401 #define ClassDefT2(name,Tmpl)
403 #define templateClassImpUnique(name, key) \
406 _R__UNIQUE_(_NAME2_(R__dummyholder, key)) = ::ROOT::RegisterClassTemplate(_QUOTE_(name), __FILE__, __LINE__); \
407 R__UseDummy(_R__UNIQUE_(_NAME2_(R__dummyholder, key))); \
409 #define templateClassImp(name) templateClassImpUnique(name,default)
411 #define ClassImpT(name,Tmpl) templateClassImp(name)
418 #define ClassDef2T2(name,Tmpl1,Tmpl2)
419 #define ClassImp2T(name,Tmpl1,Tmpl2) templateClassImp(name)
427 #define ClassDef3T2(name,Tmpl1,Tmpl2,Tmpl3)
428 #define ClassImp3T(name,Tmpl1,Tmpl2,Tmpl3) templateClassImp(name)
433 #define RootClassVersion(name,VersionNumber) \
435 TGenericClassInfo *GenerateInitInstance(const name*); \
436 static Short_t _R__UNIQUE_(R__dummyVersionNumber) = \
437 GenerateInitInstance((name*)0x0)->SetVersion(VersionNumber); \
438 R__UseDummy(_R__UNIQUE_(R__dummyVersionNumber)); \
441 #define RootStreamer(name,STREAMER) \
443 TGenericClassInfo *GenerateInitInstance(const name*); \
444 static Short_t _R__UNIQUE_(R__dummyStreamer) = \
445 GenerateInitInstance((name*)0x0)->SetStreamer(STREAMER); \
446 R__UseDummy(_R__UNIQUE_(R__dummyStreamer)); \
456 # define _R_PragmaStr(x) _Pragma(#x)
457 # define R__LOAD_LIBRARY(LIBRARY) _R_PragmaStr(cling load ( #LIBRARY ))
458 # define R__ADD_INCLUDE_PATH(PATH) _R_PragmaStr(cling add_include_path ( #PATH ))
459 # define R__ADD_LIBRARY_PATH(PATH) _R_PragmaStr(cling add_library_path ( #PATH ))
460 #elif defined(R__WIN32)
461 # define _R_PragmaStr(x) __pragma(#x)
462 # define R__LOAD_LIBRARY(LIBRARY) _R_PragmaStr(comment(lib, #LIBRARY))
463 # define R__ADD_INCLUDE_PATH(PATH) _R_PragmaStr(comment(path, #PATH))
464 # define R__ADD_LIBRARY_PATH(PATH) _R_PragmaStr(comment(path, #PATH))
473 # define R__LOAD_LIBRARY(LIBRARY)
474 # define R__ADD_INCLUDE_PATH(PATH)
475 # define R__ADD_LIBRARY_PATH(PATH)
480 # define R__CLING_PTRCHECK(ONOFF) __attribute__((annotate("__cling__ptrcheck(" #ONOFF ")")))
482 # define R__CLING_PTRCHECK(ONOFF)
486 inline char *R__STRTOK_R(
char *str,
const char *delim,
char **saveptr)
488 #if defined(R__WIN32)
489 return strtok_s(str, delim, saveptr);
491 return strtok_r(str, delim, saveptr);