17#ifndef XAODMUONVIEWS_MERGECONTAINER_H
18#define XAODMUONVIEWS_MERGECONTAINER_H
34 template <
typename T>
concept isMuonMeasurement = std::is_base_of_v<xAOD::MuonMeasurement, T>;
47 std::is_base_of_v<xAOD::MuonMeasurement, typename Cont_t::base_value_type>;
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);
87 for (; begin != end; ++begin){
89 assert ((*begin) !=
nullptr);
92 assert ((*next) !=
nullptr);
93 assert ((*begin)->identifierHash() <= (*next)->identifierHash());
96 outItr = std::find_if(outItr, outContainer.end(),
97 [&](
const outT::base_value_type* obj){
98 return !sorter(obj, *begin);
100 outItr = outContainer.insert(outItr, *begin);
121 template <detail::isMuonMeasurementCont outT,
122 detail::isMuonMeasurement inT>
158 template <detail::isMuonMeasurementCont outT,
159 detail::isMuonMeasurement inT1,
160 detail::isMuonMeasurement inT2>
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());
175 while ( begin1!= end1 || begin2 != end2) {
179 }
else if (begin2 == end2) {
183 const typename outT::base_value_type* mergeMe =
nullptr;
184 if (sorter(*begin1, *begin2)){
191 insert = std::find_if(insert, outContainer.end(),
192 [&](
const outT::base_value_type* obj){
193 return !sorter(obj, mergeMe);
195 insert = outContainer.insert(insert, mergeMe);
198 assert(inCont1.size() + inCont2.size() + startSize == outContainer.size());
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.
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
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.