ATLAS Offline Software
Public Member Functions | List of all members
DataHeaderElementCnv_p5 Class Reference

This class provides the converter to customize the saving of DataHeaderElement_p5. More...

#include <DataHeaderCnv_p5.h>

Collaboration diagram for DataHeaderElementCnv_p5:

Public Member Functions

 DataHeaderElementCnv_p5 ()
 
 ~DataHeaderElementCnv_p5 ()
 
void persToTrans (const DataHeaderElement_p5 &pers, DataHeaderElement &trans, const DataHeaderForm_p5 &form, unsigned int entry) const
 
void transToPers (const DataHeaderElement &trans, DataHeaderElement_p5 &pers, DataHeaderForm_p5 &form, unsigned int entry) const
 

Detailed Description

This class provides the converter to customize the saving of DataHeaderElement_p5.

Definition at line 24 of file DataHeaderCnv_p5.h.

Constructor & Destructor Documentation

◆ DataHeaderElementCnv_p5()

DataHeaderElementCnv_p5::DataHeaderElementCnv_p5 ( )

Definition at line 16 of file DataHeaderCnv_p5.cxx.

16 {}

◆ ~DataHeaderElementCnv_p5()

DataHeaderElementCnv_p5::~DataHeaderElementCnv_p5 ( )

Definition at line 17 of file DataHeaderCnv_p5.cxx.

17 {}

Member Function Documentation

◆ persToTrans()

void DataHeaderElementCnv_p5::persToTrans ( const DataHeaderElement_p5 pers,
DataHeaderElement trans,
const DataHeaderForm_p5 form,
unsigned int  entry 
) const

Definition at line 20 of file DataHeaderCnv_p5.cxx.

24 {
25  Token& token = trans.m_token;
26  std::vector<unsigned int>::const_iterator intIter = form.params(entry).begin();
27  unsigned int keyIdx = 0U, aliasNum = 0U, clidNum = 0U;
28 // Translate PoolToken
29  if ((*intIter&0x0000FFFF) == 0) {
30  ++intIter;
31  keyIdx = *intIter; ++intIter;
32  aliasNum = *intIter; ++intIter;
33  clidNum = *intIter; ++intIter;
34  token.fromString(pers.m_token);
35  } else {
36  const unsigned int keyPos = (unsigned short)(*intIter>>16),
37  version = (unsigned short)(*intIter&0x0000FFFF); ++intIter;
38  const unsigned int guidIdx = (unsigned short)(*intIter>>16),
39  classIdx = (unsigned short)(*intIter&0x0000FFFF); ++intIter;
40  const unsigned int prefixIdx = (unsigned short)(*intIter>>16),
41  typeIdx = (unsigned short)(*intIter&0x0000FFFF); ++intIter;
42 // Add Technology and Offsets
43  unsigned int tech = 514;
44  if (version&0x00000001U) {
45  tech = *intIter; ++intIter;
46  }
47  unsigned int oid1 = *intIter; ++intIter;
48  if (version&0x00000010U) {
49  keyIdx = *intIter; ++intIter;
50  aliasNum = *intIter; ++intIter;
51  clidNum = *intIter; ++intIter;
52  } else {
53  keyIdx = (*intIter>>16), aliasNum = ((*intIter&0x0000FFFF)>>8), clidNum = (*intIter&0x000000FF); ++intIter;
54  }
55 // Append DbGuid
56  Guid guid(form.map()[guidIdx]);
57  token.setDb(guid);
58 // Container name, may be optimized
59  std::string cntName;
60  if (prefixIdx > 0) {
61  cntName += form.map()[prefixIdx];
62  if (typeIdx > 0) {
63  cntName += form.map()[typeIdx];
64  }
65  }
66 // Insert key
67  if (keyPos > 0) {
68  cntName += pers.m_token.substr(0, keyPos - 1) + form.map()[keyIdx] + pers.m_token.substr(keyPos - 1);
69  } else {
70  cntName += pers.m_token;
71  }
72  //token.setCont(cntName);
73 // Append ClassId
74  Guid clid(form.map()[classIdx]);
75  token.setClassID(clid);
76  token.setTechnology(tech);
77  token.setOid(Token::OID_t(oid1, pers.m_oid2));
78  }
79 
80  auto aliasBeg = form.map().begin() + keyIdx;
81  trans.m_key = *aliasBeg++;
82  trans.m_alias.clear();
83  trans.m_alias.assign (aliasBeg, aliasBeg+aliasNum);
84  if (!std::ranges::is_sorted (trans.m_alias)) {
85  // Should really be sorted, but just in case...
86  std::ranges::sort (trans.m_alias);
87  auto ret = std::ranges::unique (trans.m_alias);
88  trans.m_alias.erase (ret.begin(), ret.end());
89  }
90 
91  trans.m_pClid = *intIter; ++intIter;
92  const std::vector<unsigned int>::const_iterator intLast = form.params(entry).end();
93  if (intIter+clidNum > intLast) {
94  clidNum = intLast - intIter;
95  }
96  trans.m_clids.assign (intIter, intIter+clidNum);
97  intIter += clidNum;
98  trans.m_hashes.clear();
99  for (; intIter != intLast; ++intIter) {
100  trans.m_hashes.push_back(*intIter);
101  }
102 }

