29 #define MESSAGE(which,text) 48 virtual ~TGenVectorProxy()
61 return ((
char*)fEnv->
fStart) + fValDiff*idx;
64 Fatal(
"TGenVectorProxy",
"At> Logic error - no proxy object set.");
73 TPushPop helper(proxy,ptr);
74 proxy->
Clear(
"force");
98 virtual ~TGenVectorBoolProxy()
102 virtual void* At(
UInt_t idx)
107 if ( fEnv && fEnv->fObject ) {
110 fEnv->fStart =
fFirst.invoke(fEnv);
114 fEnv->fIdx = idx - fEnv->fIdx;
115 if (! fEnv->fStart ) fEnv->fStart =
fFirst.invoke(fEnv);
120 typedef ROOT::TCollectionProxyInfo::Type<std::vector<Bool_t> >::Env_t EnvType_t;
121 EnvType_t *
e = (EnvType_t*)fEnv;
122 fLastValue = *(e->iter());
125 Fatal(
"TGenVectorProxy",
"At> Logic error - no proxy object set.");
129 virtual void DeleteItem(
Bool_t force,
void* ptr)
const 132 if ( force && ptr ) {
133 fVal->DeleteItem(ptr);
156 virtual ~TGenBitsetProxy()
160 virtual void* At(
UInt_t idx)
165 if ( fEnv && fEnv->fObject ) {
168 fEnv->fStart =
fFirst.invoke(fEnv);
172 fEnv->fIdx = idx - fEnv->fIdx;
173 if (! fEnv->fStart ) fEnv->fStart =
fFirst.invoke(fEnv);
178 typedef ROOT::TCollectionProxyInfo::Environ<std::pair<size_t,Bool_t> > EnvType_t;
179 EnvType_t *
e = (EnvType_t*)fEnv;
180 return &(e->fIterator.second);
182 Fatal(
"TGenVectorProxy",
"At> Logic error - no proxy object set.");
186 virtual void DeleteItem(
Bool_t force,
void* ptr)
const 189 if ( force && ptr ) {
190 fVal->DeleteItem(ptr);
205 class TGenListProxy :
public TGenVectorProxy {
212 virtual ~TGenListProxy()
218 if ( fEnv && fEnv->fObject ) {
222 return fEnv->fStart =
fFirst.invoke(fEnv);
224 fEnv->fIdx = idx - fEnv->fIdx;
225 if (! fEnv->fStart ) fEnv->fStart =
fFirst.invoke(fEnv);
226 void*
result = fNext.invoke(fEnv);
232 Fatal(
"TGenListProxy",
"At> Logic error - no proxy object set.");
247 class TGenSetProxy :
public TGenVectorProxy {
254 virtual ~TGenSetProxy()
260 if ( fEnv && fEnv->fObject ) {
261 if ( fEnv->fUseTemp ) {
262 return (((
char*)fEnv->fTemp)+idx*fValDiff);
267 return fEnv->fStart =
fFirst.invoke(fEnv);
269 fEnv->fIdx = idx - fEnv->fIdx;
270 if (! fEnv->fStart ) fEnv->fStart =
fFirst.invoke(fEnv);
271 void*
result = fNext.invoke(fEnv);
277 Fatal(
"TGenSetProxy",
"At> Logic error - no proxy object set.");
292 class TGenMapProxy :
public TGenSetProxy {
299 virtual ~TGenMapProxy()
303 virtual void DeleteItem(
Bool_t force,
void* ptr)
const 306 if ( fKey->fProperties&kNeedDelete) {
308 TPushPop helper(proxy,fKey->fCase&
kIsPointer ? *(
void**)ptr : ptr);
309 proxy->
Clear(
"force");
311 if ( fVal->fProperties&kNeedDelete) {
313 char *addr = ((
char*)ptr)+fValOffset;
314 TPushPop helper(proxy,fVal->fCase&
kIsPointer ? *(
void**)addr : addr);
315 proxy->
Clear(
"force");
319 fKey->DeleteItem(*(
void**)ptr);
322 char *addr = ((
char*)ptr)+fValOffset;
323 fVal->DeleteItem(*(
void**)addr);
333 std::string inside = (inside_type.find(
"const ")==0) ? inside_type.substr(6) : inside_type;
339 fSize = std::string::npos;
342 if ( inside.substr(0,6) ==
"string" || inside.substr(0,11) ==
"std::string" ) {
343 fCase = kBIT_ISSTRING;
345 fCtor =
fType->GetNew();
346 fDtor =
fType->GetDestructor();
347 fDelete =
fType->GetDelete();
348 switch(inside[inside.length()-1]) {
351 fSize =
sizeof(
void*);
354 fSize =
sizeof(std::string);
368 if (intype != inside) {
370 fSize =
sizeof(
void*);
372 fCase |= kBIT_ISTSTRING;
376 fCtor =
fType->GetNew();
377 fDtor =
fType->GetDestructor();
378 fDelete =
fType->GetDelete();
387 assert(typeTable &&
"The type of the list of type has changed");
388 assert(enumTable &&
"The type of the list of enum has changed");
390 TDataType *fundType = (
TDataType *)typeTable->THashTable::FindObject( intype.c_str() );
391 if (fundType && fundType->
GetType() < 0x17 && fundType->
GetType() > 0) {
399 if (intype != inside) {
401 fSize =
sizeof(
void*);
403 fSize = fundType->
Size();
405 }
else if (enumTable->THashList::FindObject( intype.c_str() ) ) {
408 fSize =
sizeof(
Int_t);
410 if (intype != inside) {
412 fSize =
sizeof(
void*);
429 if (intype != inside) {
431 fSize =
sizeof(
void*);
446 fSize =
sizeof(
Int_t);
453 fSize =
sizeof(
void*);
470 fundType =
gROOT->GetType( intype.c_str() );
472 if (intype !=
"long double") {
473 Error(
"TGenCollectionProxy",
"Unknown fundamental type %s",intype.c_str());
483 R__ASSERT((fKind>0 && fKind<0x17) || (fKind==-1&&(prop&kIsPointer)) );
490 fCase = prop & (kIsPointer|kIsFundamental|kIsEnum|
kIsClass);
492 fCase |= kBIT_ISTSTRING;
501 fProperties |= kNeedDelete;
505 if ( fSize == std::string::npos ) {
509 fSize =
fType->Size();
521 return fSize != std::string::npos;
533 fType->Destructor(ptr);
536 ::operator
delete(ptr);
564 fTypeinfo(copy.fTypeinfo)
625 Fatal(
"TGenCollectionProxy",
626 "%s %s are too large:%ld bytes. Maximum is:%ld bytes",
627 "Iterators for collection",
676 Fatal(
"TGenCollectionProxy",
677 "%s %s are too large:%ld bytes. Maximum is:%ld bytes",
678 "Iterators for collection",
695 void clearVector(vec&
v)
699 for(
typename vec::iterator i=v.begin(); i != v.end(); ++i) {
700 typename vec::value_type
e = *i;
723 std::map<std::string, TObjArray*>::iterator it;
746 return new TGenBitsetProxy(*
this);
750 return new TGenVectorBoolProxy(*
this);
752 return new TGenVectorProxy(*
this);
757 return new TGenListProxy(*
this);
762 return new TGenMapProxy(*
this);
767 return new TGenSetProxy(*
this);
779 if (
fValue.load() )
return p;
789 Fatal(
"TGenCollectionProxy",
"No 'size' function pointer for class %s present.",
fName.c_str());
792 Fatal(
"TGenCollectionProxy",
"No 'resize' function for class %s present.",
fName.c_str());
795 Fatal(
"TGenCollectionProxy",
"No 'next' function for class %s present.",
fName.c_str());
798 Fatal(
"TGenCollectionProxy",
"No 'begin' function for class %s present.",
fName.c_str());
801 Fatal(
"TGenCollectionProxy",
"No 'clear' function for class %s present.",
fName.c_str());
804 Fatal(
"TGenCollectionProxy",
"No 'block constructor' function for class %s present.",
fName.c_str());
807 Fatal(
"TGenCollectionProxy",
"No 'block destructor' function for class %s present.",
fName.c_str());
810 Fatal(
"TGenCollectionProxy",
"No 'data feed' function for class %s present.",
fName.c_str());
813 Fatal(
"TGenCollectionProxy",
"No 'data collect' function for class %s present.",
fName.c_str());
816 Fatal(
"TGenCollectionProxy",
"No 'environment creation' function for class %s present.",
fName.c_str());
827 Fatal(
"TGenCollectionProxy",
"Could not find %s!",name.c_str());
838 if (
fValue.load())
return this;
846 std::vector<std::string> inside;
850 Value* newfValue =
nullptr;
851 if ( inside[0].find(
"stdext::hash_") != std::string::npos )
852 inside[0].replace(3,10,
"::");
853 if ( inside[0].find(
"__gnu_cxx::hash_") != std::string::npos )
854 inside[0].replace(0,16,
"std::");
870 int slong =
sizeof(
void*);
876 nam =
"pair<"+inside[1]+
","+inside[2];
877 nam += (nam[nam.length()-1]==
'>') ?
" >" :
">";
919 Fatal(
"TGenCollectionProxy",
"Components of %s not analysed!",cl->
GetName());
921 Fatal(
"TGenCollectionProxy",
"Collection class %s not found!",
fTypeinfo.name());
983 return fValue.load() ? (*fValue).fType.GetClass() : 0;
995 if (
fValue.load() && (*fValue).fType == oldValueType) {
997 (*fValue).fType = newValueType;
1007 return (*fValue).fKind;
1053 Fatal(
"TGenCollectionProxy",
"At> Logic error - no proxy object set.");
1086 Fatal(
"TGenCollectionProxy",
"Size> Logic error - no proxy object set.");
1099 for (i=n; i<nold; ++i)
1108 Fatal(
"TGenCollectionProxy",
"Resize> Logic error - no proxy object set.");
1194 fFeed((
void*)data,container,size);
1227 if ( back->
fObject == objstart ) {
1275 if ( force && ptr ) {
1282 TPushPop helper(proxy,*(
void**)ptr);
1283 proxy->
Clear(
"force");
1290 proxy->
Clear(
"force");
1297 TPushPop helper(proxy,*(
void**)addr);
1298 proxy->
Clear(
"force");
1305 proxy->
Clear(
"force");
1314 TPushPop helper(proxy,*(
void**)ptr);
1315 proxy->
Clear(
"force");
1322 proxy->
Clear(
"force");
1335 MayNotUse(
"TGenCollectionProxy::ReadBuffer(TBuffer &, void *, const TClass *)");
1342 MayNotUse(
"TGenCollectionProxy::ReadBuffer(TBuffer &, void *)");
1354 Fatal(
"TGenCollectionProxy",
"Streamer> Logic error - no proxy object set.");
1375 struct TGenCollectionProxy__SlowIterator {
1385 new (*begin_arena) TGenCollectionProxy__SlowIterator(proxy);
1393 TGenCollectionProxy__SlowIterator *iterator = (TGenCollectionProxy__SlowIterator*)iter;
1394 if (iterator->fIndex != *(
UInt_t*)end) {
1395 void *
result = iterator->fProxy->At(iterator->fIndex);
1396 ++(iterator->fIndex);
1407 *(TGenCollectionProxy__SlowIterator*)dest = *(TGenCollectionProxy__SlowIterator*)source;
1432 std::vector<char> *vec = (std::vector<char>*)obj;
1438 *begin_arena = &(*vec->begin());
1439 #ifdef R__VISUAL_CPLUSPLUS 1440 *end_arena = &(*(vec->end()-1)) + 1;
1443 *end_arena = &(*vec->end());
1461 *(
void**)dest = *(
void**)source;
1487 *end_arena = s->
GetEnd();
1503 *(
void**)dest = *(
void**)source;
1665 if (oldClass == 0) {
1671 std::map<std::string, TObjArray*>::iterator it;
1689 if (valueClass == 0) {
1703 (*fConversionReadMemberWise)[oldClass->
GetName()] = arr;
Method fSize
Container accessors: size of container.
double read(const std::string &file_name)
reading
void(* fDeleteSingleIterator)(void *iter)
void * TGenCollectionProxy__StagingCopyIterator(void *dest, const void *source)
void DeleteItem(void *ptr)
DeleteIterator_t fFunctionDeleteIterator
void *(* fSizeFunc)(void *)
void TGenCollectionProxy__StagingDeleteSingleIterators(void *)
Nothing to do.
virtual TStreamerInfoActions::TActionSequence * GetReadMemberWiseActions(Int_t version)
Return the set of action necessary to stream in this collection member-wise coming from the old value...
virtual Int_t GetProperties() const
Proxies_t fProxyKept
Optimization: Keep proxies once they were created.
virtual TVirtualCollectionProxy * Generate() const
Virtual copy constructor.
DeleteTwoIterators_t fFunctionDeleteTwoIterators
void * invoke(void *obj) const
void *(* fNext)(void *iter, const void *end)
UInt_t fProperties
Additional properties of the value type (kNeedDelete)
void *(* fConstructFunc)(void *, size_t)
void TGenCollectionProxy__VectorDeleteTwoIterators(void *, void *)
Nothing to do.
void(* fResizeFunc)(void *, size_t)
virtual void UpdateValueClass(const TClass *oldcl, TClass *newcl)
Update the internal ValueClass when a TClass constructor need to replace an emulated TClass by the re...
void Fatal(const char *location, const char *msgfmt,...)
Bool_t fPointers
Flag to indicate if containee has pointers (key or value)
std::map< std::string, TObjArray * > * fConversionReadMemberWise
Array of bundle of TStreamerInfoActions to stream out (read) derived from another class...
TGenCollectionProxy * Initialize(Bool_t silent) const
Proxy initializer.
Collectfunc_t fCollect
Method to collect objects from container.
std::string fName
Name of the class being proxied.
int GetSplit(const char *type, std::vector< std::string > &output, int &nestedLoc, EModType mode=TClassEdit::kNone)
Stores in output (after emptying it) the split type.
R__EXTERN TVirtualMutex * gInterpreterMutex
virtual TStreamerInfoActions::TActionSequence * GetWriteMemberWiseActions()
Return the set of action necessary to stream out this collection member-wise.
virtual void PopProxy()
Remove the last object.
const char * GetFullTypeName() const
Get full type description of typedef, e,g.: "class TDirectory*".
virtual void Insert(const void *data, void *container, size_t size)
Insert data into the container where data is a C-style array of the actual type contained in the coll...
Method fFirst
Container accessors: generic iteration: first.
Buffer base class used for serializing objects.
virtual TypeInfo_t * TypeInfo_Factory() const
TClass * fOnFileClass
On file class.
Feedfunc_t fFeed
Container accessors: block feed.
void *(* fFeedFunc)(void *, void *, size_t)
virtual void Clear(const char *opt="")=0
void *(* fClearFunc)(void *)
#define MESSAGE(which, text)
UInt_t fCase
type of data of Value_type
virtual Bool_t HasPointers() const
Return true if the content is of type 'pointer to'.
void * TGenCollectionProxy__StagingNext(void *, const void *)
Should not be used.
void *(* CopyIterator_t)(void *dest, const void *source)
virtual ULong_t GetIncrement() const
Return the offset between two consecutive value_types (memory layout).
Sizing_t fResize
Container accessors: resize container.
static TActionSequence * CreateReadMemberWiseActions(TVirtualStreamerInfo *info, TVirtualCollectionProxy &proxy)
Create the bundle of the actions necessary for the streaming memberwise of the content described by '...
size_t fSize
fSize of the contained object
virtual int TypeInfo_Size(TypeInfo_t *) const
void(* DeleteIterator_t)(void *iter)
virtual Int_t GetCollectionType() const
Return the type of collection see TClassEdit::ESTLType.
virtual void DeleteItem(Bool_t force, void *ptr) const
Call to delete/destruct individual item.
void * TGenCollectionProxy__SlowNext(void *iter, const void *end)
void * TGenCollectionProxy__VectorNext(void *, const void *)
Should not be used.
TObjArray * fReadMemberWise
Array of bundle of TStreamerInfoActions to stream out (read)
CopyIterator_t fFunctionCopyIterator
THashTable implements a hash table to store TObject's.
void TGenCollectionProxy__SlowCreateIterators(void *, void **begin_arena, void **end_arena, TVirtualCollectionProxy *proxy)
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
static TGenCollectionProxy::Value * R__CreateValue(const std::string &name, Bool_t silent)
Utility routine to issue a Fatal error is the Value object is not valid.
virtual CreateIterators_t GetFunctionCreateIterators(Bool_t read=kTRUE)
See typedef void (*CreateIterators_t)(void *collection, void *&begin_arena, void *&end_arena); begin_...
virtual TStreamerInfoActions::TActionSequence * GetConversionReadMemberWiseActions(TClass *oldClass, Int_t version)
Return the set of action necessary to stream in this collection member-wise coming from the old value...
virtual void TypeInfo_Delete(TypeInfo_t *) const
void TGenCollectionProxy__SlowDeleteTwoIterators(void *, void *)
Nothing to do.
virtual Bool_t TypeInfo_IsValid(TypeInfo_t *) const
virtual UInt_t Size() const
Return the current size of the container.
ROOT::ESTLType STLKind(std::string_view type)
Converts STL container name to number.
Proxies_t fProxyList
Stack of recursive proxies.
Method fClear
Method cache for container accessors: clear container.
Method0 fCreateEnv
Method to allocate an Environment holder.
ArrIterfunc_t fConstruct
Container accessors: block construct.
virtual void Streamer(TBuffer &refBuffer)
Streamer Function.
void Error(const char *location, const char *msgfmt,...)
void SetTarget(void *target)
Staged_t fStaged
Optimization: Keep staged array once they were created.
void MayNotUse(const char *method)
This function can be used in classes that should override a certain function, but in the inherited cl...
void TGenCollectionProxy__StagingDeleteTwoIterators(void *, void *)
Nothing to do.
virtual EDataType GetType() const
If the content is a simple numerical value, return its type (see TDataType)
int fValOffset
Offset from key to value (in maps)
Small helper to save proxy environment in the event of recursive calls.
virtual void AddAtAndExpand(TObject *obj, Int_t idx)
Add object at position idx.
int fSTL_type
STL container type.
TVirtualStreamerInfo * GetStreamerInfo(Int_t version=0) const
returns a pointer to the TVirtualStreamerInfo object for version If the object does not exist...
#define dest(otri, vertexptr)
void(* CreateIterators_t)(void *collection, void **begin_arena, void **end_arena, TVirtualCollectionProxy *proxy)
Basic data type descriptor (datatype information is obtained from CINT).
virtual void TypeInfo_Init(TypeInfo_t *, const char *) const
TVirtualStreamerInfo * GetConversionStreamerInfo(const char *onfile_classname, Int_t version) const
Return a Conversion StreamerInfo from the class 'classname' for version number 'version' to this clas...
virtual void Commit(void *env)
Commit the change.
static TActionSequence * CreateWriteMemberWiseActions(TVirtualStreamerInfo *info, TVirtualCollectionProxy &proxy)
Create the bundle of the actions necessary for the streaming memberwise of the content described by '...
void *(* fCopyIterator)(void *dest, const void *source)
virtual Long_t TypeInfo_Property(TypeInfo_t *) const
virtual void PushProxy(void *objstart)
Add an object.
virtual Next_t GetFunctionNext(Bool_t read=kTRUE)
See typedef void* (*Next_t)(void *iter, void *end); iter and end should be pointer to respectively an...
virtual const char * GetName() const
Returns name of object.
CreateIterators_t fFunctionCreateIterators
The ROOT global object gROOT contains a list of all defined classes.
Next_t fFunctionNextIterator
int fValDiff
Offset between two consecutive value_types (memory layout).
void TGenCollectionProxy__SlowDeleteSingleIterators(void *)
Nothing to do.
#define R__LOCKGUARD2(mutex)
void(* fDestructFunc)(void *, size_t)
virtual void Resize(UInt_t n, Bool_t force_delete)
Resize the container.
virtual Int_t GetSize() const
void *(* fNextFunc)(void *)
virtual DeleteIterator_t GetFunctionDeleteIterator(Bool_t read=kTRUE)
See typedef void (*DeleteIterator_t)(void *iter); If the sizeof iterator is greater than fgIteratorAr...
void *(* fFirstFunc)(void *)
virtual DeleteTwoIterators_t GetFunctionDeleteTwoIterators(Bool_t read=kTRUE)
See typedef void (*DeleteTwoIterators_t)(void *begin, void *end); If the sizeof iterator is greater t...
virtual TGenCollectionProxy * InitializeEx(Bool_t silent)
Proxy initializer.
void TGenCollectionProxy__StagingCreateIterators(void *obj, void **begin_arena, void **end_arena, TVirtualCollectionProxy *)
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
void CheckFunctions() const
Check existence of function pointers.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
std::atomic< Value * > fValue
Descriptor of the container value type.
TClassRef fType
TClass reference of Value_type in collection.
virtual void Clear(const char *opt="")
Clear the emulated collection.
virtual void ReadBuffer(TBuffer &b, void *obj)
virtual CopyIterator_t GetFunctionCopyIterator(Bool_t read=kTRUE)
See typedef void (*CopyIterator_t)(void *&dest, const void *source); Copy the iterator source...
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
virtual TClass * GetValueClass() const
Return a pointer to the TClass representing the content.
Value(const std::string &info, Bool_t silent)
Constructor.
virtual void * At(UInt_t idx)
Return the address of the value at index 'idx'.
Int_t Size() const
Get size of basic typedef'ed type.
void * TGenCollectionProxy__VectorCopyIterator(void *dest, const void *source)
TClass * GetClass() const
Value * fKey
Descriptor of the key_type.
virtual void operator()(TBuffer &refBuffer, void *pObject)
TClassStreamer IO overload.
void * TGenCollectionProxy__SlowCopyIterator(void *dest, const void *source)
void *(* fCollectFunc)(void *, void *)
Small helper to stage the content of an associative container when reading and before inserting it in...
Proxy around an arbitrary container, which implements basic functionality and iteration.
EnvironBase_t * fEnv
Address of the currently proxied object.
std::string ShortType(const char *typeDesc, int mode)
Return the absolute type of typeDesc.
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
Sizing_t fDestruct
Container accessors: block destruct.
void TGenCollectionProxy__VectorCreateIterators(void *obj, void **begin_arena, void **end_arena, TVirtualCollectionProxy *)
We can safely assume that the std::vector layout does not really depend on the content! ...
Bool_t IsValid()
Return true if the Value has been properly initialized.
void(* fDeleteTwoIterators)(void *begin, void *end)
Method fNext
Container accessors: generic iteration: next.
void *(* Next_t)(void *iter, const void *end)
Info_t fTypeinfo
Type information.
TObject * At(Int_t idx) const
R__EXTERN TInterpreter * gCling
void Streamer(void *obj, TBuffer &b, const TClass *onfile_class=0) const
void Resize(size_t nelement)
Abstract Interface class describing Streamer information for one class.
virtual TClass * GetCollectionClass() const
Return a pointer to the TClass representing the container.
void(* DeleteTwoIterators_t)(void *begin, void *end)
virtual UInt_t Sizeof() const
Return the sizeof the collection object.
const std::type_info & Info_t
void(* fCreateIterators)(void *collection, void **begin_arena, void **end_arena, TVirtualCollectionProxy *proxy)
TStreamerInfoActions::TActionSequence * fWriteMemberWise
Int_t Size() const
Return size of object of this class.
Small helper to describe the Value_type or the key_type of an STL container.
void TGenCollectionProxy__VectorDeleteSingleIterators(void *)
Nothing to do.
virtual ~TGenCollectionProxy()
Standard destructor.
virtual void * Allocate(UInt_t n, Bool_t forceDelete)
Allocate the needed space.
Value * fVal
Descriptor of the Value_type.
virtual UInt_t Size() const =0