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