15 #include "TClassEdit.h"
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()
109 fLastValue = (*vec)[idx];
113 Fatal(
"TGenVectorProxy",
"At> Logic error - no proxy object set.");
120 if ( force && ptr ) {
144 virtual ~TGenBitsetProxy()
166 typedef ROOT::TCollectionProxyInfo::Environ<std::pair<size_t,Bool_t> > EnvType_t;
167 EnvType_t *
e = (EnvType_t*)fEnv;
168 return &(e->fIterator.second);
170 Fatal(
"TGenVectorProxy",
"At> Logic error - no proxy object set.");
177 if ( force && ptr ) {
193 class TGenListProxy :
public TGenVectorProxy {
200 virtual ~TGenListProxy()
220 Fatal(
"TGenListProxy",
"At> Logic error - no proxy object set.");
235 class TGenSetProxy :
public TGenVectorProxy {
242 virtual ~TGenSetProxy()
250 return (((
char*)
fEnv->
fTemp)+idx*fValDiff);
265 Fatal(
"TGenSetProxy",
"At> Logic error - no proxy object set.");
280 class TGenMapProxy :
public TGenSetProxy {
287 virtual ~TGenMapProxy()
291 virtual void DeleteItem(
Bool_t force,
void* ptr)
const
297 proxy->
Clear(
"force");
303 proxy->
Clear(
"force");
321 std::string inside = (inside_type.find(
"const ")==0) ? inside_type.substr(6) : inside_type;
327 fSize = std::string::npos;
329 std::string intype = TClassEdit::ShortType(inside.c_str(),TClassEdit::kDropTrailStar );
330 if ( inside.substr(0,6) ==
"string" || inside.substr(0,11) ==
"std::string" ) {
336 switch(inside[inside.length()-1]) {
339 fSize =
sizeof(
void*);
342 fSize =
sizeof(std::string);
356 if (intype != inside) {
358 fSize =
sizeof(
void*);
375 assert(typeTable &&
"The type of the list of type has changed");
376 assert(enumTable &&
"The type of the list of enum has changed");
378 TDataType *fundType = (
TDataType *)typeTable->THashTable::FindObject( intype.c_str() );
379 if (fundType && fundType->
GetType() < 0x17 && fundType->
GetType() > 0) {
384 if (intype != inside) {
386 fSize =
sizeof(
void*);
390 }
else if (enumTable->THashList::FindObject( intype.c_str() ) ) {
395 if (intype != inside) {
397 fSize =
sizeof(
void*);
414 if (intype != inside) {
416 fSize =
sizeof(
void*);
438 fSize =
sizeof(
void*);
455 fundType =
gROOT->GetType( intype.c_str() );
457 if (intype !=
"long double") {
458 Error(
"TGenCollectionProxy",
"Unknown fundamental type %s",intype.c_str());
487 if (
fSize == std::string::npos ) {
503 return fSize != std::string::npos;
515 fType->Destructor(ptr);
518 ::operator
delete(ptr);
607 Fatal(
"TGenCollectionProxy",
608 "%s %s are too large:%ld bytes. Maximum is:%ld bytes",
609 "Iterators for collection",
629 fTypeinfo(info.fInfo), fOnFileClass(0)
658 Fatal(
"TGenCollectionProxy",
659 "%s %s are too large:%ld bytes. Maximum is:%ld bytes",
660 "Iterators for collection",
677 void clearVector(vec&
v)
681 for(
typename vec::iterator i=v.begin(); i != v.end(); ++i) {
682 typename vec::value_type
e = *i;
705 std::map<std::string, TObjArray*>::iterator it;
727 case ROOT::kSTLbitset: {
728 return new TGenBitsetProxy(*
this);
730 case ROOT::kSTLvector: {
731 if ((*fValue).fKind ==
kBool_t) {
732 return new TGenVectorBoolProxy(*
this);
734 return new TGenVectorProxy(*
this);
738 case ROOT::kSTLforwardlist:
739 return new TGenListProxy(*
this);
741 case ROOT::kSTLunorderedmap:
742 case ROOT::kSTLmultimap:
743 case ROOT::kSTLunorderedmultimap:
744 return new TGenMapProxy(*
this);
746 case ROOT::kSTLunorderedset:
747 case ROOT::kSTLmultiset:
748 case ROOT::kSTLunorderedmultiset:
749 return new TGenSetProxy(*
this);
761 if (
fValue.load() )
return p;
771 Fatal(
"TGenCollectionProxy",
"No 'size' function pointer for class %s present.",
fName.c_str());
774 Fatal(
"TGenCollectionProxy",
"No 'resize' function for class %s present.",
fName.c_str());
777 Fatal(
"TGenCollectionProxy",
"No 'next' function for class %s present.",
fName.c_str());
780 Fatal(
"TGenCollectionProxy",
"No 'begin' function for class %s present.",
fName.c_str());
783 Fatal(
"TGenCollectionProxy",
"No 'clear' function for class %s present.",
fName.c_str());
786 Fatal(
"TGenCollectionProxy",
"No 'block constructor' function for class %s present.",
fName.c_str());
789 Fatal(
"TGenCollectionProxy",
"No 'block destructor' function for class %s present.",
fName.c_str());
792 Fatal(
"TGenCollectionProxy",
"No 'data feed' function for class %s present.",
fName.c_str());
795 Fatal(
"TGenCollectionProxy",
"No 'data collect' function for class %s present.",
fName.c_str());
798 Fatal(
"TGenCollectionProxy",
"No 'environment creation' function for class %s present.",
fName.c_str());
809 Fatal(
"TGenCollectionProxy",
"Could not find %s!",name.c_str());
820 if (
fValue.load())
return this;
828 std::vector<std::string> inside;
829 int num = TClassEdit::GetSplit(cl->
GetName(),inside,nested);
832 Value* newfValue =
nullptr;
833 if ( inside[0].find(
"stdext::hash_") != std::string::npos )
834 inside[0].replace(3,10,
"::");
835 if ( inside[0].find(
"__gnu_cxx::hash_") != std::string::npos )
836 inside[0].replace(0,16,
"std::");
837 fSTL_type = TClassEdit::STLKind(inside[0].c_str());
840 case ROOT::kSTLunorderedmap:
841 case ROOT::kSTLmultimap:
842 case ROOT::kSTLunorderedmultimap:
844 case ROOT::kSTLunorderedset:
845 case ROOT::kSTLmultiset:
846 case ROOT::kSTLunorderedmultiset:
847 case ROOT::kSTLbitset:
852 int slong =
sizeof(
void*);
855 case ROOT::kSTLunorderedmap:
856 case ROOT::kSTLmultimap:
857 case ROOT::kSTLunorderedmultimap:
858 nam =
"pair<"+inside[1]+
","+inside[2];
859 nam += (nam[nam.length()-1]==
'>') ?
" >" :
">";
878 case ROOT::kSTLbitset:
901 Fatal(
"TGenCollectionProxy",
"Components of %s not analysed!",cl->
GetName());
903 Fatal(
"TGenCollectionProxy",
"Collection class %s not found!",
fTypeinfo.name());
966 return fValue.load() ? (*fValue).fType.GetClass() : 0;
978 if (
fValue.load() && (*fValue).fType == oldValueType) {
980 (*fValue).fType = newValueType;
990 return (*fValue).fKind;
1000 case ROOT::kSTLvector:
1001 if ((*fValue).fKind ==
kBool_t) {
1015 case ROOT::kSTLbitset: {
1028 typedef ROOT::TCollectionProxyInfo::Environ <std::pair<size_t, Bool_t>> EnvType_t;
1029 EnvType_t *
e = (EnvType_t *)
fEnv;
1030 return &(e->fIterator.second);
1033 case ROOT::kSTLunorderedset:
1034 case ROOT::kSTLmultiset:
1035 case ROOT::kSTLunorderedmultiset:
1037 case ROOT::kSTLunorderedmap:
1038 case ROOT::kSTLmultimap:
1039 case ROOT::kSTLunorderedmultimap:
1059 Fatal(
"TGenCollectionProxy",
"At> Logic error - no proxy object set.");
1092 Fatal(
"TGenCollectionProxy",
"Size> Logic error - no proxy object set.");
1105 for (i=n; i<nold; ++i)
1114 Fatal(
"TGenCollectionProxy",
"Resize> Logic error - no proxy object set.");
1127 case ROOT::kSTLunorderedset:
1128 case ROOT::kSTLmultiset:
1129 case ROOT::kSTLunorderedmultiset:
1131 case ROOT::kSTLunorderedmap:
1132 case ROOT::kSTLmultimap:
1133 case ROOT::kSTLunorderedmultimap:{
1161 case ROOT::kSTLvector:
1162 case ROOT::kSTLlist:
1163 case ROOT::kSTLforwardlist:
1164 case ROOT::kSTLdeque:
1172 case ROOT::kSTLbitset: {
1200 fFeed((
void*)data,container,size);
1233 if ( back->
fObject == objstart ) {
1281 if ( force && ptr ) {
1284 case ROOT::kSTLunorderedmap:
1285 case ROOT::kSTLmultimap:
1286 case ROOT::kSTLunorderedmultimap:{
1290 TPushPop helper(proxy,*(
void**)ptr);
1291 proxy->
Clear(
"force");
1298 proxy->
Clear(
"force");
1305 TPushPop helper(proxy,*(
void**)addr);
1306 proxy->
Clear(
"force");
1313 proxy->
Clear(
"force");
1322 TPushPop helper(proxy,*(
void**)ptr);
1323 proxy->
Clear(
"force");
1330 proxy->
Clear(
"force");
1343 MayNotUse(
"TGenCollectionProxy::ReadBuffer(TBuffer &, void *, const TClass *)");
1350 MayNotUse(
"TGenCollectionProxy::ReadBuffer(TBuffer &, void *)");
1362 Fatal(
"TGenCollectionProxy",
"Streamer> Logic error - no proxy object set.");
1383 struct TGenCollectionProxy__SlowIterator {
1393 new (*begin_arena) TGenCollectionProxy__SlowIterator(proxy);
1401 TGenCollectionProxy__SlowIterator *iterator = (TGenCollectionProxy__SlowIterator*)iter;
1402 if (iterator->fIndex != *(
UInt_t*)end) {
1403 void *
result = iterator->fProxy->At(iterator->fIndex);
1404 ++(iterator->fIndex);
1415 *(TGenCollectionProxy__SlowIterator*)dest = *(TGenCollectionProxy__SlowIterator*)source;
1440 std::vector<char> *vec = (std::vector<char>*)obj;
1446 *begin_arena = &(*vec->begin());
1447 #ifdef R__VISUAL_CPLUSPLUS
1448 *end_arena = &(*(vec->end()-1)) + 1;
1451 *end_arena = &(*vec->end());
1469 *(
void**)dest = *(
void**)source;
1495 *end_arena = s->
GetEnd();
1511 *(
void**)dest = *(
void**)source;
1673 if (oldClass == 0) {
1679 std::map<std::string, TObjArray*>::iterator it;
1697 if (valueClass == 0) {
1711 (*fConversionReadMemberWise)[oldClass->
GetName()] = arr;
void *(* fSizeFunc)(void *)
Method fSize
Container accessors: size of container.
void(* DeleteIterator_t)(void *iter)
double read(const std::string &file_name)
reading
void *(* fNext)(void *iter, const void *end)
void * TGenCollectionProxy__StagingCopyIterator(void *dest, const void *source)
void DeleteItem(void *ptr)
DeleteIterator_t fFunctionDeleteIterator
void TGenCollectionProxy__StagingDeleteSingleIterators(void *)
Nothing to do.
ROOT::DelFunc_t fDelete
Method cache for containee delete.
void(* fDeleteTwoIterators)(void *begin, void *end)
ROOT::NewFunc_t fCtor
Method cache for containee constructor.
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
UInt_t fProperties
Additional properties of the value type (kNeedDelete)
void *(* fCollectFunc)(void *, void *)
void TGenCollectionProxy__VectorDeleteTwoIterators(void *, void *)
Nothing to do.
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,...)
void(* fDestructFunc)(void *, size_t)
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.
ROOT::DesFunc_t GetDestructor() const
std::string fName
Name of the class being proxied.
R__EXTERN TVirtualMutex * gInterpreterMutex
void *(* fCopyIterator)(void *dest, const void *source)
virtual TStreamerInfoActions::TActionSequence * GetWriteMemberWiseActions()
Return the set of action necessary to stream out this collection member-wise.
virtual void PopProxy()
Remove the last object.
void *(* fFeedFunc)(void *, void *, size_t)
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.
void(* fResizeFunc)(void *, size_t)
virtual TypeInfo_t * TypeInfo_Factory() const
TClass * fOnFileClass
On file class.
Feedfunc_t fFeed
Container accessors: block feed.
ROOT::NewFunc_t GetNew() const
virtual void Clear(const char *opt="")=0
#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.
virtual ULong_t GetIncrement() const
Return the offset between two consecutive value_types (memory layout).
Sizing_t fResize
Container accessors: resize container.
void *(* CopyIterator_t)(void *dest, const void *source)
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
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
void *(* fConstructFunc)(void *, size_t)
virtual UInt_t Size() const
Return the current size of the container.
Proxies_t fProxyList
Stack of recursive proxies.
Method fClear
Method cache for container accessors: clear container.
void *(* fNextFunc)(void *)
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,...)
EDataType fKind
kind of ROOT-fundamental type
ROOT::DelFunc_t GetDelete() const
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.
void *(* fClearFunc)(void *)
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...
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(* fDeleteSingleIterator)(void *iter)
void(* fCreateIterators)(void *collection, void **begin_arena, void **end_arena, TVirtualCollectionProxy *proxy)
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.
void *(* fFirstFunc)(void *)
Next_t fFunctionNextIterator
int fValDiff
Offset between two consecutive value_types (memory layout).
void TGenCollectionProxy__SlowDeleteSingleIterators(void *)
Nothing to do.
#define R__LOCKGUARD2(mutex)
virtual void Resize(UInt_t n, Bool_t force_delete)
Resize the container.
virtual Int_t GetSize() const
virtual DeleteIterator_t GetFunctionDeleteIterator(Bool_t read=kTRUE)
See typedef void (*DeleteIterator_t)(void *iter); If the sizeof iterator is greater than fgIteratorAr...
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(* CreateIterators_t)(void *collection, void **begin_arena, void **end_arena, TVirtualCollectionProxy *proxy)
void *(* Next_t)(void *iter, const void *end)
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
virtual UInt_t Size() const =0
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)
Small helper to stage the content of an associative container when reading and before inserting it in...
#define dest(otri, vertexptr)
Proxy around an arbitrary container, which implements basic functionality and iteration.
EnvironBase_t * fEnv
Address of the currently proxied object.
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.
Method fNext
Container accessors: generic iteration: next.
void(* DeleteTwoIterators_t)(void *begin, 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.
virtual UInt_t Sizeof() const
Return the sizeof the collection object.
const std::type_info & Info_t
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.
ROOT::DesFunc_t fDtor
Method cache for containee destructor.