ATLAS Offline Software
Loading...
Searching...
No Matches
ContainerMerge.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
16
17#ifndef XAODMUONVIEWS_MERGECONTAINER_H
18#define XAODMUONVIEWS_MERGECONTAINER_H
19
24
25namespace xAOD{
27 namespace detail {
34 template <typename T>concept isMuonMeasurement = std::is_base_of_v<xAOD::MuonMeasurement, T>;
35
45 template <typename Cont_t> concept isMuonMeasurementCont =
47 std::is_base_of_v<xAOD::MuonMeasurement, typename Cont_t::base_value_type>;
48
49 }
50
51
74 template <detail::isMuonMeasurement inT,
77 const typename DataVector<inT>::const_iterator end,
78 ConstDataVector<outT>& outContainer)
79 requires(std::is_base_of_v<typename outT::base_value_type, inT>) {
80 outContainer.reserve(std::distance(begin, end));
81 if (outContainer.empty()) {
82 outContainer.insert(outContainer.end(), begin, end);
83 return;
84 }
86 typename ConstDataVector<outT>::iterator outItr = outContainer.begin();
87 for (; begin != end; ++begin){
89 assert ((*begin) != nullptr);
90#ifndef NDEBUG
91 if (typename DataVector<inT>::const_iterator next = (begin +1); next != end) {
92 assert ((*next) != nullptr);
93 assert ((*begin)->identifierHash() <= (*next)->identifierHash());
94 }
95#endif
96 outItr = std::find_if(outItr, outContainer.end(),
97 [&](const outT::base_value_type* obj){
98 return !sorter(obj, *begin);
99 });
100 outItr = outContainer.insert(outItr, *begin);
101 }
102 }
103
121 template <detail::isMuonMeasurementCont outT,
122 detail::isMuonMeasurement inT>
124 const DataVector<inT>& inCont) {
125 mergeInRange<inT>(inCont.begin(), inCont.end(), outContainer);
126 }
127
158 template <detail::isMuonMeasurementCont outT,
159 detail::isMuonMeasurement inT1,
160 detail::isMuonMeasurement inT2>
162 const DataVector<inT1>& inCont1,
163 const DataVector<inT2>& inCont2)
164 requires(std::is_base_of_v<typename outT::base_value_type, inT1> &&
165 std::is_base_of_v<typename outT::base_value_type, inT2>){
166 const std::size_t startSize = outContainer.size();
167 outContainer.reserve(startSize + inCont1.size() + inCont2.size());
168 typename DataVector<inT1>::const_iterator begin1 = inCont1.begin();
169 typename DataVector<inT2>::const_iterator begin2 = inCont2.begin();
170
171 const typename DataVector<inT1>::const_iterator end1 = inCont1.end();
172 const typename DataVector<inT2>::const_iterator end2 = inCont2.end();
174 typename ConstDataVector<outT>::iterator insert = outContainer.begin();
175 while ( begin1!= end1 || begin2 != end2) {
176 if (begin1== end1) {
177 mergeInRange<inT2>(begin2, end2, outContainer);
178 break;
179 } else if (begin2 == end2) {
180 mergeInRange<inT1>(begin1, end1, outContainer);
181 break;
182 } else {
183 const typename outT::base_value_type* mergeMe = nullptr;
184 if (sorter(*begin1, *begin2)){
185 mergeMe = *begin1;
186 ++begin1;
187 } else {
188 mergeMe = *begin2;
189 ++begin2;
190 }
191 insert = std::find_if(insert, outContainer.end(),
192 [&](const outT::base_value_type* obj){
193 return !sorter(obj, mergeMe);
194 });
195 insert = outContainer.insert(insert, mergeMe);
196 }
197 }
198 assert(inCont1.size() + inCont2.size() + startSize == outContainer.size());
199 }
200}
201
202
203#endif
DataVector adapter that acts like it holds const pointers.
DataVector adapter that acts like it holds const pointers.
DataModel_detail::iterator< ConstDataVector > iterator
The iterator for this type.
Derived DataVector<T>.
Definition DataVector.h:795
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
Helper struct to establish a sorting of the muon measurements based on their Identifier.
Define the primary container.
Concept that verifies a type is a valid MuonMeasurement container.
Concept that verifies a type is derived from xAOD::MuonMeasurement.
Internal implementation details and type concepts for container merging.
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
void mergeInRange(typename DataVector< inT >::const_iterator begin, const typename DataVector< inT >::const_iterator end, ConstDataVector< outT > &outContainer)
Merges a range of MuonMeasurement objects into a sorted output container.
void mergeContainer(ConstDataVector< outT > &outContainer, const DataVector< inT > &inCont)
Merges a single container of MuonMeasurement objects into an output container.