ATLAS Offline Software
Loading...
Searching...
No Matches
TConverterRegistry.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
13
18#include "TClass.h"
19#include "TMemberStreamer.h"
20#include "TROOT.h"
21
22
24
25
39
40
50 bool takeown)
51{
52 lock_t lock (fMutex);
53 // Make sure the branch element is properly initialized.
55
56 // Look up the checksum->converter map.
57 // (This will make an empty one if this is the first time we've
58 // seen this name.)
59 TClass* cls = conv->GetTransClass();
60 CheckSumMap& cmap = fMap[cls->GetName()];
61
62 // If this is the first converter for this transient class,
63 // set up a streamer for non-split mode conversions.
64 if (cmap.size() == 0)
65 cls->AdoptStreamer (new TConverterStreamer (cmap, cls));
66
67 // Add this converter to the map.
68 cmap[conv->GetCheckSum()] = std::make_pair (conv, takeown);
69}
70
71
80bool TConverterRegistry::AddConverter (const char* convname)
81{
82 TClass* cl = gROOT->GetClass (convname);
83 if (!cl) return false;
84 TClass* basecl = gROOT->GetClass ("TVirtualConverter");
85 int offs = cl->GetBaseClassOffset (basecl);
86 if (offs < 0) return false;
87 char* cnv = reinterpret_cast<char*> (cl->New());
88 AddConverter (reinterpret_cast<TVirtualConverter*> (cnv + offs), true);
89 return true;
90}
91
92
100 int checksum) const
101{
102 lock_t lock (fMutex);
103 auto i = fMap.find (name);
104 if (i != fMap.end()) {
105 auto i2 = i->second.find (checksum);
106 if (i2 != i->second.end())
107 return i2->second.first;
108 }
109 return nullptr;
110}
111
112
113void TConverterRegistry::AddStreamerConverter (const std::string& from_type,
114 const std::string& to_type,
115 TMemberStreamer* streamer)
116{
117 lock_t lock (fMutex);
118 std::string key = from_type + "-" + to_type;
119 auto i = fSMap.find (key);
120 if (i != fSMap.end())
121 delete i->second;
122 fSMap[key] = streamer;
123}
124
125
126TMemberStreamer*
127TConverterRegistry::GetStreamerConverter (const std::string& from_type,
128 const std::string& to_type) const
129{
130 lock_t lock (fMutex);
131 std::string key = from_type + "-" + to_type;
132 auto i = fSMap.find (key);
133 if (i != fSMap.end())
134 return i->second;
135 return nullptr;
136}
137
138
143{
144 // Do it like this so that the object gets destroyed automatically
145 // at program termination.
147 return &instance;
148}
149
150
157{
158 for (auto& [name, checksum_map] : fMap) {
159 for (auto& [checksum, payload] : checksum_map) {
160 if (payload.second)
161 delete payload.first;
162 }
163 }
164
165 for (auto& [key, streamer] : fSMap)
166 delete streamer;
167}
std::map< std::string, double > instance
void TConvertingBranchElement_init()
To allow calling Initialize without having to depend on the header.
Registry for Root converters.
Root streamer that calls our converters when reading in non-split mode.
Base class for Root converters.
Define macros for attributes used to control the static checker.
#define ATLAS_THREAD_SAFE
Registry for Root converters.
MapType fMap
Map of registered converters.
TMemberStreamer * GetStreamerConverter(const std::string &from_type, const std::string &to_type) const
std::map< UInt_t, Payload > CheckSumMap
std::lock_guard< std::mutex > lock_t
static TConverterRegistry * Instance()
Return a pointer to the global registry instance.
void AddConverter(TVirtualConverter *conv)
Add a new converter to the registry.
std::mutex fMutex
Protect access to the map.
void AddStreamerConverter(const std::string &from_type, const std::string &to_type, TMemberStreamer *streamer)
TVirtualConverter * GetConverter(const char *name, int checksum) const
Look up a converter in the registry by name and checksum.
Root streamer that calls our converter when reading in non-split mode.
Base class for converters for Root schema evolution.