34 TGenCollectionStreamer::TGenCollectionStreamer(
const TGenCollectionStreamer& copy)
 
   35       : TGenCollectionProxy(copy), fReadBufferFunc(&TGenCollectionStreamer::ReadBufferDefault)
 
   40 TGenCollectionStreamer::TGenCollectionStreamer(Info_t info, 
size_t iter_size)
 
   41       : TGenCollectionProxy(info, iter_size), fReadBufferFunc(&TGenCollectionStreamer::ReadBufferDefault)
 
   46 TGenCollectionStreamer::TGenCollectionStreamer(const ::ROOT::TCollectionProxyInfo &info, TClass *cl)
 
   47       : TGenCollectionProxy(info, cl), fReadBufferFunc(&TGenCollectionStreamer::ReadBufferDefault)
 
   52 TGenCollectionStreamer::~TGenCollectionStreamer()
 
   57 TVirtualCollectionProxy* TGenCollectionStreamer::Generate()
 const 
   60    if (!fValue.load()) Initialize(kFALSE);
 
   61    return new TGenCollectionStreamer(*
this);
 
   65 static T* getaddress(TGenCollectionProxy::StreamHelper &itm);
 
   68 bool* getaddress<bool>(TGenCollectionProxy::StreamHelper &itm)
 
   74 Char_t* getaddress<Char_t>(TGenCollectionProxy::StreamHelper &itm)
 
   80 Short_t* getaddress<Short_t>(TGenCollectionProxy::StreamHelper &itm)
 
   86 Int_t* getaddress<Int_t>(TGenCollectionProxy::StreamHelper &itm)
 
   92 Long_t* getaddress<Long_t>(TGenCollectionProxy::StreamHelper &itm)
 
   98 Long64_t* getaddress<Long64_t>(TGenCollectionProxy::StreamHelper &itm)
 
  100    return &itm.s_longlong;
 
  104 Float_t* getaddress<Float_t>(TGenCollectionProxy::StreamHelper &itm)
 
  110 Double_t* getaddress<Double_t>(TGenCollectionProxy::StreamHelper &itm)
 
  116 UChar_t* getaddress<UChar_t>(TGenCollectionProxy::StreamHelper &itm)
 
  122 UShort_t* getaddress<UShort_t>(TGenCollectionProxy::StreamHelper &itm)
 
  128 UInt_t* getaddress<UInt_t>(TGenCollectionProxy::StreamHelper &itm)
 
  134 ULong_t* getaddress<ULong_t>(TGenCollectionProxy::StreamHelper &itm)
 
  140 ULong64_t* getaddress<ULong64_t>(TGenCollectionProxy::StreamHelper &itm)
 
  142    return &itm.u_longlong;
 
  145 template <
