12 #ifndef ROOT_TIsAProxy
13 #define ROOT_TIsAProxy
27 class TIsAProxy :
public TVirtualIsAProxy {
29 template <
typename T>
using Atomic_t = std::atomic<T>;
31 const std::type_info *fType;
32 Atomic_t<TClass*> fClass;
33 Atomic_t<void*> fLast;
35 mutable Atomic_t<UInt_t> fSubTypesReaders;
36 Atomic_t<Bool_t> fSubTypesWriteLockTaken;
38 Atomic_t<Bool_t> fInit;
40 void* FindSubType(
const std::type_info*)
const;
41 void* CacheSubType(
const std::type_info*, TClass*);
43 TIsAProxy(
const TIsAProxy&) =
delete;
44 TIsAProxy& operator=(
const TIsAProxy&) =
delete;
48 TIsAProxy(
const std::type_info &typ);
52 virtual void SetClass(TClass *cl);
54 virtual TClass* operator()(
const void *obj);
62 template <
class T>
class TInstrumentedIsAProxy :
public TVirtualIsAProxy {
68 TInstrumentedIsAProxy(
const TInstrumentedIsAProxy& iip) :
69 TVirtualIsAProxy(iip), fClass(iip.fClass) { }
70 TInstrumentedIsAProxy& operator=(
const TInstrumentedIsAProxy& iip)
71 {
if(
this!=&iip) {TVirtualIsAProxy::operator=(iip); fClass=iip.fClass;}
76 TInstrumentedIsAProxy(TClass *cl) : fClass(cl) {}
78 virtual ~TInstrumentedIsAProxy() {}
80 virtual void SetClass(TClass *cl) { fClass = cl; }
82 virtual TClass* operator()(
const void *obj) {
83 return obj==0 ? fClass : ((
const T*)obj)->IsA();
87 #endif // ROOT_TIsAProxy