ATLAS Offline Software
Loading...
Searching...
No Matches
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 ()
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{}

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}
long long int m_oid2
CLID m_pClid
primary ClassID.
Definition DataHeader.h:105
std::string m_key
string with StoreGate key.
Definition DataHeader.h:109
std::vector< std::string > m_alias
vector of StoreGate alias string.
Definition DataHeader.h:111
std::vector< CLID > m_clids
vector of unsigned long to store ClassID's for symlinked container.
Definition DataHeader.h:107
std::vector< sgkey_t > m_hashes
hash table for ElementLink host container keys.
Definition DataHeader.h:115
Token m_token
Transient address token.
Definition DataHeader.h:113
const std::vector< std::string > & map() const
const std::vector< unsigned int > & params(unsigned int entry) const
Token & setDb(const Guid &db)
Set database name.
Definition Token.h:66
Token & setClassID(const Guid &cl_id)
Access database identifier.
Definition Token.h:75
Token & setOid(const OID_t &oid)
Set object identifier.
Definition Token.h:85
Token & setTechnology(int t)
Set technology type.
Definition Token.h:79
Token & fromString(const std::string_view from)
Build from the string representation of a token.
Definition Token.cxx:147

◆ 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) {
211 form.insertParam(SG::sgkeyShort (*iter), entry);
212 }
213}
uint32_t CLID
The Class ID type.
static Double_t a
const Token * getToken() const
void insertParam(unsigned int param, unsigned int entry)
void insertMap(const std::string &element)
constexpr void toString(std::span< char, StrLen > buf, bool uppercase=true) const noexcept
Automatic conversion to string representation.
const std::string & contID() const
Access container identifier.
Definition Token.h:69
const Guid & classID() const
Access database identifier.
Definition Token.h:73
int technology() const
Access technology type.
Definition Token.h:77
const OID_t & oid() const
Access object identifier.
Definition Token.h:81
const Guid & dbID() const
Access database identifier.
Definition Token.h:64
constexpr uint32_t sgkeyShort(const sgkey_t k)
Convert a sgkey to the 32-bit form used for older data.
Definition sgkey_t.h:85

The documentation for this class was generated from the following files: