Re: [ROOT] TGraph and vector

From: Christian Holm Christensen (cholm@hehi03.nbi.dk)
Date: Tue Jan 08 2002 - 19:45:26 MET


Hi, 

On Tue, 08 Jan 2002 15:30:10 +0000
Rene Brun <Rene.Brun@cern.ch> wrote
concerning "Re: [ROOT] TGraph and vector":
> Hi Colin,
> 
> Colin Bernet wrote:
> > 
> > Hi Michael,
> > 
> > As root was not compiled with STL (why not, Rene ?),
> 
> What do you mean by "compiled with STL" ?

That is indeed a good question.  I'll try, for the sake of clarity to
say a few words on STL and STL and ROOT.  

Usually, STL is implmented as a set of header files - that is, there's
no compiled code in an STL distribution.  That is because of the 'T'
in STL:  If you want to make instantions of a template class, you need
the full implementation.  Hence, you can not "compile in" STL support
in the ROOT libraries.  What one can compile in (sometimes) are the
specific instantations of a template, like for example
vector<TObject>.  

Now, since it's not possible to "compile in" STL into the ROOT
libraries, what one does need, is for the CINT parser to understand
templates.  That is both the dictionary generator (rootcint or
makecint) and the interactive tool (root or cint) need to understand
code like 

  template <class T> class  MyTemplate { 

as well as as 

  class IntVector : public TObject { 
  private: 
    typedef vector<Int_t>            Vector; 
    typedef vector<Int_t>::iterator  Iter; 

    Vector fVector; 
    Iter   fIter;
  public:
    ... 

But this has nothing to do with "compiling in" STL support.  It's
merely (well, it's not easy) a matter of writting the parser and
lexer, and the dictionary generating code.  Now Masa has in his
infinit wisdom decided to ship CINT with a number of pregenerated
dictionaries for STL classes, so that we (the unworthy users) do not 
need to that.   Just try and do 

  prompt> cint 
  cint> #include <vector> 
  cint> vector<int> v 

However, you can also do 

  prompt> root
  root [0] #include <vector>
  root [1] vector<TString*> v(10, 0);
  root [2] v[0] = new TString("s1");
  root [3] v[1] = new TString("s2");
  root [4] v[2] = new TString("s3");
  root [5] vector<TString*>::iterator b = v.begin();  
  root [6] { while  (b != v.end()) {
  end with '}'> if (*b) cout << ((TString*)(*b))->Data() << endl; b++; }}
  s1
  s2
  s3

So, if there's anything that needs to provide STL support, it's CINT,
and Masa has been working damn hard on that. 

So far so good.  We can use (most of) the STL class interactively, but
what about I/O?  Well, the ROOT I/O system relies on inheritance from
TObject, so that rules out STL classes immediately, since we can not,
with out break STL, make for example vector<class,class> subclass 
TObject; it wouldn't be STL if you did.  So what to do?  Well, the
solution is to encapsualte the STL classes in subclasses of TObject,
like IntVector above.  As far as I remember, all the frameworks that
provide persistent object store work like this, including G4,
Objectivity, and ClHEP based projects.

So, the question "Why no, Rene?" is easy to answer: It's just not
possible!  What can be done is make the parsers, lexers and code
generators understand templates.   

Above, I said 

  What one can compile in (sometimes) are the specific instantations
  of a template. 

The "(sometimes)" is a sutble point and has to do with how to make
sure there's exactly one instance of a template instantition.  There
are two models: The Borland model and the Cfront model.  More on these
models can be found in the GCC info pages -> "Extensions to the C++
Language" -> "Template Instantiation".  

Now, as for the matter of reallocation, why don't you just use a
TArrayD or something? That'll give you that as far as I remember.
Otherwise, implement a class, possibly a template, that has the method
Realloc that does the reallocation for you (see also
TStorage::Realloc). 

Yours, 

Christian Holm Christensen -------------------------------------------
Address: Sankt Hansgade 23, 1. th.           Phone:  (+45) 35 35 96 91 
         DK-2200 Copenhagen N                Cell:   (+45) 28 82 16 23
         Denmark                             Office: (+45) 353  25 305 
Email:   cholm@nbi.dk                        Web:    www.nbi.dk/~cholm



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:37 MET