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 + 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);
94 outItr = outContainer.insert(outItr, *begin);
115 template <detail::isMuonMeasurementCont outT,
116 detail::isMuonMeasurement inT>
152 template <detail::isMuonMeasurementCont outT,
153 detail::isMuonMeasurement inT1,
154 detail::isMuonMeasurement inT2>
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());
169 while ( begin1!= end1 || begin2 != end2) {
173 }
else if (begin2 == end2) {
177 const typename outT::base_value_type* mergeMe =
nullptr;
178 if (sorter(*begin1, *begin2)){
185 insert = std::find_if(insert, outContainer.end(),
186 [&](
const outT::base_value_type* obj){
187 return !sorter(obj, mergeMe);
189 insert = outContainer.insert(insert, mergeMe);
192 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.