ATLAS Offline Software
Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
TConverterRegistry Class Reference

Registry for Root converters. More...

#include <TConverterRegistry.h>

Collaboration diagram for TConverterRegistry:

Public Member Functions

void AddConverter (TVirtualConverter *conv)
 Add a new converter to the registry. More...
 
void AddConverter (TVirtualConverter *conv, bool takeown)
 Add a new converter to the registry. More...
 
bool AddConverter (const char *convname)
 Add a new converter to the registry. More...
 
TVirtualConverterGetConverter (const char *name, int checksum) const
 Look up a converter in the registry by name and checksum. More...
 
void AddStreamerConverter (const std::string &from_type, const std::string &to_type, TMemberStreamer *streamer)
 
TMemberStreamer * GetStreamerConverter (const std::string &from_type, const std::string &to_type) const
 

Static Public Member Functions

static TConverterRegistryInstance ()
 Return a pointer to the global registry instance. More...
 

Private Types

typedef std::pair< TVirtualConverter *, bool > Payload
 
typedef std::map< UInt_t, PayloadCheckSumMap
 
typedef std::map< std::string, CheckSumMapMapType
 
using lock_t = std::lock_guard< std::mutex >
 
typedef std::map< std::string, TMemberStreamer * > SMapType
 Streamer converters. More...
 

Private Member Functions

 ~TConverterRegistry ()
 Destructor. More...
 

Private Attributes

MapType fMap
 Map of registered converters. More...
 
std::mutex fMutex
 Protect access to the map. More...
 
SMapType fSMap
 

Detailed Description

Registry for Root converters.

Definition at line 40 of file TConverterRegistry.h.

Member Typedef Documentation

◆ CheckSumMap

typedef std::map<UInt_t, Payload> TConverterRegistry::CheckSumMap
private

Definition at line 112 of file TConverterRegistry.h.

◆ lock_t

using TConverterRegistry::lock_t = std::lock_guard<std::mutex>
private

Definition at line 120 of file TConverterRegistry.h.

◆ MapType

typedef std::map<std::string, CheckSumMap> TConverterRegistry::MapType
private

Definition at line 113 of file TConverterRegistry.h.

◆ Payload

typedef std::pair<TVirtualConverter*, bool> TConverterRegistry::Payload
private

Definition at line 111 of file TConverterRegistry.h.

◆ SMapType

typedef std::map<std::string, TMemberStreamer*> TConverterRegistry::SMapType
private

Streamer converters.

Definition at line 124 of file TConverterRegistry.h.

Constructor & Destructor Documentation

◆ ~TConverterRegistry()

TConverterRegistry::~TConverterRegistry ( )
private

Destructor.

Destroy the registered converters.

Definition at line 157 of file TConverterRegistry.cxx.

158 {
159  for (MapType::iterator i = fMap.begin(); i != fMap.end(); ++i) {
160  for (CheckSumMap::iterator j = i->second.begin();
161  j != i->second.end();
162  ++j)
163  {
164  if (j->second.second)
165  delete j->second.first;
166  }
167  }
168 
169  for (SMapType::iterator i = fSMap.begin(); i != fSMap.end(); ++i)
170  delete i->second;
171 }

Member Function Documentation

◆ AddConverter() [1/3]

bool TConverterRegistry::AddConverter ( const char *  convname)

Add a new converter to the registry.

Parameters
convnameThe name of the converter class to add.
Returns
True if successful, false if the class couldn't be found.

This will also add a streamer for the class, to support conversion in non-split mode.

Definition at line 81 of file TConverterRegistry.cxx.

82 {
83  TClass* cl = gROOT->GetClass (convname);
84  if (!cl) return false;
85  TClass* basecl = gROOT->GetClass ("TVirtualConverter");
86  int offs = cl->GetBaseClassOffset (basecl);
87  if (offs < 0) return false;
88  char* cnv = reinterpret_cast<char*> (cl->New());
89  AddConverter (reinterpret_cast<TVirtualConverter*> (cnv + offs), true);
90  return true;
91 }

◆ AddConverter() [2/3]

void TConverterRegistry::AddConverter ( TVirtualConverter conv)

Add a new converter to the registry.

Parameters
convThe converter to add.

This will also add a streamer for the class, to support conversion in non-split mode.

The caller will retain ownership of the converter.

Definition at line 36 of file TConverterRegistry.cxx.

37 {
38  AddConverter (conv, false);
39 }

◆ AddConverter() [3/3]

void TConverterRegistry::AddConverter ( TVirtualConverter conv,
bool  takeown 
)

Add a new converter to the registry.

Parameters
convThe converter to add.
takeownIf true, the registry takes ownership of the converter.

This will also add a streamer for the class, to support conversion in non-split mode.

Definition at line 50 of file TConverterRegistry.cxx.

