12 #ifndef ROOT_TStreamerInfoActions 
   13 #define ROOT_TStreamerInfoActions 
   27 namespace TStreamerInfoActions {
 
   30    class TConfiguration {
 
   33       typedef TStreamerInfo::TCompInfo_t TCompInfo_t;
 
   34       TVirtualStreamerInfo *fInfo;    
 
   36       TCompInfo_t          *fCompInfo;
 
   40       TConfiguration(TVirtualStreamerInfo *info, UInt_t 
id, TCompInfo_t *compinfo, Int_t offset) : fInfo(info), fElemId(id), fCompInfo(compinfo), fOffset(offset),fLength(1) {};
 
   41       TConfiguration(TVirtualStreamerInfo *info, UInt_t 
id, TCompInfo_t *compinfo, Int_t offset, UInt_t length) : fInfo(info), fElemId(id), fCompInfo(compinfo), fOffset(offset),fLength(length) {};
 
   42       virtual ~TConfiguration() {};
 
   44       virtual void AddToOffset(Int_t delta);
 
   45       virtual void SetMissing();
 
   47       virtual TConfiguration *Copy() { 
return new TConfiguration(*
this); }
 
   49       virtual void Print() 
const;
 
   50       virtual void PrintDebug(TBuffer &buffer, 
void *
object) 
const;
 
   54    class TLoopConfiguration {
 
   56       TVirtualCollectionProxy *fProxy = 
nullptr;
 
   58       TLoopConfiguration() = 
default;
 
   59       TLoopConfiguration(TVirtualCollectionProxy *proxy) : fProxy(proxy) {}
 
   62       virtual ~TLoopConfiguration() {};
 
   63       virtual void Print() 
const;
 
   64       virtual void *GetFirstAddress(
void *start, 
const void *end) 
const = 0;
 
   65       virtual TLoopConfiguration* Copy() 
const = 0; 
 
   66       virtual TVirtualCollectionProxy* GetCollectionProxy()
 const { 
return fProxy; }
 
   69    typedef TVirtualCollectionProxy::Next_t Next_t;
 
   71    typedef Int_t (*TStreamerInfoAction_t)(TBuffer &buf, 
void *obj, 
const TConfiguration *conf);
 
   72    typedef Int_t (*TStreamerInfoVecPtrLoopAction_t)(TBuffer &buf, 
void *iter, 
const void *end, 
const TConfiguration *conf);
 
   73    typedef Int_t (*TStreamerInfoLoopAction_t)(TBuffer &buf, 
void *iter, 
const void *end, 
const TLoopConfiguration *loopconf, 
const TConfiguration *conf);
 
   75    class TConfiguredAction : 
public TObject {
 
   78          TStreamerInfoAction_t           fAction;
 
   79          TStreamerInfoVecPtrLoopAction_t fVecPtrLoopAction;
 
   80          TStreamerInfoLoopAction_t       fLoopAction;
 
   82       TConfiguration              *fConfiguration;
 
   86       TConfiguredAction() : fAction(0), fConfiguration(0) {}
 
   87       TConfiguredAction(
const TConfiguredAction &rval) : TObject(rval), fAction(rval.fAction), fConfiguration(rval.fConfiguration)
 
   90          const_cast<TConfiguredAction&
>(rval).fConfiguration = 0;
 
   92       TConfiguredAction &operator=(
const TConfiguredAction &rval)
 
   96          TConfiguredAction tmp(rval); 
 
   97          TObject::operator=(tmp);     
 
   98          std::swap(fAction,tmp.fAction);
 
   99          std::swap(fConfiguration,tmp.fConfiguration);
 
  103       TConfiguredAction(TStreamerInfoAction_t action, TConfiguration *conf) : fAction(action), fConfiguration(conf)
 
  107       TConfiguredAction(TStreamerInfoVecPtrLoopAction_t action, TConfiguration *conf) : fVecPtrLoopAction(action), fConfiguration(conf)
 
  111       TConfiguredAction(TStreamerInfoLoopAction_t action, TConfiguration *conf) : fLoopAction(action), fConfiguration(conf)
 
  115       ~TConfiguredAction() {
 
  119          delete fConfiguration;
 
  121       void PrintDebug(TBuffer &buffer, 
void *
object) 
const;
 
  123       inline Int_t operator()(TBuffer &buffer, 
void *
object)
 const {
 
  124          return fAction(buffer, 
object, fConfiguration);
 
  127       inline Int_t operator()(TBuffer &buffer, 
void *start_collection, 
const void *end_collection)
 const {
 
  128          return fVecPtrLoopAction(buffer, start_collection, end_collection, fConfiguration);
 
  131       inline Int_t operator()(TBuffer &buffer, 
void *start_collection, 
const void *end_collection, 
const TLoopConfiguration *loopconf)
 const {
 
  132          return fLoopAction(buffer, start_collection, end_collection, loopconf, fConfiguration);
 
  135       ClassDef(TConfiguredAction,0); 
 
  139    using TIDs = std::vector<TIDNode>;
 
  144       TNestedIDs() = 
default;
 
  145       TNestedIDs(TStreamerInfo *info, Int_t offset) : fInfo(info), fOffset(offset) {}
 
  147          if (fOwnOnfileObject)
 
  148             delete fOnfileObject;
 
  150       TStreamerInfo *fInfo = 
nullptr; 
 
  151       TVirtualArray *fOnfileObject = 
nullptr;
 
  152       Bool_t         fOwnOnfileObject = kFALSE;
 
  162       TIDNode(Int_t 
id) : fElemID(id), fElement(nullptr), fInfo(nullptr) {}
 
  163       TIDNode(TStreamerInfo *info, Int_t offset) : fElemID(-1), fElement(nullptr), fInfo(nullptr)  {
 
  164          fNestedIDs = std::make_unique<TNestedIDs>(info, offset);
 
  167       TStreamerElement *fElement = 
nullptr;
 
  168       TStreamerInfo *fInfo = 
nullptr;
 
  169       std::unique_ptr<TNestedIDs> fNestedIDs;
 
  172    typedef std::vector<TConfiguredAction> ActionContainer_t;
 
  173    class TActionSequence : 
public TObject {
 
  174       TActionSequence() {};
 
  177       using SequenceGetter_t = SequencePtr(*)(TStreamerInfo *info, TVirtualCollectionProxy *collectionProxy, TClass *originalClass);
 
  179       TActionSequence(TVirtualStreamerInfo *info, UInt_t maxdata) : fStreamerInfo(info), fLoopConfig(0) { fActions.reserve(maxdata); };
 
  184       template <
typename action_t>
 
  185       void AddAction( action_t action, TConfiguration *conf ) {
 
  186          fActions.push_back( TConfiguredAction(action, conf) );
 
  188       void AddAction(
const TConfiguredAction &action ) {
 
  189          fActions.push_back( action );
 
  192       TVirtualStreamerInfo *fStreamerInfo; 
 
  193       TLoopConfiguration   *fLoopConfig;   
 
  194       ActionContainer_t     fActions;
 
  196       void AddToOffset(Int_t delta);
 
  199       TActionSequence *CreateCopy();
 
  200       static TActionSequence *CreateReadMemberWiseActions(TVirtualStreamerInfo *info, TVirtualCollectionProxy &proxy);
 
  201       static TActionSequence *CreateWriteMemberWiseActions(TVirtualStreamerInfo *info, TVirtualCollectionProxy &proxy);
 
  202       TActionSequence *CreateSubSequence(
const std::vector<Int_t> &element_ids, 
size_t offset);
 
  204       TActionSequence *CreateSubSequence(
const TIDs &element_ids, 
size_t offset, SequenceGetter_t create);
 
  205       void AddToSubSequence(TActionSequence *sequence, 
const TIDs &element_ids, Int_t offset, SequenceGetter_t create);
 
  207       void Print(Option_t * = 
"") 
const;
 
  211          TStreamerInfoActions::TActionSequence *fSequence = 
nullptr;
 
  212          Bool_t fOwner = kFALSE;
 
  214          SequencePtr() = 
default;
 
  216          SequencePtr(SequencePtr &&from) : fSequence(from.fSequence), fOwner(from.fOwner) {
 
  220          SequencePtr(TStreamerInfoActions::TActionSequence *sequence,  Bool_t owner) : fSequence(sequence), fOwner(owner) {}
 
  223             if (fOwner) 
delete fSequence;
 
  227          TStreamerInfoActions::TActionSequence &operator*()
 const {
 
  232          TStreamerInfoActions::TActionSequence *operator->()
 const {
 
  238             return fSequence != 
nullptr;
 
  244       static SequencePtr ReadMemberWiseActionsCollectionGetter(TStreamerInfo *info, TVirtualCollectionProxy * , TClass * ) {
 
  245          auto seq = info->GetReadMemberWiseActions(kTRUE);
 
  246          return {seq, kFALSE};
 
  248       static SequencePtr ConversionReadMemberWiseActionsViaProxyGetter(TStreamerInfo *info, TVirtualCollectionProxy *collectionProxy, TClass *originalClass) {
 
  249          auto seq = collectionProxy->GetConversionReadMemberWiseActions(originalClass, info->GetClassVersion());
 
  250          return {seq, kFALSE};
 
  252       static SequencePtr ReadMemberWiseActionsViaProxyGetter(TStreamerInfo *info, TVirtualCollectionProxy *collectionProxy, TClass * ) {
 
  253          auto seq = collectionProxy->GetReadMemberWiseActions(info->GetClassVersion());
 
  254          return {seq, kFALSE};
 
  256       static SequencePtr ReadMemberWiseActionsCollectionCreator(TStreamerInfo *info, TVirtualCollectionProxy *collectionProxy, TClass * ) {
 
  257          auto seq = TStreamerInfoActions::TActionSequence::CreateReadMemberWiseActions(info,*collectionProxy);
 
  261       static SequencePtr ReadMemberWiseActionsGetter(TStreamerInfo *info, TVirtualCollectionProxy * , TClass * ) {
 
  262          auto seq = info->GetReadMemberWiseActions(kFALSE);
 
  263          return {seq, kFALSE};
 
  266       static SequencePtr WriteMemberWiseActionsCollectionGetter(TStreamerInfo *info, TVirtualCollectionProxy * , TClass * ) {
 
  267          auto seq = info->GetWriteMemberWiseActions(kTRUE);
 
  268          return {seq, kFALSE};
 
  270       static SequencePtr WriteMemberWiseActionsViaProxyGetter(TStreamerInfo *, TVirtualCollectionProxy *collectionProxy, TClass * ) {
 
  271          auto seq = collectionProxy->GetWriteMemberWiseActions();
 
  272          return {seq, kFALSE};
 
  274       static SequencePtr WriteMemberWiseActionsCollectionCreator(TStreamerInfo *info, TVirtualCollectionProxy *collectionProxy, TClass * ) {
 
  275          auto seq = TStreamerInfoActions::TActionSequence::CreateWriteMemberWiseActions(info,*collectionProxy);
 
  279       static SequencePtr WriteMemberWiseActionsGetter(TStreamerInfo *info, TVirtualCollectionProxy * , TClass * ) {
 
  280          auto seq = info->GetWriteMemberWiseActions(kFALSE);
 
  281          return {seq, kFALSE};
 
  283       ClassDef(TActionSequence,0);
 
  288 #endif // ROOT_TStreamerInfoActions