[ROOT] streamers for nested stl containers

From: Matevz Tadel (Matevz.Tadel@ijs.si)
Date: Tue Aug 08 2000 - 16:10:02 MEST


Hi,

Imagine a situation:

X.h <<fnord
#ifndef _x_h_
#define _x_h_

#include <TNamed.h>
#include <vector>
#include <iostream>

class X : public TNamed {
public:
  vector<int>	mV;

  X(const Text_t* n="x") : TNamed(n,0) {}
  void Populate(Int_t M=3) { for(int i=0; i<M; i++) mV.push_back(i); }
  void Spit() {
    cout << GetName() <<": [";
    for(vector<int>::iterator i=mV.begin(); i!=mV.end(); i++) cout
<<*i<<" ";
    cout <<"]\n";
  }

  ClassDef(X,1)
};

#endif
fnord

Y.h << fnord
#ifndef _y_h_
#define _y_h_

#include "X.h"
#include <TObject.h>
#include <vector>

class Y : public TObject {
public:
  vector<X>	mX;

  void Populate(Int_t M=3) {
    char a='A', n[2]; for(int i=0; i<M; i++,a++) {
      sprintf(n,"%c",a);
      X x(n); x.Populate(i+1);
      mX.push_back(x);
    }
  }
  void Spit() { for(vector<X>::iterator
i=mX.begin(); i!=mX.end(); i++) i->Spit(); }
  ClassDef(Y,1)
};

#endif
fnord

root session 1:
root [0] #include <vector>              
root [1] gSystem->Load("libElDictos.so")
(int)0
root [2] Y y
root [3] y.Populate()
root [4] y.Spit()
A: [0 ]
B: [0 1 ]
C: [0 1 2 ]
root [5] TFile f("xy.root","RECREATE")
root [6] y.Write("Y")      
(Int_t)134
root [7] f.Close()
root [8] .q

root session 2:
root [0] #include <vector>              
root [1] gSystem->Load("libElDictos.so")
(int)0
root [2] TFile f("xy.root")
root [3] .ls
TFile**         xy.root
 TFile*         xy.root
  KEY: Y        Y;1
root [4] Y.Spit()
A: [0 ]
B: [0 0 1 ]
C: [0 0 1 0 1 2 ]

Conclusion:
Reading of stl container fails, if its elements contain further stl
containers ...
eg:
   // Stream an object of class Y.
   if (R__b.IsReading()) {
      Version_t R__v = R__b.ReadVersion(); if (R__v) { }
      TObject::Streamer(R__b);
      {
         int R__i, R__n;
         X R__t;          //!! should be inside loop !!
         R__b >> R__n;
         for (R__i = 0; R__i < R__n; R__i++) {
            R__t.Streamer(R__b);
            mX.push_back(R__t);
         }
      }
   } else { ...

perhaps i live in a dream world, but i would expect the code with
declaration inside the loop consume the same number of constructors (due
to optimizations for a variable going out of scope copy constructor for
stl element is not called). In this case it has to be invoked anyway
... we just gain one destruction (which isn't called if my dream
optimization really exists)

huh ... back to my histograms ...

cheers,
matevz

-- 
---------------------------------------------------
 Matevz Tadel,         E-mail: Matevz.Tadel@ijs.si 
 Department of Experimental High Energy Physics F9 
 Jozef Stefan Institute,  Jamova 39,  P.o.Box 3000 
 SI-1001 Ljubljana, Slovenia                       
 Tel.: +386-61-177-3674      Fax: +386-61-125-7074 
---------------------------------------------------



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:31 MET