ATLAS Offline Software
Loading...
Searching...
No Matches
PackedLinkVectorHelper.cxx
Go to the documentation of this file.
1/*
2 * Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration.
3 */
10
11
13
14
15namespace SG::detail {
16
17
41std::pair<size_t, bool>
43 sgkey_t sgkey,
44 DataLinkBase_span& links,
45 IProxyDict* sg,
46 InitLinkFunc_t* initLinkFunc)
47{
48 if (sgkey == 0) {
49 if (!links.empty())
50 return std::make_pair (0u, true);
51 }
52 else {
53 for (size_t i = 1; i < links.size(); ++i) {
54 if (links[i].key() == sgkey) return std::make_pair (i, true);
55 }
56 }
57 size_t oldsz = links.size();
58 size_t newsz = oldsz+1;
59 if (oldsz == 0 && sgkey != 0) {
60 newsz = 2;
61 }
62 bool cacheValid = resizeLinks (linkedVec, newsz);
63 initLinkFunc (links.back(), sgkey, sg);
64 return std::make_pair (links.size() - 1, cacheValid);
65}
66
67
86bool
89 const const_DataLinkBase_span& srcDLinks,
90 IProxyDict* sg,
91 InitLinkFunc_t* initLinkFunc)
92{
93 DataLinkBase_span DLinks = getLinkBaseSpan (linkedVec);
94 if (sg == nullptr) {
95 sg = storeFromSpan (DLinks);
96 }
97 bool cacheValid = true;
98 for (PackedLinkBase& l : links) {
99 size_t in_coll = l.collection();
100 if (in_coll > 0) {
101 LinkedVector lv (linkedVec);
102 auto [index, thisValid] = findCollectionBase
103 (lv, srcDLinks.at(in_coll).key(), DLinks, sg, initLinkFunc);
104 l.setCollection (index);
105 cacheValid &= thisValid;
106 }
107 }
108 return cacheValid;
109}
110
111
112#ifndef XAOD_STANDALONE
129bool
131 PackedLinkBase_span& links,
132 DataLinkBase_span& dlinks,
133 const SG::ThinningCache* tc,
134 IProxyDict* sg,
135 InitLinkFunc_t* initLinkFunc)
136{
137 bool cacheValid = true;
138 for (PackedLinkBase& l : links) {
139 if (l.collection() != 0) {
140 sgkey_t sgkey = dlinks[l.collection()].key();
141 size_t index = l.index();
142 sgkey_t sgkey_out = sgkey;
143 size_t index_out = index;
144 if (sg) {
145 sg->tryELRemap (sgkey, index, sgkey_out, index_out);
146 }
147 (void)DataProxyHolder::thin (sgkey_out, index_out, tc);
148 l.setIndex (index_out);
149 if (sgkey_out != sgkey) {
150 LinkedVector lv (linkedVec);
151 auto [index, flag] = findCollectionBase (lv, sgkey_out, dlinks,
152 sg, initLinkFunc);
153 l.setCollection (index);
154 cacheValid &= flag;
155 }
156 }
157 }
158 return cacheValid;
159}
160#endif
161
162
170bool
172{
173 return linkedVec->resize (sz);
174}
175
176
177} // namespace SG::detail
static Double_t sz
static Double_t tc
Implementation of IAuxTypeVector for PackedLink types.
sgkey_t key() const
Return the SG key that we reference, as a hash.
virtual bool tryELRemap(sgkey_t sgkey_in, size_t index_in, sgkey_t &sgkey_out, size_t &index_out)
Test to see if the target of an ElementLink has moved.
static bool thin(sgkey_t &sgkey, size_t &index, const SG::ThinningCache *thinningCache)
Adjust for thinning, with explicitly provided thinning cache.
Abstract interface for manipulating vectors of arbitrary types.
virtual bool resize(size_t sz)=0
Change the size of the vector.
Cache thinning decisions for converters.
const T & at(size_t index) const
Bounds-checked element access.
Helper to access the IAuxTypeVector for an aux variable.
static std::pair< size_t, bool > findCollectionBase(LinkedVector &linkedVec, sgkey_t sgkey, DataLinkBase_span &links, IProxyDict *sg, InitLinkFunc_t *initLinkFunc)
Find the collection index in the linked DataLinks for a sgkey.
detail::AuxDataSpan< DataLinkBase > DataLinkBase_span
Spans over the linked DataLinks.
detail::AuxDataConstSpan< DataLinkBase > const_DataLinkBase_span
CxxUtils::span< PackedLinkBase > PackedLinkBase_span
Span over links.
static bool applyThinningBase(IAuxTypeVector &linkedVec, PackedLinkBase_span &links, DataLinkBase_span &dlinks, const SG::ThinningCache *tc, IProxyDict *sg, InitLinkFunc_t *initLinkFunc)
Apply thinning to packed links, to prepare them for output.
static DataLinkBase_span getLinkBaseSpan(IAuxTypeVector &linkedVec)
Return a span over all the linked DataLinkBase's, from the linked vector.
void InitLinkFunc_t(DataLinkBase &dl, sgkey_t sgkey, IProxyDict *sg)
Function to initialize a DataLink to a given hashed key.
static IProxyDict * storeFromSpan(DataLinkBase_span &links)
Return the current store from the first valid link in the span.
static bool updateLinksBase(IAuxTypeVector &linkedVec, PackedLinkBase_span &links, const const_DataLinkBase_span &srcDLinks, IProxyDict *sg, InitLinkFunc_t *initLinkFunc)
Update collection index of a collection of PackedLink.
static bool resizeLinks(LinkedVector &linkedVec, size_t sz)
Resize a linked vector of DataLinks.
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
Definition sgkey_t.h:32
Definition index.py:1
A packed version of ElementLink.