11 #ifndef ROOT_TGenCollectionProxy 
   12 #define ROOT_TGenCollectionProxy 
   26 class TCollectionProxyFactory;
 
   28 class TGenCollectionProxy
 
   29    : 
public TVirtualCollectionProxy
 
   33    friend class TCollectionProxyFactory;
 
   38    typedef const std::type_info&      Info_t;
 
   40    typedef const std::type_info& Info_t;
 
   46       kBIT_ISSTRING   = 0x20000000,  
 
   47       kBIT_ISTSTRING  = 0x40000000
 
   60       ROOT::NewFunc_t fCtor;       
 
   61       ROOT::DesFunc_t fDtor;       
 
   62       ROOT::DelFunc_t fDelete;     
 
   72       Value(
const std::string& info, Bool_t silent);
 
   74       void DeleteItem(
void* ptr);
 
  100       ULong64_t    u_longlong;
 
  106          return *(&this->p_void);
 
  109          return (std::string*)
this;
 
  111       const char* c_str()  {
 
  112          return ((std::string*)
this)->c_str();
 
  114       const char* c_pstr()  {
 
  115          return (*(std::string**)
this)->c_str();
 
  118          *(&this->p_void) = p;
 
  120       void read_std_string(TBuffer& b) {
 
  123          ((std::string*)
this)->assign(s.Data());
 
  125       void* read_tstring(TBuffer& b)  {
 
  126          *((TString*)
this) = 
"";
 
  127          ((TString*)
this)->Streamer(b);
 
  130       void read_std_string_pointer(TBuffer& b) {
 
  132          std::string* str2 = (std::string*)ptr();
 
  133          if (!str2) str2 = 
new std::string();
 
  138       void write_std_string_pointer(TBuffer& b)  {
 
  141             std::string* strptr = (*(std::string**)
this);
 
  142             c = (
const char*)(strptr->c_str());
 
  144          TString(c).Streamer(b);
 
  146       void read_any_object(Value* v, TBuffer& b)  {
 
  152             else if ( v->fType )  { 
 
  153                v->fType->Destructor(p);
 
  155             else if ( v->fDtor )  {
 
  157                ::operator 
delete(p);
 
  160                ::operator 
delete(p);
 
  163          set( b.ReadObjectAny(v->fType) );
 
  166       void read_tstring_pointer(Bool_t vsn3, TBuffer& b)  {
 
  167          TString* s = (TString*)ptr();
 
  169             if ( !s ) s = 
new TString();
 
  176          set( b.ReadObjectAny(TString::Class()) );
 
  178       void write_tstring_pointer(TBuffer& b)  {
 
  179          b.WriteObjectAny(ptr(), TString::Class());
 
  194       typedef void* (*Call_t)(
void*);
 
  196       Method() : call(0)                       {      }
 
  197       Method(Call_t c) : call(c)               {      }
 
  198       Method(
const Method& m) : call(m.call)   {      }
 
  199       Method &operator=(
const Method& m) { call = m.call; 
return *
this; }
 
  200       void* invoke(
void* obj)
 const { 
return (*call)(obj); }
 
  214       typedef void* (*Call_t)();
 
  216       Method0() : call(0)                       {      }
 
  217       Method0(Call_t c) : call(c)               {      }
 
  218       Method0(
const Method0& m) : call(m.call)   {      }
 
  219       Method0 &operator=(
const Method0& m) { call = m.call; 
return *
this; }
 
  220       void* invoke()
 const { 
return (*call)(); }
 
  240       TStaging(
const TStaging&);            
 
  241       TStaging &operator=(
const TStaging&); 
 
  244       TStaging(
size_t size, 
size_t size_of) : fTarget(0), fContent(0), fReserved(0), fSize(size), fSizeOf(size_of)
 
  248          fContent = ::malloc(fReserved * fSizeOf);
 
  262          return ((
char*)fContent) + fSize*fSizeOf;
 
  272       void    Resize(
size_t nelement) {
 
  273          if (fReserved < nelement) {
 
  274             fReserved = nelement;
 
  275             fContent = ::realloc(fContent,fReserved * fSizeOf);
 
  279       void SetTarget(
void *target) {
 
  286    typedef ROOT::Detail::TCollectionProxyInfo::Environ<char[64]> Env_t;
 
  287    typedef ROOT::Detail::TCollectionProxyInfo::EnvironBase EnvironBase_t;
 
  288    typedef std::vector<TStaging*>          Staged_t;  
 
  289    typedef std::vector<EnvironBase_t*>     Proxies_t;
 
  290    mutable TObjArray *fReadMemberWise;                                   
 
  291    mutable std::map<std::string, TObjArray*> *fConversionReadMemberWise; 
 
  292    mutable TStreamerInfoActions::TActionSequence *fWriteMemberWise;
 
  293    typedef void (*Sizing_t)(
void *obj, 
size_t size);
 
  294    typedef void* (*Feedfunc_t)(
void *from, 
void *to, 
size_t size);
 
  295    typedef void* (*Collectfunc_t)(
void *from, 
void *to);
 
  296    typedef void* (*ArrIterfunc_t)(
void *from, 
size_t size);
 
  305    ArrIterfunc_t fConstruct; 
 
  308    Collectfunc_t fCollect;   
 
  310    std::atomic<Value*> fValue;     
 
  316    Proxies_t     fProxyList; 
 
  317    Proxies_t     fProxyKept; 
 
  321    TClass*       fOnFileClass; 
 
  323    CreateIterators_t    fFunctionCreateIterators;
 
  324    CopyIterator_t       fFunctionCopyIterator;
 
  325    Next_t               fFunctionNextIterator;
 
  326    DeleteIterator_t     fFunctionDeleteIterator;
 
  327    DeleteTwoIterators_t fFunctionDeleteTwoIterators;
 
  330    TGenCollectionProxy* Initialize(Bool_t silent) 
const;
 
  332    virtual TGenCollectionProxy* InitializeEx(Bool_t silent);
 
  334    virtual void DeleteItem(Bool_t force, 
void* ptr) 
const;
 
  336    void CheckFunctions()  
const;
 
  339    virtual void UpdateValueClass(
const TClass *oldcl, TClass *newcl);
 
  342    TGenCollectionProxy(); 
 
  347    virtual TVirtualCollectionProxy* Generate() 
const;
 
  350    TGenCollectionProxy(
const TGenCollectionProxy& copy);
 
  354    TGenCollectionProxy &operator=(
const TGenCollectionProxy&); 
 
  358    TGenCollectionProxy(Info_t typ, 
size_t iter_size);
 
  359    TGenCollectionProxy(
const ROOT::Detail::TCollectionProxyInfo &info, TClass *cl);
 
  362    virtual ~TGenCollectionProxy();
 
  365    virtual TClass *GetCollectionClass() 
const;
 
  368    virtual Int_t   GetCollectionType() 
const;
 
  371    virtual ULong_t   GetIncrement() 
const;
 
  374    virtual UInt_t Sizeof() 
const;
 
  377    virtual void PushProxy(
void *objstart);
 
  380    virtual void PopProxy();
 
  383    virtual Bool_t HasPointers() 
const;
 
  386    virtual TClass *GetValueClass() 
const;
 
  389    virtual EDataType GetType() 
const;
 
  392    virtual void *At(UInt_t idx);
 
  395    virtual void Clear(
const char *opt = 
"");
 
  398    virtual void Resize(UInt_t n, Bool_t force_delete);
 
  401    virtual UInt_t Size() 
const;
 
  404    virtual void* Allocate(UInt_t n, Bool_t forceDelete);
 
  408    virtual void  Insert(
const void *data, 
void *container, 
size_t size);
 
  411    virtual void Commit(
void* env);
 
  414    virtual void Streamer(TBuffer &refBuffer);
 
  417    virtual void Streamer(TBuffer &refBuffer, 
void *pObject, 
int siz);
 
  420    virtual void operator()(TBuffer &refBuffer, 
void *pObject);
 
  423    virtual void ReadBuffer(TBuffer &b, 
void *obj);
 
  424    virtual void ReadBuffer(TBuffer &b, 
void *obj, 
const TClass *onfileClass);
 
  426    virtual void SetOnFileClass( TClass* cl ) { fOnFileClass = cl; }
 
  427    virtual TClass* GetOnFileClass()
 const { 
return fOnFileClass; }
 
  430    virtual TStreamerInfoActions::TActionSequence *GetConversionReadMemberWiseActions(TClass *oldClass, Int_t version);
 
  431    virtual TStreamerInfoActions::TActionSequence *GetReadMemberWiseActions(Int_t version);
 
  432    virtual TStreamerInfoActions::TActionSequence *GetWriteMemberWiseActions();
 
  436    virtual CreateIterators_t GetFunctionCreateIterators(Bool_t read = kTRUE);
 
  442    virtual CopyIterator_t GetFunctionCopyIterator(Bool_t read = kTRUE);
 
  449    virtual Next_t GetFunctionNext(Bool_t read = kTRUE);
 
  457    virtual DeleteIterator_t GetFunctionDeleteIterator(Bool_t read = kTRUE);
 
  458    virtual DeleteTwoIterators_t GetFunctionDeleteTwoIterators(Bool_t read = kTRUE);
 
  466 template <
typename T>
 
  467 struct AnyCollectionProxy : 
public TGenCollectionProxy  {
 
  469       : TGenCollectionProxy(typeid(T::Cont_t),sizeof(T::Iter_t))
 
  472       fValDiff        = 
sizeof(T::Value_t);
 
  473       fValOffset      = T::value_offset();
 
  474       fSize.call      = T::size;
 
  476       fNext.call      = T::next;
 
  477       fFirst.call     = T::first;
 
  478       fClear.call     = T::clear;
 
  479       fConstruct      = T::construct;
 
  480       fDestruct       = T::destruct;
 
  484    virtual ~AnyCollectionProxy() {  }