11 #ifndef ROOT_TCollectionProxyFactory 
   12 #define ROOT_TCollectionProxyFactory 
   33 class TGenCollectionProxy;
 
   34 class TGenCollectionStreamer;
 
   35 class TVirtualCollectionProxy;
 
   36 class TEmulatedCollectionProxy;
 
   43       #define TYPENAME typename 
   46    #define TYPENAME typename 
   67 class TCollectionProxyFactory  {
 
   70    typedef TVirtualCollectionProxy Proxy_t;
 
   72    typedef const std::type_info&      Info_t;
 
   74    typedef const std::type_info& Info_t;
 
   78    static TVirtualCollectionProxy* GenEmulatedProxy(
const char* class_name, Bool_t silent);
 
   81    static TClassStreamer* GenEmulatedClassStreamer(
const char* class_name, Bool_t silent);
 
   84    static TMemberStreamer* GenEmulatedMemberStreamer(
const char* class_name, Bool_t silent);
 
   88    static Proxy_t* GenExplicitProxy( const ::ROOT::TCollectionProxyInfo &info, TClass *cl );
 
   91    template <
class T> 
static Proxy_t* GenProxy(
const T &arg, TClass *cl)  {
 
   92       return GenExplicitProxy( ::ROOT::TCollectionProxyInfo::Get(arg), cl );
 
   96    static TGenCollectionStreamer*
 
   97       GenExplicitStreamer( const ::ROOT::TCollectionProxyInfo &info, TClass *cl );
 
  100    static TClassStreamer*
 
  101       GenExplicitClassStreamer( const ::ROOT::TCollectionProxyInfo &info, TClass *cl );
 
  104    template <
class T> 
static TClassStreamer* GenClassStreamer(
const T &arg, TClass *cl)  {
 
  105       return GenExplicitClassStreamer(::ROOT::TCollectionProxyInfo::Get(arg), cl);
 
  109    static TMemberStreamer*
 
  110       GenExplicitMemberStreamer(const ::ROOT::TCollectionProxyInfo &info, TClass *cl);
 
  113    template <
class T> 
static TMemberStreamer* GenMemberStreamer(
const T &arg, TClass *cl)  {
 
  114       return GenExplicitMemberStreamer(::ROOT::TCollectionProxyInfo::Get(arg), cl);
 
  127 class TCollectionStreamer   {
 
  129    TCollectionStreamer& operator=(
const TCollectionStreamer&);   
 
  132    TGenCollectionProxy* fStreamer;   
 
  135    void InvalidProxyError();
 
  139    TCollectionStreamer();
 
  141    TCollectionStreamer(
const TCollectionStreamer& c);
 
  143    virtual ~TCollectionStreamer();
 
  145    void AdoptStreamer(TGenCollectionProxy* streamer);
 
  147    void Streamer(TBuffer &refBuffer, 
void *obj, 
int siz, TClass *onFileClass );
 
  159 class TCollectionClassStreamer : 
public TClassStreamer, 
public TCollectionStreamer {
 
  161    TCollectionClassStreamer &operator=(
const TCollectionClassStreamer &rhs); 
 
  163    TCollectionClassStreamer(
const TCollectionClassStreamer& c)
 
  164       : TClassStreamer(c), TCollectionStreamer(c)      {                        }
 
  168    TCollectionClassStreamer() : TClassStreamer(0)     {                        }
 
  170    virtual ~TCollectionClassStreamer()                {                        }
 
  172    virtual void operator()(TBuffer &buff, 
void *obj ) { Streamer(buff,obj,0,fOnFileClass); }
 
  174    virtual void Stream(TBuffer &b, 
void *obj, 
const TClass *onfileClass)
 
  177          TGenCollectionProxy *proxy = TCollectionStreamer::fStreamer;
 
  178          if (onfileClass==0 || onfileClass == proxy->GetCollectionClass()) {
 
  179             proxy->ReadBuffer(b,obj);
 
  181             proxy->ReadBuffer(b,obj,onfileClass);
 
  185          Streamer(b,obj,0,(TClass*)onfileClass);
 
  190    virtual TClassStreamer *Generate()
 const {
 
  191       return new TCollectionClassStreamer(*
this);
 
  194    TGenCollectionProxy *GetXYZ() { 
return TCollectionStreamer::fStreamer; }
 
  207 class TCollectionMemberStreamer : 
public TMemberStreamer, 
public TCollectionStreamer {
 
  209    TCollectionMemberStreamer &operator=(
const TCollectionMemberStreamer &rhs); 
 
  212    TCollectionMemberStreamer() : TMemberStreamer(0) { }
 
  214    TCollectionMemberStreamer(
const TCollectionMemberStreamer& c)
 
  215       : TMemberStreamer(c), TCollectionStreamer(c)   { }
 
  217    virtual ~TCollectionMemberStreamer()             { }
 
  219    virtual void operator()(TBuffer &buff,
void *obj,Int_t siz=0)
 
  220    { Streamer(buff, obj, siz, 0);  }