typename From, 
typename To>
 
  146 void ConvertArray(TGenCollectionProxy::StreamHelper *read, TGenCollectionProxy::StreamHelper *write, 
int nElements)
 
  148    From *r = getaddress<From>( *read );
 
  149    To *w = getaddress<To>( *write );
 
  150    for(
int i = 0; i < nElements; ++i) {
 
  156 template <
typename From>
 
  157 void DispatchConvertArray(
int writeType, TGenCollectionProxy::StreamHelper *read, TGenCollectionProxy::StreamHelper *write, 
int nElements)
 
  161          ConvertArray<From,bool>(read,write,nElements);
 
  164          ConvertArray<From,Char_t>(read,write,nElements);
 
  167          ConvertArray<From,Short_t>(read,write,nElements);
 
  170          ConvertArray<From,Int_t>(read,write,nElements);
 
  173          ConvertArray<From,Long64_t>(read,write,nElements);
 
  176          ConvertArray<From,Long64_t>(read,write,nElements);
 
  179          ConvertArray<From,Float_t>(read,write,nElements);
 
  182          ConvertArray<From,Float16_t>(read,write,nElements);
 
  185          ConvertArray<From,Double_t>(read,write,nElements);
 
  188          ConvertArray<From,UChar_t>(read,write,nElements);
 
  191          ConvertArray<From,UShort_t>(read,write,nElements);
 
  194          ConvertArray<From,UInt_t>(read,write,nElements);
 
  197          ConvertArray<From,ULong_t>(read,write,nElements);
 
  200          ConvertArray<From,ULong64_t>(read,write,nElements);
 
  203          ConvertArray<From,Double32_t>(read,write,nElements);
 
  208          Error(
"TGenCollectionStreamer", 
"fType %d is not supported yet!\n", writeType);
 
  212 void TGenCollectionStreamer::ReadPrimitives(
int nElements, TBuffer &b, 
const TClass *onFileClass)
 
  215    size_t len = fValDiff * nElements;
 
  219    StreamHelper* itmstore = 0;
 
  220    StreamHelper* itmconv = 0;
 
  221    fEnv->fSize = nElements;
 
  223       case ROOT::kSTLvector:
 
  224          if (fVal->fKind != kBool_t)  {
 
  225             fResize(fEnv->fObject,fEnv->fSize);
 
  228             TVirtualVectorIterators iterators(fFunctionCreateIterators);
 
  229             iterators.CreateIterators(fEnv->fObject);
 
  230             itmstore = (StreamHelper*)iterators.fBegin;
 
  231             fEnv->fStart = itmstore;
 
  236          itmstore = (StreamHelper*)(len < 
sizeof(buffer) ? buffer : memory =::operator 
new(len));
 
  239    fEnv->fStart = itmstore;
 
  241    StreamHelper *itmread;
 
  244       readkind = onFileClass->GetCollectionProxy()->GetType();
 
  245       itmconv = (StreamHelper*) ::
operator new( nElements * onFileClass->GetCollectionProxy()->GetIncrement() );
 
  249       readkind = fVal->fKind;
 
  253          b.ReadFastArray(&itmread->boolean   , nElements);
 
  256          b.ReadFastArray(&itmread->s_char    , nElements);
 
  259          b.ReadFastArray(&itmread->s_short   , nElements);
 
  262          b.ReadFastArray(&itmread->s_int     , nElements);
 
  265          b.ReadFastArray(&itmread->s_long    , nElements);
 
  268          b.ReadFastArray(&itmread->s_longlong, nElements);
 
  271          b.ReadFastArray(&itmread->flt       , nElements);
 
  274          b.ReadFastArrayFloat16(&itmread->flt, nElements);
 
  277          b.ReadFastArray(&itmread->dbl       , nElements);
 
  280          b.ReadFastArray(&itmread->u_char    , nElements);
 
  283          b.ReadFastArray(&itmread->u_short   , nElements);
 
  286          b.ReadFastArray(&itmread->u_int     , nElements);
 
  289          b.ReadFastArray(&itmread->u_long    , nElements);
 
  292          b.ReadFastArray(&itmread->u_longlong, nElements);
 
  295          b.ReadFastArrayDouble32(&itmread->dbl, nElements);
 
  300          Error(
"TGenCollectionStreamer", 
"fType %d is not supported yet!\n", readkind);
 
  305             DispatchConvertArray<bool>(fVal->fKind, itmread, itmstore, nElements);
 
  308             DispatchConvertArray<Char_t>(fVal->fKind, itmread, itmstore, nElements);
 
  311             DispatchConvertArray<Short_t>(fVal->fKind, itmread, itmstore, nElements);
 
  314             DispatchConvertArray<Int_t>(fVal->fKind, itmread, itmstore, nElements);
 
  317             DispatchConvertArray<Long_t>(fVal->fKind, itmread, itmstore, nElements);
 
  320             DispatchConvertArray<Long64_t>(fVal->fKind, itmread, itmstore, nElements);
 
  323             DispatchConvertArray<Float_t>(fVal->fKind, itmread, itmstore, nElements);
 
  326             DispatchConvertArray<Float16_t>(fVal->fKind, itmread, itmstore, nElements);
 
  329             DispatchConvertArray<Double_t>(fVal->fKind, itmread, itmstore, nElements);
 
  332             DispatchConvertArray<UChar_t>(fVal->fKind, itmread, itmstore, nElements);
 
  335             DispatchConvertArray<UShort_t>(fVal->fKind, itmread, itmstore, nElements);
 
  338             DispatchConvertArray<UInt_t>(fVal->fKind, itmread, itmstore, nElements);
 
  341             DispatchConvertArray<ULong_t>(fVal->fKind, itmread, itmstore, nElements);
 
  344             DispatchConvertArray<ULong64_t>(fVal->fKind, itmread, itmstore, nElements);
 
  347             DispatchConvertArray<Double_t>(fVal->fKind, itmread, itmstore, nElements);
 
  352             Error(
"TGenCollectionStreamer", 
"fType %d is not supported yet!\n", readkind);
 
  354       ::operator 
delete((
void*)itmconv);
 
  357       fEnv->fStart = fFeed(itmstore,fEnv->fObject,fEnv->fSize);
 
  359          ::operator 
delete(memory);
 
  364 void TGenCollectionStreamer::ReadObjects(
int nElements, TBuffer &b, 
const TClass *onFileClass)
 
  367    Bool_t vsn3 = b.GetInfo() && b.GetInfo()->GetOldVersion() <= 3;
 
  368    size_t len = fValDiff * nElements;
 
  369    StreamHelper* itm = 0;
 
  373    TClass* onFileValClass = (onFileClass ? onFileClass->GetCollectionProxy()->GetValueClass() : 0);
 
  375    fEnv->fSize = nElements;
 
  378       case ROOT::kSTLvector:
 
  379 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;} break;} 
  380          fResize(fEnv->fObject,fEnv->fSize);
 
  384             TVirtualVectorIterators iterators(fFunctionCreateIterators);
 
  385             iterators.CreateIterators(fEnv->fObject);
 
  386             itm = (StreamHelper*)iterators.fBegin;
 
  389          switch (fVal->fCase) {
 
  391                DOLOOP(b.StreamObject(i, fVal->fType, onFileValClass ));
 
  392             case EProperty(kBIT_ISSTRING):
 
  393                DOLOOP(i->read_std_string(b));
 
  394             case EProperty(kIsPointer | kIsClass):
 
  395                DOLOOP(i->set(b.ReadObjectAny(fVal->fType)));
 
  396             case EProperty(kIsPointer | kBIT_ISSTRING):
 
  397                DOLOOP(i->read_std_string_pointer(b));
 
  398             case EProperty(kIsPointer | kBIT_ISTSTRING | kIsClass):
 
  399                DOLOOP(i->read_tstring_pointer(vsn3, b));
 
  407       case ROOT::kSTLforwardlist:
 
  408       case ROOT::kSTLdeque:
 
  409 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)TGenCollectionProxy::At(idx); { x ;} ++idx;} break;} 
  410          fResize(fEnv->fObject,fEnv->fSize);
 
  413          switch (fVal->fCase) {
 
  415                DOLOOP(b.StreamObject(i, fVal->fType, onFileValClass));
 
  417                DOLOOP(i->read_std_string(b));
 
  418             case kIsPointer | kIsClass:
 
  419                DOLOOP(i->set(b.ReadObjectAny(fVal->fType)));
 
  420             case kIsPointer | kBIT_ISSTRING:
 
  421                DOLOOP(i->read_std_string_pointer(b));
 
  422             case kIsPointer | kBIT_ISTSTRING | kIsClass:
 
  423                DOLOOP(i->read_tstring_pointer(vsn3, b));
 
  430       case ROOT::kSTLmultiset:
 
  432       case ROOT::kSTLunorderedset:
 
  433       case ROOT::kSTLunorderedmultiset:
 
  434 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;}} 
  435          fEnv->fStart = itm = (StreamHelper*)(len < 
sizeof(buffer) ? buffer : memory =::operator 
new(len));
 
  436          fConstruct(itm,nElements);
 
  437          switch (fVal->fCase) {
 
  439                DOLOOP(b.StreamObject(i, fVal->fType, onFileValClass));
 
  440                fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
 
  441                fDestruct(fEnv->fStart,fEnv->fSize);
 
  443             case EProperty(kBIT_ISSTRING):
 
  444                DOLOOP(i->read_std_string(b))
 
  445                fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
 
  446                fDestruct(fEnv->fStart,fEnv->fSize);
 
  448             case EProperty(kIsPointer | kIsClass):
 
  449                DOLOOP(i->set(b.ReadObjectAny(fVal->fType)));
 
  450                fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
 
  452             case EProperty(kIsPointer | kBIT_ISSTRING):
 
  453                DOLOOP(i->read_std_string_pointer(b))
 
  454                fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
 
  456             case EProperty(kIsPointer | kBIT_ISTSTRING | kIsClass):
 
  457                DOLOOP(i->read_tstring_pointer(vsn3, b));
 
  458                fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
 
  467       ::operator 
delete(memory);
 
  471 void TGenCollectionStreamer::ReadPairFromMap(
int nElements, TBuffer &b)
 
  475    Bool_t vsn3 = b.GetInfo() && b.GetInfo()->GetOldVersion() <= 3;
 
  476    size_t len = fValDiff * nElements;
 
  477    StreamHelper* itm = 0;
 
  481    TStreamerInfo *pinfo = (TStreamerInfo*)fVal->fType->GetStreamerInfo();
 
  483    R__ASSERT(fVal->fCase == kIsClass);
 
  486    std::vector<std::string> inside;
 
  487    TClassEdit::GetSplit(pinfo->GetName(), inside, nested);
 
  488    Value first(inside[1],kFALSE);
 
  489    Value second(inside[2],kFALSE);
 
  490    fValOffset = ((TStreamerElement*)pinfo->GetElements()->At(1))->GetOffset();
 
  492    fEnv->fSize = nElements;
 
  495       case ROOT::kSTLvector:
 
  496 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;} break;} 
  497          fResize(fEnv->fObject,fEnv->fSize);
 
  501             TVirtualVectorIterators iterators(fFunctionCreateIterators);
 
  502             iterators.CreateIterators(fEnv->fObject);
 
  503             itm = (StreamHelper*)iterators.fBegin;
 
  506          switch (fVal->fCase) {
 
  509                   ReadMapHelper(i, &first, vsn3, b);
 
  510                   ReadMapHelper((StreamHelper*)(((
char*)i) + fValOffset), &second, vsn3, b)
 
  519       case ROOT::kSTLforwardlist:
 
  520       case ROOT::kSTLdeque:
 
  521 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)TGenCollectionProxy::At(idx); { x ;} ++idx;} break;} 
  522          fResize(fEnv->fObject,fEnv->fSize);
 
  525             TVirtualVectorIterators iterators(fFunctionCreateIterators);
 
  526             iterators.CreateIterators(fEnv->fObject);
 
  527             fEnv->fStart = iterators.fBegin;
 
  529          switch (fVal->fCase) {
 
  532                   char **where = (
char**)(
void*) & i;
 
  533                   b.ApplySequence(*(pinfo->GetReadObjectWiseActions()), where);
 
  541       case ROOT::kSTLmultiset:
 
  543       case ROOT::kSTLunorderedset:
 
  544       case ROOT::kSTLunorderedmultiset:
 
  545 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;}} 
  546          fEnv->fStart = itm = (StreamHelper*)(len < 
sizeof(buffer) ? buffer : memory =::operator 
new(len));
 
  547          fConstruct(itm,nElements);
 
  548          switch (fVal->fCase) {
 
  551                   char **where = (
char**)(
void*) & i;
 
  552                   b.ApplySequence(*(pinfo->GetReadObjectWiseActions()), where);
 
  554                fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
 
  555                fDestruct(fEnv->fStart,fEnv->fSize);
 
  564       ::operator 
delete(memory);
 
  569 void TGenCollectionStreamer::ReadMapHelper(StreamHelper *i, Value *v, Bool_t vsn3,  TBuffer &b)
 
  578          switch (
int(v->fKind))   {
 
  629                Error(
"TGenCollectionStreamer", 
"fType %d is not supported yet!\n", v->fKind);
 
  633          b.StreamObject(i, v->fType);
 
  636          i->read_std_string(b);
 
  638       case kIsPointer | kIsClass:
 
  639          i->set(b.ReadObjectAny(v->fType));
 
  641       case kIsPointer | kBIT_ISSTRING:
 
  642          i->read_std_string_pointer(b);
 
  644       case kIsPointer | kBIT_ISTSTRING | kIsClass:
 
  645          i->read_tstring_pointer(vsn3, b);
 
  650 template <
typename To>
 
  651 To readOneValue(TBuffer &b, 
int readtype) {
 
  652    TGenCollectionProxy::StreamHelper itm;
 
  653    TGenCollectionProxy::StreamHelper *i = &itm;
 
  657       return (To)i->boolean;
 
  661       return (To)i->s_char;
 
  665       return (To)i->s_short;
 
  673       return (To)i->s_long;
 
  677       return (To)i->s_longlong;
 
  693       return (To)i->u_char;
 
  697       return (To)i->u_short;
 
  705       return (To)i->u_long;
 
  709       return (To)i->u_longlong;
 
  721       Error(
"TGenCollectionStreamer", 
"fType %d is not supported yet!\n", readtype);
 
  727 void TGenCollectionStreamer::ReadMap(
int nElements, TBuffer &b, 
const TClass *onFileClass)
 
  730    Bool_t vsn3 = b.GetInfo() && b.GetInfo()->GetOldVersion() <= 3;
 
  731    size_t len = fValDiff * nElements;
 
  733    char buffer[8096], *addr, *temp;
 
  737    fEnv->fSize  = nElements;
 
  738    fEnv->fStart = (len < 
sizeof(buffer) ? buffer : memory =::
operator new(len));
 
  739    addr = temp = (
char*)fEnv->fStart;
 
  740    fConstruct(addr,nElements);
 
  742    int onFileValueKind[2];
 
  744       TClass *onFileValueClass = onFileClass->GetCollectionProxy()->GetValueClass();
 
  745       TVirtualStreamerInfo *sourceInfo = onFileValueClass->GetStreamerInfo();
 
  746       onFileValueKind[0] = ((TStreamerElement*)sourceInfo->GetElements()->At(0))->GetType();
 
  747       onFileValueKind[1] = ((TStreamerElement*)sourceInfo->GetElements()->At(1))->GetType();
 
  749    for (
int loop, idx = 0; idx < nElements; ++idx)  {
 
  750       addr = temp + fValDiff * idx;
 
  752       for (loop = 0; loop < 2; loop++)  {
 
  753          i = (StreamHelper*)addr;
 
  758                   int readtype = (int)(onFileValueKind[loop]);
 
  759                   switch (
int(v->fKind))   {
 
  761                      i->boolean = readOneValue<bool>(b,readtype);
 
  764                      i->s_char = readOneValue<Char_t>(b,readtype);
 
  767                      i->s_short = readOneValue<Short_t>(b,readtype);
 
  770                      i->s_int = readOneValue<Int_t>(b,readtype);
 
  773                      i->s_long = readOneValue<Long_t>(b,readtype);
 
  776                      i->s_longlong = readOneValue<Long64_t>(b,readtype);
 
  779                      i->flt = readOneValue<Float_t>(b,readtype);
 
  782                      i->flt = readOneValue<Float16_t>(b,readtype);
 
  785                      i->dbl = readOneValue<Double_t>(b,readtype);
 
  788                      i->u_char = readOneValue<UChar_t>(b,readtype);
 
  791                      i->u_short = readOneValue<UShort_t>(b,readtype);
 
  794                      i->u_int = readOneValue<UInt_t>(b,readtype);
 
  797                      i->u_long = readOneValue<ULong_t>(b,readtype);
 
  800                      i->u_longlong = readOneValue<ULong64_t>(b,readtype);
 
  803                      i->dbl = readOneValue<Double32_t>(b,readtype);
 
  808                      Error(
"TGenCollectionStreamer", 
"fType %d is not supported yet!\n", v->fKind);
 
  811                   switch (
int(v->fKind))   {
 
  862                      Error(
"TGenCollectionStreamer", 
"fType %d is not supported yet!\n", v->fKind);
 
  867                b.StreamObject(i, v->fType);
 
  869             case EProperty(kBIT_ISSTRING):
 
  870                i->read_std_string(b);
 
  872             case EProperty(kIsPointer | kIsClass):
 
  873                i->set(b.ReadObjectAny(v->fType));
 
  875             case EProperty(kIsPointer | kBIT_ISSTRING):
 
  876                i->read_std_string_pointer(b);
 
  878             case EProperty(kIsPointer | kBIT_ISTSTRING | kIsClass):
 
  879                i->read_tstring_pointer(vsn3, b);
 
  886    fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
 
  887    fDestruct(fEnv->fStart,fEnv->fSize);
 
  889       ::operator 
delete(memory);
 
  893 void TGenCollectionStreamer::WritePrimitives(
int nElements, TBuffer &b)
 
  896    size_t len = fValDiff * nElements;
 
  899    StreamHelper* itm = 0;
 
  901       case ROOT::kSTLvector:
 
  902          if (fVal->fKind != kBool_t)  {
 
  903             itm = (StreamHelper*)(fEnv->fStart = fFirst.invoke(fEnv));
 
  907          fEnv->fStart = itm = (StreamHelper*)(len < 
sizeof(buffer) ? buffer : memory =::operator 
new(len));
 
  908          fCollect(fEnv->fObject,itm);
 
  911    switch (
int(fVal->fKind))   {
 
  913          b.WriteFastArray(&itm->boolean    , nElements);
 
  916          b.WriteFastArray(&itm->s_char    , nElements);
 
  919          b.WriteFastArray(&itm->s_short   , nElements);
 
  922          b.WriteFastArray(&itm->s_int     , nElements);
 
  925          b.WriteFastArray(&itm->s_long    , nElements);
 
  928          b.WriteFastArray(&itm->s_longlong, nElements);
 
  931          b.WriteFastArray(&itm->flt       , nElements);
 
  934          b.WriteFastArrayFloat16(&itm->flt, nElements);
 
  937          b.WriteFastArray(&itm->dbl       , nElements);
 
  940          b.WriteFastArray(&itm->u_char    , nElements);
 
  943          b.WriteFastArray(&itm->u_short   , nElements);
 
  946          b.WriteFastArray(&itm->u_int     , nElements);
 
  949          b.WriteFastArray(&itm->u_long    , nElements);
 
  952          b.WriteFastArray(&itm->u_longlong, nElements);
 
  955          b.WriteFastArrayDouble32(&itm->dbl, nElements);
 
  960          Error(
"TGenCollectionStreamer", 
"fType %d is not supported yet!\n", fVal->fKind);
 
  963       ::operator 
delete(memory);
 
  967 void TGenCollectionStreamer::WriteObjects(
int nElements, TBuffer &b)
 
  970    StreamHelper* itm = 0;
 
  973       case ROOT::kSTLvector:
 
  974 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;} break;} 
  975          itm = (StreamHelper*)fFirst.invoke(fEnv);
 
  976          switch (fVal->fCase) {
 
  978                DOLOOP(b.StreamObject(i, fVal->fType));
 
  981                DOLOOP(TString(i->c_str()).Streamer(b));
 
  983             case kIsPointer | kIsClass:
 
  984                DOLOOP(b.WriteObjectAny(i->ptr(), fVal->fType));
 
  986             case kBIT_ISSTRING | kIsPointer:
 
  987                DOLOOP(i->write_std_string_pointer(b));
 
  989             case kBIT_ISTSTRING | kIsClass | kIsPointer:
 
  990                DOLOOP(i->write_tstring_pointer(b));
 
  999       case ROOT::kSTLforwardlist:
 
 1000       case ROOT::kSTLdeque:
 
 1001       case ROOT::kSTLmultiset:
 
 1003       case ROOT::kSTLunorderedset:
 
 1004       case ROOT::kSTLunorderedmultiset:
 
 1005 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)TGenCollectionProxy::At(idx); { x ;} ++idx;} break;} 
 1006          switch (fVal->fCase) {
 
 1008                DOLOOP(b.StreamObject(i, fVal->fType));
 
 1010                DOLOOP(TString(i->c_str()).Streamer(b));
 
 1011             case kIsPointer | kIsClass:
 
 1012                DOLOOP(b.WriteObjectAny(i->ptr(), fVal->fType));
 
 1013             case kBIT_ISSTRING | kIsPointer:
 
 1014                DOLOOP(i->write_std_string_pointer(b));
 
 1015             case kBIT_ISTSTRING | kIsClass | kIsPointer:
 
 1016                DOLOOP(i->write_tstring_pointer(b));
 
 1025 void TGenCollectionStreamer::WriteMap(
int nElements, TBuffer &b)
 
 1031    for (
int loop, idx = 0; idx < nElements; ++idx)  {
 
 1032       char* addr = (
char*)TGenCollectionProxy::At(idx);
 
 1034       for (loop = 0; loop < 2; ++loop)  {
 
 1035          i = (StreamHelper*)addr;
 
 1037             case kIsFundamental:  
 
 1039                switch (
int(v->fKind))   {
 
 1088                      Error(
"TGenCollectionStreamer", 
"fType %d is not supported yet!\n", v->fKind);
 
 1092                b.StreamObject(i, v->fType);
 
 1095                TString(i->c_str()).Streamer(b);
 
 1097             case kIsPointer | kIsClass:
 
 1098                b.WriteObjectAny(i->ptr(), v->fType);
 
 1100             case kBIT_ISSTRING | kIsPointer:
 
 1101                i->write_std_string_pointer(b);
 
 1103             case kBIT_ISTSTRING | kIsClass | kIsPointer:
 
 1104                i->write_tstring_pointer(b);
 
 1113 template <
typename From, 
typename To>
 
 1114 void TGenCollectionStreamer::ConvertBufferVectorPrimitives(TBuffer &b, 
void *obj, Int_t nElements)
 
 1116    From *temp = 
new From[nElements];
 
 1117    b.ReadFastArray(temp, nElements);
 
 1118    std::vector<To> *
const vec = (std::vector<To>*)(obj);
 
 1119    for(Int_t ind = 0; ind < nElements; ++ind) {
 
 1120       (*vec)[ind] = (To)temp[ind];
 
 1125 template <
typename To>
 
 1126 void TGenCollectionStreamer::ConvertBufferVectorPrimitivesFloat16(TBuffer &b, 
void *obj, Int_t nElements)
 
 1128    Float16_t *temp = 
new Float16_t[nElements];
 
 1129    b.ReadFastArrayFloat16(temp, nElements);
 
 1130    std::vector<To> *
const vec = (std::vector<To>*)(obj);
 
 1131    for(Int_t ind = 0; ind < nElements; ++ind) {
 
 1132       (*vec)[ind] = (To)temp[ind];
 
 1137 template <
typename To>
 
 1138 void TGenCollectionStreamer::ConvertBufferVectorPrimitivesDouble32(TBuffer &b, 
void *obj, Int_t nElements)
 
 1140    Double32_t *temp = 
new Double32_t[nElements];
 
 1141    b.ReadFastArrayDouble32(temp, nElements);
 
 1142    std::vector<To> *
const vec = (std::vector<To>*)(obj);
 
 1143    for(Int_t ind = 0; ind < nElements; ++ind) {
 
 1144       (*vec)[ind] = (To)temp[ind];
 
 1149 template <
typename To>
 
 1150 void TGenCollectionStreamer::DispatchConvertBufferVectorPrimitives(TBuffer &b, 
void *obj, Int_t nElements, 
const TVirtualCollectionProxy *onFileProxy)
 
 1152    switch ((TStreamerInfo::EReadWrite)onFileProxy->GetType()) {
 
 1153       case TStreamerInfo::kBool:     ConvertBufferVectorPrimitives<Bool_t    ,To>(b,obj,nElements); 
break;
 
 1154       case TStreamerInfo::kChar:     ConvertBufferVectorPrimitives<Char_t    ,To>(b,obj,nElements); 
break;
 
 1155       case TStreamerInfo::kShort:    ConvertBufferVectorPrimitives<Short_t   ,To>(b,obj,nElements); 
break;
 
 1156       case TStreamerInfo::kInt:      ConvertBufferVectorPrimitives<Int_t     ,To>(b,obj,nElements); 
break;
 
 1157       case TStreamerInfo::kLong:     ConvertBufferVectorPrimitives<Long_t    ,To>(b,obj,nElements); 
break;
 
 1158       case TStreamerInfo::kLong64:   ConvertBufferVectorPrimitives<Long64_t  ,To>(b,obj,nElements); 
break;
 
 1159       case TStreamerInfo::kFloat:    ConvertBufferVectorPrimitives<Float_t   ,To>(b,obj,nElements); 
break;
 
 1160       case TStreamerInfo::kFloat16:  ConvertBufferVectorPrimitives<Float16_t ,To>(b,obj,nElements); 
break;
 
 1161       case TStreamerInfo::kDouble:   ConvertBufferVectorPrimitives<Double_t  ,To>(b,obj,nElements); 
break;
 
 1162       case TStreamerInfo::kDouble32: ConvertBufferVectorPrimitives<Double32_t,To>(b,obj,nElements); 
break;
 
 1163       case TStreamerInfo::kUChar:    ConvertBufferVectorPrimitives<UChar_t   ,To>(b,obj,nElements); 
break;
 
 1164       case TStreamerInfo::kUShort:   ConvertBufferVectorPrimitives<UShort_t  ,To>(b,obj,nElements); 
break;
 
 1165       case TStreamerInfo::kUInt:     ConvertBufferVectorPrimitives<UInt_t    ,To>(b,obj,nElements); 
break;
 
 1166       case TStreamerInfo::kULong:    ConvertBufferVectorPrimitives<ULong_t   ,To>(b,obj,nElements); 
break;
 
 1167       case TStreamerInfo::kULong64:  ConvertBufferVectorPrimitives<ULong64_t ,To>(b,obj,nElements); 
break;
 
 1172 template <
typename basictype>
 
 1173 void TGenCollectionStreamer::ReadBufferVectorPrimitives(TBuffer &b, 
void *obj, 
const TClass *onFileClass)
 
 1177    fResize(obj,nElements);
 
 1180       DispatchConvertBufferVectorPrimitives<basictype>(b,obj,nElements,onFileClass->GetCollectionProxy());
 
 1182       TVirtualVectorIterators iterators(fFunctionCreateIterators);
 
 1183       iterators.CreateIterators(obj);
 
 1184       b.ReadFastArray((basictype*)iterators.fBegin, nElements);
 
 1188 void TGenCollectionStreamer::ReadBufferVectorPrimitivesFloat16(TBuffer &b, 
void *obj, 
const TClass *onFileClass)
 
 1192    fResize(obj,nElements);
 
 1195       DispatchConvertBufferVectorPrimitives<Float16_t>(b,obj,nElements,onFileClass->GetCollectionProxy());
 
 1197       TVirtualVectorIterators iterators(fFunctionCreateIterators);
 
 1198       iterators.CreateIterators(obj);
 
 1199       b.ReadFastArrayFloat16((Float16_t*)iterators.fBegin, nElements);
 
 1203 void TGenCollectionStreamer::ReadBufferVectorPrimitivesDouble32(TBuffer &b, 
void *obj, 
const TClass *onFileClass)
 
 1207    fResize(obj,nElements);
 
 1210       DispatchConvertBufferVectorPrimitives<Double32_t>(b,obj,nElements,onFileClass->GetCollectionProxy());
 
 1212       TVirtualVectorIterators iterators(fFunctionCreateIterators);
 
 1213       iterators.CreateIterators(obj);
 
 1214       b.ReadFastArrayDouble32((Double32_t*)iterators.fBegin, nElements);
 
 1220 void TGenCollectionStreamer::ReadBuffer(TBuffer &b, 
void *obj, 
const TClass *onFileClass)
 
 1225    (this->*fReadBufferFunc)(b,obj,onFileClass);
 
 1228 void TGenCollectionStreamer::ReadBuffer(TBuffer &b, 
void *obj)
 
 1233    (this->*fReadBufferFunc)(b,obj,0);
 
 1236 void TGenCollectionStreamer::ReadBufferDefault(TBuffer &b, 
void *obj, 
const TClass *onFileClass)
 
 1239    fReadBufferFunc = &TGenCollectionStreamer::ReadBufferGeneric;
 
 1242    if ( !fValue.load() ) InitializeEx(kFALSE);
 
 1243    if (!GetFunctionCreateIterators()) {
 
 1244       Fatal(
"TGenCollectionStreamer::ReadBufferDefault",
"No CreateIterators function for %s",fName.c_str());
 
 1246    if (fSTL_type == ROOT::kSTLvector && ( fVal->fCase == kIsFundamental || fVal->fCase == kIsEnum ) )
 
 1249       switch (
int(fVal->fKind))   {
 
 1254             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Char_t>;
 
 1257             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Short_t>;
 
 1260             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Int_t>;
 
 1263             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Long_t>;
 
 1266             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Long64_t>;
 
 1269             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Float_t>;
 
 1272             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitivesFloat16;
 
 1275             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Double_t>;
 
 1278             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<UChar_t>;
 
 1281             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<UShort_t>;
 
 1284             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<UInt_t>;
 
 1287             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<ULong_t>;
 
 1290             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<ULong64_t>;
 
 1293             fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitivesDouble32;
 
 1302    (this->*fReadBufferFunc)(b,obj,onFileClass);
 
 1305 void TGenCollectionStreamer::ReadBufferGeneric(TBuffer &b, 
void *obj, 
const TClass *onFileClass)
 
 1307    TVirtualCollectionProxy::TPushPop env(
this, obj);
 
 1312    if (nElements == 0) {
 
 1314          TGenCollectionProxy::Clear(
"force");
 
 1316    } 
else if (nElements > 0)  {
 
 1317       switch (fSTL_type)  {
 
 1318          case ROOT::kSTLbitset:
 
 1320                if (fProperties & kNeedDelete)   {
 
 1321                   TGenCollectionProxy::Clear(
"force");
 
 1323                   fClear.invoke(fEnv);
 
 1326             ReadPrimitives(nElements, b, onFileClass);
 
 1328          case ROOT::kSTLvector:
 
 1330                if (fProperties & kNeedDelete)   {
 
 1331                   TGenCollectionProxy::Clear(
"force");
 
 1333                else if (fVal->fKind == kBool_t) {
 
 1334                   fClear.invoke(fEnv);
 
 1337             switch (fVal->fCase) {
 
 1338                case kIsFundamental:  
 
 1340                   ReadPrimitives(nElements, b, onFileClass);
 
 1343                   ReadObjects(nElements, b, onFileClass);
 
 1347          case ROOT::kSTLlist:
 
 1348          case ROOT::kSTLforwardlist:
 
 1349          case ROOT::kSTLdeque:
 
 1350          case ROOT::kSTLmultiset:
 
 1352          case ROOT::kSTLunorderedset:
 
 1353          case ROOT::kSTLunorderedmultiset:
 
 1355                if (fProperties & kNeedDelete)   {
 
 1356                   TGenCollectionProxy::Clear(
"force");
 
 1358                   fClear.invoke(fEnv);
 
 1361             switch (fVal->fCase) {
 
 1362                case kIsFundamental:  
 
 1364                   ReadPrimitives(nElements, b, onFileClass);
 
 1367                   ReadObjects(nElements, b, onFileClass);
 
 1372          case ROOT::kSTLmultimap:
 
 1373          case ROOT::kSTLunorderedmap:
 
 1374          case ROOT::kSTLunorderedmultimap:
 
 1376                if (fProperties & kNeedDelete)   {
 
 1377                   TGenCollectionProxy::Clear(
"force");
 
 1379                   fClear.invoke(fEnv);
 
 1382             ReadMap(nElements, b, onFileClass);
 
 1388 void TGenCollectionStreamer::Streamer(TBuffer &b)
 
 1391    if (b.IsReading()) {    
 
 1394       if (fEnv->fObject)   {
 
 1395          TGenCollectionProxy::Clear(
"force");
 
 1397       if (nElements > 0)  {
 
 1398          switch (fSTL_type)  {
 
 1399             case ROOT::kSTLbitset:
 
 1400                ReadPrimitives(nElements, b, fOnFileClass);
 
 1402             case ROOT::kSTLvector:
 
 1403             case ROOT::kSTLlist:
 
 1404             case ROOT::kSTLdeque:
 
 1405             case ROOT::kSTLmultiset:
 
 1407             case ROOT::kSTLunorderedset:
 
 1408             case ROOT::kSTLunorderedmultiset:
 
 1409                switch (fVal->fCase) {
 
 1410                   case kIsFundamental:  
 
 1412                      ReadPrimitives(nElements, b, fOnFileClass);
 
 1415                      ReadObjects(nElements, b, fOnFileClass);
 
 1420             case ROOT::kSTLmultimap:
 
 1421             case ROOT::kSTLunorderedmap:
 
 1422             case ROOT::kSTLunorderedmultimap:
 
 1423                ReadMap(nElements, b, fOnFileClass);
 
 1428       int nElements = fEnv->fObject ? *(
size_t*)fSize.invoke(fEnv) : 0;
 
 1430       if (nElements > 0)  {
 
 1431          switch (fSTL_type)  {
 
 1432             case ROOT::kSTLbitset:
 
 1433                WritePrimitives(nElements, b);
 
 1435             case ROOT::kSTLvector:
 
 1436             case ROOT::kSTLlist:
 
 1437             case ROOT::kSTLforwardlist:
 
 1438             case ROOT::kSTLdeque:
 
 1439             case ROOT::kSTLmultiset:
 
 1441             case ROOT::kSTLunorderedset:
 
 1442             case ROOT::kSTLunorderedmultiset:
 
 1443                switch (fVal->fCase) {
 
 1444                   case kIsFundamental:  
 
 1446                      WritePrimitives(nElements, b);
 
 1449                      WriteObjects(nElements, b);
 
 1454             case ROOT::kSTLmultimap:
 
 1455             case ROOT::kSTLunorderedmap:
 
 1456             case ROOT::kSTLunorderedmultimap:
 
 1457                WriteMap(nElements, b);
 
 1464 void TGenCollectionStreamer::StreamerAsMap(TBuffer &b)
 
 1467    if (b.IsReading()) {    
 
 1470       if (fEnv->fObject)   {
 
 1471          TGenCollectionProxy::Clear(
"force");
 
 1473       if (nElements > 0)  {
 
 1474          switch (fSTL_type)  {
 
 1476             case ROOT::kSTLmultimap:
 
 1477             case ROOT::kSTLunorderedmap:
 
 1478             case ROOT::kSTLunorderedmultimap:
 
 1479                ReadMap(nElements, b, fOnFileClass);
 
 1481             case ROOT::kSTLvector:
 
 1482             case ROOT::kSTLlist:
 
 1483             case ROOT::kSTLforwardlist:
 
 1484             case ROOT::kSTLdeque:
 
 1485             case ROOT::kSTLmultiset:
 
 1487             case ROOT::kSTLunorderedset:
 
 1488             case ROOT::kSTLunorderedmultiset:{
 
 1489                   ReadPairFromMap(nElements, b);