◆ transToPers()

void DataHeaderElementCnv_p5::transToPers ( const DataHeaderElement trans,
DataHeaderElement_p5 pers,
DataHeaderForm_p5 form,
unsigned int  entry 
) const

Definition at line 104 of file DataHeaderCnv_p5.cxx.

107  {
108  unsigned int tech = 0U, oid1 = 0U;
109  unsigned short guidIdx = 0U, classIdx = 0U, prefixIdx = 0U, typeIdx = 0U, keyPos = 0U;
110 // Translate PoolToken
111  if (trans.getToken() != 0) {
112 // Database GUID
113  const std::string guid = trans.getToken()->dbID().toString();
114  for (std::vector<std::string>::const_iterator iter = form.map().begin(), last = form.map().end();
115  iter != last; ++iter, ++guidIdx) {
116  if (*iter == guid) break;
117  }
118  if (guidIdx == form.map().size()) {
119  form.insertMap(guid);
120  }
121 // Class GUID
122  const std::string clid = trans.getToken()->classID().toString();
123  for (std::vector<std::string>::const_iterator iter = form.map().begin(), last = form.map().end();
124  iter != last; ++iter, ++classIdx) {
125  if (*iter == clid) break;
126  }
127  if (classIdx == form.map().size()) {
128  form.insertMap(clid);
129  }
130 // Container name, can be optimized
131  pers.m_token = trans.getToken()->contID();
132 // Get Prefix
133  std::string::size_type delim = pers.m_token.find_first_of("_/(");
134  if (delim != std::string::npos) {
135  const std::string persComp1 = pers.m_token.substr(0, delim + 1);
136  for (std::vector<std::string>::const_iterator iter = form.map().begin(), last = form.map().end();
137  iter != last; ++iter, ++prefixIdx) {
138  if (*iter == persComp1) break;
139  }
140  if (prefixIdx == form.map().size()) {
141  form.insertMap(persComp1);
142  }
143  pers.m_token = pers.m_token.substr(delim + 1);
144 // Get TypeName
145 // Check whether Key only is used for placement
146  if (!pers.m_token.starts_with( trans.m_key)) {
147  std::string::size_type delim = pers.m_token.find_first_of("/()");
148  if (delim != std::string::npos) {
149  const std::string persComp2 = pers.m_token.substr(0, delim + 1);
150  for (std::vector<std::string>::const_iterator iter = form.map().begin(), last = form.map().end();
151  iter != last; ++iter, ++typeIdx) {
152  if (*iter == persComp2) break;
153  }
154  if (typeIdx == form.map().size()) {
155  form.insertMap(persComp2);
156  }
157  pers.m_token = pers.m_token.substr(delim + 1);
158  } else if (pers.m_token == "DataHeader") {
159  for (std::vector<std::string>::const_iterator iter = form.map().begin(), last = form.map().end();
160  iter != last; ++iter, ++typeIdx) {
161  if (*iter == "DataHeader") break;
162  }
163  if (typeIdx == form.map().size()) {
164  form.insertMap("DataHeader");
165  }
166  pers.m_token.clear();
167  }
168  }
169  }
170  delim = pers.m_token.rfind(trans.m_key);
171  if (delim != std::string::npos) {
172  keyPos = delim + 1;
173  pers.m_token = pers.m_token.substr(0, delim) + pers.m_token.substr(delim + trans.m_key.size());
174  }
175  tech = trans.getToken()->technology();
176  oid1 = trans.getToken()->oid().first;
177  pers.m_oid2 = trans.getToken()->oid().second;
178  }
179  unsigned int version = 0x0000FFFFU;
180  if (tech == 514) {
181  version = version&0x0000FFFEU;
182  }
183  unsigned int keyIdx = form.map().size(), aliasNum = trans.m_alias.size(), clidNum = trans.m_clids.size();
184  if (keyIdx < 0x00010000U && aliasNum < 0x00000100U && clidNum < 0x00000100U) {
185  version = version&0x0000FFEFU;
186  }
187  form.insertParam((unsigned int)(keyPos) * 0x00010000U + version, entry);
188  form.insertParam((unsigned int)(guidIdx) * 0x00010000U + (unsigned int)(classIdx), entry);
189  form.insertParam((unsigned int)(prefixIdx) * 0x00010000U + (unsigned int)(typeIdx), entry);
190  if (version&0x00000001U) {
191  form.insertParam(tech, entry);
192  }
193  form.insertParam(oid1, entry);
194  if (version&0x00000010U) {
195  form.insertParam(keyIdx, entry);
196  form.insertParam(aliasNum, entry);
197  form.insertParam(clidNum, entry);
198  } else {
199  form.insertParam(keyIdx * 0x00010000U + aliasNum * 0x00000100U + clidNum, entry);
200  }
201  form.insertMap(trans.m_key);
202  for (const std::string& a : trans.m_alias) {
203  form.insertMap(a);
204  }
205  form.insertParam(trans.m_pClid, entry);
206  for (CLID clid : trans.m_clids) {
207  form.insertParam(clid, entry);
208  }
209  for (std::vector<SG::sgkey_t>::const_iterator iter = trans.m_hashes.begin(),
210  last = trans.m_hashes.end(); iter != last; ++iter) {
212  }
213 }