52 {
53  lock_t lock (fMutex);
54  // Make sure the branch element is properly initialized.
56 
57  // Look up the checksum->converter map.
58  // (This will make an empty one if this is the first time we've
59  // seen this name.)
60  TClass* cls = conv->GetTransClass();
61  CheckSumMap& cmap = fMap[cls->GetName()];
62 
63  // If this is the first converter for this transient class,
64  // set up a streamer for non-split mode conversions.
65  if (cmap.size() == 0)
66  cls->AdoptStreamer (new TConverterStreamer (cmap, cls));
67 
68  // Add this converter to the map.
69  cmap[conv->GetCheckSum()] = std::make_pair (conv, takeown);
70 }

◆ AddStreamerConverter()

void TConverterRegistry::AddStreamerConverter ( const std::string &  from_type,
const std::string &  to_type,
TMemberStreamer *  streamer 
)

Definition at line 114 of file TConverterRegistry.cxx.

117 {
118  lock_t lock (fMutex);
119  std::string key = from_type + "-" + to_type;
120  SMapType::const_iterator i = fSMap.find (key);
121  if (i != fSMap.end())
122  delete i->second;
123  fSMap[key] = streamer;
124 }

◆ GetConverter()

TVirtualConverter * TConverterRegistry::GetConverter ( const char *  name,
int  checksum 
) const

Look up a converter in the registry by name and checksum.

Parameters
nameThe name of the (transient) class.
checksumThe checksum of the persistent class.
Returns
The converter, or 0 if none.

Definition at line 100 of file TConverterRegistry.cxx.

102 {
103  lock_t lock (fMutex);
104  MapType::const_iterator i = fMap.find (name);
105  if (i != fMap.end()) {
106  CheckSumMap::const_iterator i2 = i->second.find (checksum);
107  if (i2 != i->second.end())
108  return i2->second.first;
109  }
110  return 0;
111 }

◆ GetStreamerConverter()

TMemberStreamer * TConverterRegistry::GetStreamerConverter ( const std::string &  from_type,
const std::string &  to_type 
) const

Definition at line 128 of file TConverterRegistry.cxx.

130 {
131  lock_t lock (fMutex);
132  std::string key = from_type + "-" + to_type;
133  SMapType::const_iterator i = fSMap.find (key);
134  if (i != fSMap.end())
135  return i->second;
136  return 0;
137 }

◆ Instance()

TConverterRegistry * TConverterRegistry::Instance ( )
static

Return a pointer to the global registry instance.

Definition at line 143 of file TConverterRegistry.cxx.

144 {
145  // Do it like this so that the object gets destroyed automatically
146  // at program termination.
148  return &instance;
149 }

Member Data Documentation

◆ fMap

MapType TConverterRegistry::fMap
private

Map of registered converters.

Definition at line 116 of file TConverterRegistry.h.

◆ fMutex

std::mutex TConverterRegistry::fMutex
mutableprivate

Protect access to the map.

Definition at line 119 of file TConverterRegistry.h.

◆ fSMap

SMapType TConverterRegistry::fSMap
private

Definition at line 125 of file TConverterRegistry.h.


The documentation for this class was generated from the following files:
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
TConverterRegistry::fSMap
SMapType fSMap
Definition: TConverterRegistry.h:125
TConvertingBranchElement_init
void TConvertingBranchElement_init()
To allow calling Initialize without having to depend on the header.
Definition: TConvertingBranchElement.cxx:1375
TConverterRegistry::CheckSumMap
std::map< UInt_t, Payload > CheckSumMap
Definition: TConverterRegistry.h:112
CaloClusterListBadChannel.cls
cls
Definition: CaloClusterListBadChannel.py:8
TConverterStreamer
Root streamer that calls our converter when reading in non-split mode.
Definition: TConverterStreamer.h:45
TConverterRegistry::fMutex
std::mutex fMutex
Protect access to the map.
Definition: TConverterRegistry.h:119
instance
std::map< std::string, double > instance
Definition: Run_To_Get_Tags.h:8
lumiFormat.i
int i
Definition: lumiFormat.py:92
TVirtualConverter
Base class for converters for Root schema evolution.
Definition: TVirtualConverter.h:110
TConverterRegistry::lock_t
std::lock_guard< std::mutex > lock_t
Definition: TConverterRegistry.h:120
TConverterRegistry
Registry for Root converters.
Definition: TConverterRegistry.h:41
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
TConverterRegistry::fMap
MapType fMap
Map of registered converters.
Definition: TConverterRegistry.h:116
TConverterRegistry::AddConverter
void AddConverter(TVirtualConverter *conv)
Add a new converter to the registry.
Definition: TConverterRegistry.cxx:36
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
dq_make_web_display.cl
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]
Definition: dq_make_web_display.py:26
pdg_comparison.conv
conv
Definition: pdg_comparison.py:321
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37