RE: [ROOT] problem in accessing shared library from within Cint

From: HP Wei (hp@rentec.com)
Date: Tue Feb 25 2003 - 16:51:20 MET


>Your "-c -p" suggests your box.H is too complicate for CINT built-in CPP
>macro processing features.
>
>Can you show the source of that Box.H ?

   Box.H invokes a bunch of others:
   
#ifndef _BoxH_
#define _BoxH_
#include <BoxLow.H>
#include <Ascalar.H>
#include <common.H>
#include <MixedOps.H>
#include <Each.H>
#include <Matrix.H>
#include <Scalar.H>
#endif 

----------------
The class Box is actually defined in BoxLow.H

Let me quote a few definition in that file.  It is very long.
So, I just picked out those things that I think may be hard for
Cint to handle. (I got the impression before that Cint does not handle
                 template well.)

class Lvalue {   // Note: Bx is defined in Bx.H
public:
  Bx **x,*ix;
  Lvalue(Bx **x,Bx *ix):x(x),ix(ix) { Lvalue::ix->ref(); }
  Lvalue(const Lvalue& cpLvalue): x(cpLvalue.x), ix(cpLvalue.ix) { ix->ref(); }
  ~Lvalue() { if(0 == ix->deref() ) delete ix; }
  Bx *operator=(Box  rhsBox);
  Bx *operator=(Lvalue rhsLvalue);
};

class Box {
public:
  // Weird stuff to handle indexing in a syntactically clean way
  Box(Lvalue v):bx((*v.x)->Use(v.ix)) {}

  // If operator int**() is defined then SunPro C++ will call it rather
  // than operator bool() if a Box-valued expression appears as a condition.
  // This rarely, if ever, gives a sensible result.
#if 0
  operator int **() {return (int **)bx;}
#endif
  Lvalue operator()(Box ix);
  // skip......
  
  /// Construct a rank-1 (vector) box of the given type and length:
  Box(BxElementType type, int length) : bx(new Bx(type, length, 0)) {}
  // ...
  /* Copy constructor */
  Box(const Box& x):bx(x.bx) {x.bx->ref();}
  
  Box(NaN_Type n) : bx(new Bx(double(n))) {}
  
  Box Cvt(int type, bool support_more_types=false) const {return 
Box(bx->Cvt(BxElementType(type), support_more_types));}
  
  KeyMap **GetKeyMaps() {return bx->GetKeyMaps();}
  
  // template versions to avoid taking cases all the time, like with Bx
  template <class BoxFunctor>
  typename BoxFunctor::result_type readDispatch(BoxFunctor bf) const {
    typedef typename BoxFunctor::result_type ReturnType;
    switch (Type()) {
    case ET_PNTR:   return bf(this, ReadBoxes());
    case ET_DOUBLE: return bf(this, ReadDoubles());
    case ET_INT:    return bf(this, ReadInts());
    case ET_CHAR:   return bf(this, ReadChars());
    default: fault;
    }
    return ReturnType();
  }
  
  const TempBoxForBracket operator[](Box indexBox);
  inline const TempBoxForBracket operator[](const char* pcch); // 281FIX
  
  inline Bx * Lvalue::operator=(Lvalue rhsLvalue){
  return operator=(Box(rhsLvalue));
  
  long Serialize(GFile *gf) const {return bx->Serialize(gf);}
  
--------------------------------------------------------
What do you think ?
Is there any hope in accessing Box from within Cint ???

btw, how does Cint recognize all the classes in ROOT ?
     for example, is there a LinkDef.h file for TTree class ??
     
--HP
 
  
  



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:09 MET