Skip to content

Commit c5e9f1d

Browse files
committed
[core] Add TGenericClassInfo::AdoptMemberStreamer()
1 parent f080e6f commit c5e9f1d

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

core/meta/inc/TGenericClassInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "TSchemaHelper.h"
2222
#include <vector>
2323
#include <string>
24+
#include <unordered_map>
2425

2526
// Forward declarations
2627
class TVirtualIsAProxy;
@@ -72,6 +73,7 @@ namespace ROOT {
7273
std::vector<ROOT::Internal::TSchemaHelper> fReadRules;
7374
std::vector<ROOT::Internal::TSchemaHelper> fReadRawRules;
7475
std::vector<ROOT::TClassAlt*> fAlternate;
76+
std::unordered_map<std::string, TMemberStreamer *> fAdoptedMemberStreamers;
7577

7678
public:
7779
TGenericClassInfo(const char *fullClassname,
@@ -118,6 +120,7 @@ namespace ROOT {
118120
TClass *IsA(const void *obj);
119121

120122
void AdoptAlternate(ROOT::TClassAlt *alt);
123+
void AdoptMemberStreamer(const char *name, TMemberStreamer *strm);
121124
Short_t AdoptStreamer(TClassStreamer*);
122125
Short_t AdoptCollectionProxy(TVirtualCollectionProxy*);
123126
void AdoptCollectionProxyInfo(Detail::TCollectionProxyInfo*);

core/meta/src/TGenericClassInfo.cxx

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,11 @@ namespace Internal {
281281
fClass->SetConvStreamerFunc(fConvStreamerFunc);
282282
fClass->SetMerge(fMerge);
283283
fClass->SetResetAfterMerge(fResetAfterMerge);
284-
fClass->AdoptStreamer(fStreamer); fStreamer = nullptr;
284+
fClass->AdoptStreamer(fStreamer);
285+
fStreamer = nullptr;
286+
for (const auto &[name, strm] : fAdoptedMemberStreamers)
287+
fClass->AdoptMemberStreamer(name.c_str(), strm);
288+
fAdoptedMemberStreamers.clear();
285289
// If IsZombie is true, something went wrong and we will not be
286290
// able to properly copy the collection proxy
287291
if (!fClass->IsZombie()) {
@@ -434,6 +438,21 @@ namespace Internal {
434438
fAlternate.push_back(alt);
435439
}
436440

441+
void TGenericClassInfo::AdoptMemberStreamer(const char *name, TMemberStreamer *strm)
442+
{
443+
if (fClass) {
444+
assert(fAdoptedMemberStreamers.empty());
445+
fClass->AdoptMemberStreamer(name, strm);
446+
return;
447+
}
448+
449+
auto [it, inserted] = fAdoptedMemberStreamers.emplace(name, strm);
450+
if (!inserted) {
451+
delete it->second;
452+
it->second = strm;
453+
}
454+
}
455+
437456
void TGenericClassInfo::AdoptCollectionProxyInfo(TCollectionProxyInfo *info)
438457
{
439458
// Set the info for the CollectionProxy and take ownership of the object

0 commit comments

Comments
 (0)