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 + 1 == end || sorter(*begin, *(begin + 1)));
90 outItr = std::find_if(outItr, outContainer.end(),
91 [&](const outT::base_value_type* obj){
92 return !sorter(obj, *begin);
93 });
94 outItr = outContainer.insert(outItr, *begin);
95 }
96 }
97
115 template <detail::isMuonMeasurementCont outT,
116 detail::isMuonMeasurement inT>
118 const DataVector<inT>& inCont) {
119 mergeInRange<inT>(inCont.begin(), inCont.end(), outContainer);
120 }
121
152 template <detail::isMuonMeasurementCont outT,
153 detail::isMuonMeasurement inT1,
154 detail::isMuonMeasurement inT2>
156 const DataVector<inT1>& inCont1,
157 const DataVector<inT2>& inCont2)
158 requires(std::is_base_of_v<typename outT::base_value_type, inT1> &&
159 std::is_base_of_v<typename outT::base_value_type, inT2>){
160 const std::size_t startSize = outContainer.size();
161 outContainer.reserve(startSize + inCont1.size() + inCont2.size());
162 typename DataVector<inT1>::const_iterator begin1 = inCont1.begin();
163 typename DataVector<inT2>::const_iterator begin2 = inCont2.begin();
164
165 const typename DataVector<inT1>::const_iterator end1 = inCont1.end();
166 const typename DataVector<inT2>::const_iterator end2 = inCont2.end();
168 typename ConstDataVector<outT>::iterator insert = outContainer.begin();
169 while ( begin1!= end1 || begin2 != end2) {
170 if (begin1== end1) {
171 mergeInRange<inT2>(begin2, end2, outContainer);
172 break;
173 } else if (begin2 == end2) {
174 mergeInRange<inT1>(begin1, end1, outContainer);
175 break;
176 } else {
177 const typename outT::base_value_type* mergeMe = nullptr;
178 if (sorter(*begin1, *begin2)){
179 mergeMe = *begin1;
180 ++begin1;
181 } else {
182 mergeMe = *begin2;
183 ++begin2;
184 }
185 insert = std::find_if(insert, outContainer.end(),
186 [&](const outT::base_value_type* obj){
187 return !sorter(obj, mergeMe);
188 });
189 insert = outContainer.insert(insert, mergeMe);
190 }
191 }
192 assert(inCont1.size() + inCont2.size() + startSize == outContainer.size());
193 }
194}
195
196
197#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.