The documentation for this class was generated from the following files:
createLinkingScheme.iter
iter
Definition: createLinkingScheme.py:62
DataHeaderElement_p5::m_token
std::string m_token
Definition: DataHeader_p5.h:35
DataHeaderElement::m_key
std::string m_key
string with StoreGate key.
Definition: DataHeader.h:112
DataHeaderElement::m_alias
std::vector< std::string > m_alias
vector of StoreGate alias string.
Definition: DataHeader.h:114
Token::contID
const std::string & contID() const
Access container identifier.
Definition: Token.h:69
DataHeaderElement::m_token
Token m_token
Transient address token.
Definition: DataHeader.h:116
xAOD::short
short
Definition: Vertex_v1.cxx:165
DataHeaderElement::m_pClid
CLID m_pClid
primary ClassID.
Definition: DataHeader.h:108
Token::dbID
const Guid & dbID() const
Access database identifier.
Definition: Token.h:64
Guid::toString
const std::string toString() const
Automatic conversion to string representation.
Definition: Guid.cxx:58
DataHeaderForm_p5::map
const std::vector< std::string > & map() const
Definition: DataHeader_p5.cxx:45
Token::classID
const Guid & classID() const
Access database identifier.
Definition: Token.h:73
Token
This class provides a token that identifies in a unique way objects on the persistent storage.
Definition: Token.h:21
DataHeaderForm_p5::params
const std::vector< unsigned int > & params(unsigned int entry) const
Definition: DataHeader_p5.cxx:53
Token::OID_t
Definition: Token.h:24
Token::fromString
Token & fromString(const std::string &from)
Build from the string representation of a token.
Definition: Token.cxx:148
Token::setClassID
Token & setClassID(const Guid &cl_id)
Access database identifier.
Definition: Token.h:75
Token::technology
int technology() const
Access technology type.
Definition: Token.h:77
SG::sgkeyShort
constexpr uint32_t sgkeyShort(const sgkey_t k)
Convert a sgkey to the 32-bit form used for older data.
Definition: CxxUtils/CxxUtils/sgkey_t.h:85
Token::setDb
Token & setDb(const Guid &db)
Set database name.
Definition: Token.h:66
DataHeaderElement_p5::m_oid2
long long int m_oid2
Definition: DataHeader_p5.h:36
Token::setTechnology
Token & setTechnology(int t)
Set technology type.
Definition: Token.h:79
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
DataHeaderForm_p5::insertMap
void insertMap(const std::string &element)
Definition: DataHeader_p5.cxx:49
pool_uuid.guid
guid
Definition: pool_uuid.py:112
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
Token::setOid
Token & setOid(const OID_t &oid)
Set object identifier.
Definition: Token.h:85
DataHeaderElement::m_hashes
std::vector< sgkey_t > m_hashes
hash table for ElementLink host container keys.
Definition: DataHeader.h:118
DataHeaderElement::m_clids
std::vector< CLID > m_clids
vector of unsigned long to store ClassID's for symlinked container.
Definition: DataHeader.h:110
get_generator_info.version
version
Definition: get_generator_info.py:33
Guid
This class provides a encapsulation of a GUID/UUID/CLSID/IID data structure (128 bit number).
Definition: Guid.h:20
a
TList * a
Definition: liststreamerinfos.cxx:10
DataHeaderForm_p5::insertParam
void insertParam(unsigned int param, unsigned int entry)
Definition: DataHeader_p5.cxx:57
Token::oid
const OID_t & oid() const
Access object identifier.
Definition: Token.h:81
DataHeaderElement::getToken
const Token * getToken() const
Definition: DataHeader.cxx:125