From a3f949f9e688fa46655562197fd322f495165d6f Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Mon, 19 Jan 2026 15:33:51 +0100 Subject: [PATCH 1/8] use ranges for index builder; simplify condition --- Framework/Core/src/AnalysisHelpers.cxx | 37 ++++++++------------------ 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/Framework/Core/src/AnalysisHelpers.cxx b/Framework/Core/src/AnalysisHelpers.cxx index f2ecb2d68ce28..326be388b2569 100644 --- a/Framework/Core/src/AnalysisHelpers.cxx +++ b/Framework/Core/src/AnalysisHelpers.cxx @@ -46,14 +46,12 @@ void IndexBuilder::resetBuilders(std::vector& bui std::shared_ptr IndexBuilder::materialize(std::vector& builders, std::vector>&& tables, std::vector const& records, std::shared_ptr const& schema, bool exclusive) { auto size = tables[0]->num_rows(); - if (builders.empty()) { + if (O2_BUILTIN_UNLIKELY(builders.empty())) { builders = makeBuilders(std::move(tables), records); } else { resetBuilders(builders, std::move(tables)); } - std::vector finds; - finds.resize(builders.size()); for (int64_t counter = 0; counter < size; ++counter) { int64_t idx = -1; if (std::get(builders[0].builder).keyIndex == nullptr) { @@ -61,29 +59,19 @@ std::shared_ptr IndexBuilder::materialize(std::vector(builders[0].builder).keyIndex->valueAt(counter); } - for (auto i = 0U; i < builders.size(); ++i) { - finds[i] = builders[i].find(idx); - } - if (exclusive) { - if (std::none_of(finds.begin(), finds.end(), [](bool const x) { return x == false; })) { - builders[0].fill(counter); - for (auto i = 1U; i < builders.size(); ++i) { - builders[i].fill(idx); - } - } - } else { + + bool found = true; + std::ranges::for_each(builders, [&idx, &found](auto& builder) { found &= builder.find(idx); }); + + if (!exclusive || found) { builders[0].fill(counter); - for (auto i = 1U; i < builders.size(); ++i) { - builders[i].fill(idx); - } + std::ranges::for_each(builders.begin() + 1, builders.end(), [&idx](auto& builder){ builder.fill(idx); }); } } std::vector> arrays; arrays.reserve(builders.size()); - for (auto& builder : builders) { - arrays.push_back(builder.result()); - } + std::ranges::transform(builders, std::back_inserter(arrays), [](auto& builder){ return builder.result(); }); return arrow::Table::Make(schema, arrays); } @@ -142,9 +130,7 @@ std::shared_ptr spawnerHelper(std::shared_ptr const& } arrays.reserve(nColumns); - for (auto i = 0U; i < nColumns; ++i) { - arrays.push_back(std::make_shared(chunks[i])); - } + std::ranges::transform(chunks, std::back_inserter(arrays), [](auto&& chunk){ return std::make_shared(chunk); }); return arrow::Table::Make(newSchema, arrays); } @@ -188,9 +174,8 @@ std::string serializeIndexRecords(std::vector& irs) std::vector> extractSources(ProcessingContext& pc, std::vector const& matchers) { std::vector> tables; - for (auto const& matcher : matchers) { - tables.emplace_back(pc.inputs().get(matcher)->asArrowTable()); - } + tables.reserve(matchers.size()); + std::ranges::transform(matchers, std::back_inserter(tables), [&pc](auto const& matcher){ return pc.inputs().get(matcher)->asArrowTable(); }); return tables; } From d1a5f7099a41cc858618365a0a81490cd09eea3e Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Tue, 20 Jan 2026 12:42:55 +0100 Subject: [PATCH 2/8] modernize AODReaderHelpers.cxx --- .../AnalysisSupport/src/AODReaderHelpers.cxx | 56 ++++++++----------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/Framework/AnalysisSupport/src/AODReaderHelpers.cxx b/Framework/AnalysisSupport/src/AODReaderHelpers.cxx index 485f3fa69edad..fe3868b0b6d6e 100644 --- a/Framework/AnalysisSupport/src/AODReaderHelpers.cxx +++ b/Framework/AnalysisSupport/src/AODReaderHelpers.cxx @@ -37,7 +37,7 @@ struct Buildable { std::vector records; std::shared_ptr outputSchema; - Buildable(InputSpec const& spec) + explicit Buildable(InputSpec const& spec) : binding{spec.binding} { auto&& [origin_, description_, version_] = DataSpecUtils::asConcreteDataMatcher(spec); @@ -58,9 +58,8 @@ struct Buildable { } outputSchema = std::make_shared([](std::vector const& recs) { std::vector> fields; - for (auto& r : recs) { - fields.push_back(r.field()); - } + fields.reserve(recs.size()); + std::ranges::transform(recs, std::back_inserter(fields), [](auto& r){ return r.field(); }); return fields; }(records)) ->WithMetadata(std::make_shared(std::vector{std::string{"label"}}, std::vector{std::string{binding}})); @@ -87,19 +86,12 @@ AlgorithmSpec AODReaderHelpers::indexBuilderCallback(ConfigContext const& /*ctx* { return AlgorithmSpec::InitCallback{[](InitContext& ic) { auto const& requested = ic.services().get().requestedIDXs; - std::vector buildables; - for (auto const& i : requested) { - buildables.emplace_back(i); - } std::vector builders; - for (auto& b : buildables) { - builders.push_back(b.createBuilder()); - } + builders.reserve(requested.size()); + std::ranges::transform(requested, std::back_inserter(builders), [](auto const& i){ return Buildable{i}.createBuilder(); }); return [builders](ProcessingContext& pc) mutable { auto outputs = pc.outputs(); - for (auto& builder : builders) { - outputs.adopt(Output{builder.origin, builder.description, builder.version}, builder.materialize(pc)); - } + std::ranges::for_each(builders, [&pc, &outputs](auto& builder){ outputs.adopt(Output{builder.origin, builder.description, builder.version}, builder.materialize(pc)); }); }; }}; } @@ -119,7 +111,7 @@ struct Spawnable { header::DataDescription description; header::DataHeader::SubSpecificationType version; - Spawnable(InputSpec const& spec) + explicit Spawnable(InputSpec const& spec) : binding{spec.binding} { auto&& [origin_, description_, version_] = DataSpecUtils::asConcreteDataMatcher(spec); @@ -144,16 +136,20 @@ struct Spawnable { iws.str(json); schemas.emplace_back(ArrowJSONHelpers::read(iws)); } - for (auto const& i : spec.metadata | views::filter_string_params_starts_with("input:") | std::ranges::views::transform([](auto const& param) { - return DataSpecUtils::fromMetadataString(param.defaultValue.template get()); - })) { - matchers.emplace_back(std::get(i.matcher)); - } + std::ranges::transform(spec.metadata | + views::filter_string_params_starts_with("input:") | + std::ranges::views::transform( + [](auto const& param) { + return DataSpecUtils::fromMetadataString(param.defaultValue.template get()); + }), + std::back_inserter(matchers), [](auto const& i){ return std::get(i.matcher); }); + std::vector> fields; - for (auto& s : schemas) { - std::copy(s->fields().begin(), s->fields().end(), std::back_inserter(fields)); - } + std::ranges::for_each(schemas, + [&fields](auto const& s){ + std::ranges::copy(s->fields(), std::back_inserter(fields)); + }); inputSchema = std::make_shared(fields); expressions = expressions::materializeProjectors(projectors, inputSchema, outputSchema->fields()); @@ -194,20 +190,12 @@ AlgorithmSpec AODReaderHelpers::aodSpawnerCallback(ConfigContext const& /*ctx*/) { return AlgorithmSpec::InitCallback{[](InitContext& ic) { auto const& requested = ic.services().get().spawnerInputs; - std::vector spawnables; - for (auto const& i : requested) { - spawnables.emplace_back(i); - } std::vector spawners; - for (auto& s : spawnables) { - spawners.push_back(s.createMaker()); - } - + spawners.reserve(requested.size()); + std::ranges::transform(requested, std::back_inserter(spawners), [](auto const& i){ return Spawnable{i}.createMaker(); }); return [spawners](ProcessingContext& pc) mutable { auto outputs = pc.outputs(); - for (auto& spawner : spawners) { - outputs.adopt(Output{spawner.origin, spawner.description, spawner.version}, spawner.materialize(pc)); - } + std::ranges::for_each(spawners, [&pc, &outputs](auto& spawner){ outputs.adopt(Output{spawner.origin, spawner.description, spawner.version}, spawner.materialize(pc)); }); }; }}; } From 82f69bd297f8a3906e5a23ed4eee3421b00c3d33 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Tue, 20 Jan 2026 13:10:20 +0100 Subject: [PATCH 3/8] modernize ArrowSupport.cxx --- Framework/Core/src/ArrowSupport.cxx | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/Framework/Core/src/ArrowSupport.cxx b/Framework/Core/src/ArrowSupport.cxx index 95e763343671a..ef0f84812e3a4 100644 --- a/Framework/Core/src/ArrowSupport.cxx +++ b/Framework/Core/src/ArrowSupport.cxx @@ -531,13 +531,7 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec() dh->dataOrigin.str, dh->dataDescription.str); continue; } - bool forwarded = false; - for (auto const& forward : ctx.services().get().forwards) { - if (DataSpecUtils::match(forward.matcher, *dh)) { - forwarded = true; - break; - } - } + bool forwarded = std::ranges::any_of(ctx.services().get().forwards, [&dh](auto const& forward){ return DataSpecUtils::match(forward.matcher, *dh); }); if (forwarded) { O2_SIGNPOST_EVENT_EMIT(rate_limiting, sid, "offer", "Message %{public}.4s/%{public}.16s is forwarded so we are not returning its memory.", @@ -584,11 +578,11 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec() } }, .adjustTopology = [](WorkflowSpecNode& node, ConfigContext const& ctx) { auto& workflow = node.specs; - auto spawner = std::find_if(workflow.begin(), workflow.end(), [](DataProcessorSpec const& spec) { return spec.name == "internal-dpl-aod-spawner"; }); - auto analysisCCDB = std::find_if(workflow.begin(), workflow.end(), [](DataProcessorSpec const& spec) { return spec.name == "internal-dpl-aod-ccdb"; }); - auto builder = std::find_if(workflow.begin(), workflow.end(), [](DataProcessorSpec const& spec) { return spec.name == "internal-dpl-aod-index-builder"; }); - auto reader = std::find_if(workflow.begin(), workflow.end(), [](DataProcessorSpec const& spec) { return spec.name == "internal-dpl-aod-reader"; }); - auto writer = std::find_if(workflow.begin(), workflow.end(), [](DataProcessorSpec const& spec) { return spec.name == "internal-dpl-aod-writer"; }); + auto spawner = std::ranges::find_if(workflow, [](DataProcessorSpec const& spec) { return spec.name.starts_with("internal-dpl-aod-spawner"); }); + auto analysisCCDB = std::ranges::find_if(workflow, [](DataProcessorSpec const& spec) { return spec.name.starts_with("internal-dpl-aod-ccdb"); }); + auto builder = std::ranges::find_if(workflow, [](DataProcessorSpec const& spec) { return spec.name.starts_with("internal-dpl-aod-index-builder"); }); + auto reader = std::ranges::find_if(workflow, [](DataProcessorSpec const& spec) { return spec.name.starts_with("internal-dpl-aod-reader"); }); + auto writer = std::ranges::find_if(workflow, [](DataProcessorSpec const& spec) { return spec.name.starts_with("internal-dpl-aod-writer"); }); auto& dec = ctx.services().get(); dec.requestedAODs.clear(); dec.requestedDYNs.clear(); @@ -626,8 +620,8 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec() views::partial_match_filter(header::DataOrigin{"DYN"}) | sinks::append_to{dec.providedDYNs}; } - std::sort(dec.requestedDYNs.begin(), dec.requestedDYNs.end(), inputSpecLessThan); - std::sort(dec.providedDYNs.begin(), dec.providedDYNs.end(), outputSpecLessThan); + std::ranges::sort(dec.requestedDYNs, inputSpecLessThan); + std::ranges::sort(dec.providedDYNs, outputSpecLessThan); dec.spawnerInputs.clear(); dec.requestedDYNs | views::filter_not_matching(dec.providedDYNs) | @@ -646,8 +640,8 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec() d.inputs | views::partial_match_filter(header::DataOrigin{"ATIM"}) | sinks::update_input_list{dec.requestedTIMs}; d.outputs | views::partial_match_filter(header::DataOrigin{"ATIM"}) | sinks::append_to{dec.providedTIMs}; } - std::sort(dec.requestedTIMs.begin(), dec.requestedTIMs.end(), inputSpecLessThan); - std::sort(dec.providedTIMs.begin(), dec.providedTIMs.end(), outputSpecLessThan); + std::ranges::sort(dec.requestedTIMs, inputSpecLessThan); + std::ranges::sort(dec.providedTIMs, outputSpecLessThan); // Use ranges::to> in C++23... dec.analysisCCDBInputs.clear(); dec.requestedTIMs | views::filter_not_matching(dec.providedTIMs) | sinks::append_to{dec.analysisCCDBInputs}; From 386acbdb2e0d035356c9f8a66957f6c02941e2db Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Tue, 20 Jan 2026 13:12:44 +0100 Subject: [PATCH 4/8] modernize ArrowTableSlicingCache.cxx --- Framework/Core/src/ArrowTableSlicingCache.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Framework/Core/src/ArrowTableSlicingCache.cxx b/Framework/Core/src/ArrowTableSlicingCache.cxx index 634c51f71f5a6..5162c698a1d66 100644 --- a/Framework/Core/src/ArrowTableSlicingCache.cxx +++ b/Framework/Core/src/ArrowTableSlicingCache.cxx @@ -210,7 +210,7 @@ std::pair ArrowTableSlicingCache::getCachePos(const Entry& bindingKey int ArrowTableSlicingCache::getCachePosSortedFor(Entry const& bindingKey) const { - auto locate = std::find(bindingsKeys.begin(), bindingsKeys.end(), bindingKey); + auto locate = std::ranges::find(bindingsKeys, bindingKey); if (locate != bindingsKeys.end()) { return std::distance(bindingsKeys.begin(), locate); } @@ -219,7 +219,7 @@ int ArrowTableSlicingCache::getCachePosSortedFor(Entry const& bindingKey) const int ArrowTableSlicingCache::getCachePosUnsortedFor(Entry const& bindingKey) const { - auto locate_unsorted = std::find(bindingsKeysUnsorted.begin(), bindingsKeysUnsorted.end(), bindingKey); + auto locate_unsorted = std::ranges::find(bindingsKeysUnsorted, bindingKey); if (locate_unsorted != bindingsKeysUnsorted.end()) { return std::distance(bindingsKeysUnsorted.begin(), locate_unsorted); } @@ -275,7 +275,7 @@ void ArrowTableSlicingCache::validateOrder(Entry const& bindingKey, const std::s } auto column = o2::framework::GetColumnByNameCI(input, key); auto array0 = static_cast>(column->chunk(0)->data()); - int32_t prev = 0; + int32_t prev; int32_t cur = array0.Value(0); int32_t lastNeg = cur < 0 ? cur : 0; int32_t lastPos = cur < 0 ? -1 : cur; From 4d21efc895c9d043a540b4a4261117fb7e7d8f1e Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Tue, 20 Jan 2026 13:57:25 +0100 Subject: [PATCH 5/8] modernize ASoA.cxx --- Framework/Core/include/Framework/ASoA.h | 1 + Framework/Core/src/ASoA.cxx | 89 ++++++++++++------------- 2 files changed, 44 insertions(+), 46 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index ec02c7e47132b..4fd35e0dc5065 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1283,6 +1283,7 @@ struct TableIterator : IP, C... { }; struct ArrowHelpers { + static std::shared_ptr joinTables(std::vector>&& tables); static std::shared_ptr joinTables(std::vector>&& tables, std::span labels); static std::shared_ptr joinTables(std::vector>&& tables, std::span labels); static std::shared_ptr concatTables(std::vector>&& tables); diff --git a/Framework/Core/src/ASoA.cxx b/Framework/Core/src/ASoA.cxx index 6a846c3d45b6c..9e11106fae838 100644 --- a/Framework/Core/src/ASoA.cxx +++ b/Framework/Core/src/ASoA.cxx @@ -62,71 +62,70 @@ SelectionVector sliceSelection(std::span const& mSelectedRows, in auto start_iterator = std::lower_bound(mSelectedRows.begin(), mSelectedRows.end(), start); auto stop_iterator = std::lower_bound(start_iterator, mSelectedRows.end(), end); SelectionVector slicedSelection{start_iterator, stop_iterator}; - std::transform(slicedSelection.begin(), slicedSelection.end(), slicedSelection.begin(), + std::ranges::transform(slicedSelection.begin(), slicedSelection.end(), slicedSelection.begin(), [&start](int64_t idx) { return idx - static_cast(start); }); return slicedSelection; } -std::shared_ptr ArrowHelpers::joinTables(std::vector>&& tables, std::span labels) +std::shared_ptr ArrowHelpers::joinTables(std::vector>&& tables) { - if (tables.size() == 1) { - return tables[0]; - } - for (auto i = 0U; i < tables.size() - 1; ++i) { - if (tables[i]->num_rows() != tables[i + 1]->num_rows()) { - throw o2::framework::runtime_error_f("Tables %s and %s have different sizes (%d vs %d) and cannot be joined!", - labels[i], labels[i + 1], tables[i]->num_rows(), tables[i + 1]->num_rows()); - } - } std::vector> fields; std::vector> columns; - - for (auto& t : tables) { - auto tf = t->fields(); - std::copy(tf.begin(), tf.end(), std::back_inserter(fields)); - } - - auto schema = std::make_shared(fields); - - if (tables[0]->num_rows() != 0) { - for (auto& t : tables) { - auto tc = t->columns(); - std::copy(tc.begin(), tc.end(), std::back_inserter(columns)); + bool notEmpty = (tables[0]->num_rows() != 0); + std::ranges::for_each(tables, [&fields, &columns, notEmpty](auto const& t){ + std::ranges::copy(t->fields(), std::back_inserter(fields)); + if (notEmpty) { + std::ranges::copy(t->columns(), std::back_inserter(columns)); } - } + }); + auto schema = std::make_shared(fields); return arrow::Table::Make(schema, columns); } -std::shared_ptr ArrowHelpers::joinTables(std::vector>&& tables, std::span labels) +namespace { +template + requires(std::same_as) +auto makeString(T const& str) +{ + return str.c_str(); +} +template + requires(std::same_as) +auto makeString(T const& str) +{ + return str; +} + +template +void canNotJoin(std::vector> const& tables, std::span labels) { - if (tables.size() == 1) { - return tables[0]; - } for (auto i = 0U; i < tables.size() - 1; ++i) { if (tables[i]->num_rows() != tables[i + 1]->num_rows()) { throw o2::framework::runtime_error_f("Tables %s and %s have different sizes (%d vs %d) and cannot be joined!", - labels[i].c_str(), labels[i + 1].c_str(), tables[i]->num_rows(), tables[i + 1]->num_rows()); + makeString(labels[i]), makeString(labels[i + 1]), tables[i]->num_rows(), tables[i + 1]->num_rows()); } } - std::vector> fields; - std::vector> columns; +} +} - for (auto& t : tables) { - auto tf = t->fields(); - std::copy(tf.begin(), tf.end(), std::back_inserter(fields)); +std::shared_ptr ArrowHelpers::joinTables(std::vector>&& tables, std::span labels) +{ + if (tables.size() == 1) { + return tables[0]; } + canNotJoin(tables, labels); + return joinTables(std::forward>>(tables)); +} - auto schema = std::make_shared(fields); - - if (tables[0]->num_rows() != 0) { - for (auto& t : tables) { - auto tc = t->columns(); - std::copy(tc.begin(), tc.end(), std::back_inserter(columns)); - } +std::shared_ptr ArrowHelpers::joinTables(std::vector>&& tables, std::span labels) +{ + if (tables.size() == 1) { + return tables[0]; } - return arrow::Table::Make(schema, columns); + canNotJoin(tables, labels); + return joinTables(std::forward>>(tables)); } std::shared_ptr ArrowHelpers::concatTables(std::vector>&& tables) @@ -135,7 +134,6 @@ std::shared_ptr ArrowHelpers::concatTables(std::vector> columns; - assert(tables.size() > 1); std::vector> resultFields = tables[0]->schema()->fields(); auto compareFields = [](std::shared_ptr const& f1, std::shared_ptr const& f2) { // Let's do this with stable sorting. @@ -165,13 +163,12 @@ std::shared_ptr ArrowHelpers::concatTables(std::vector(chunks)); } - auto result = arrow::Table::Make(std::make_shared(resultFields), columns); - return result; + return arrow::Table::Make(std::make_shared(resultFields), columns); } arrow::ChunkedArray* getIndexFromLabel(arrow::Table* table, std::string_view label) { - auto field = std::find_if(table->schema()->fields().begin(), table->schema()->fields().end(), [&](std::shared_ptr const& f) { + auto field = std::ranges::find_if(table->schema()->fields(), [&](std::shared_ptr const& f) { auto caseInsensitiveCompare = [](const std::string_view& str1, const std::string& str2) { return std::ranges::equal( str1, str2, From 8a7db0b190b43ade3a1f03c38a3fe449de15989d Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Tue, 20 Jan 2026 14:06:36 +0100 Subject: [PATCH 6/8] do not copy a vector; add const --- Framework/Core/include/Framework/Expressions.h | 2 +- Framework/Core/src/Expressions.cxx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Framework/Core/include/Framework/Expressions.h b/Framework/Core/include/Framework/Expressions.h index 0be19954f1faa..c5f50311a7d19 100644 --- a/Framework/Core/include/Framework/Expressions.h +++ b/Framework/Core/include/Framework/Expressions.h @@ -712,7 +712,7 @@ std::shared_ptr createProjectorHelper(size_t nColumns, expre std::shared_ptr schema, std::vector> const& fields); -std::vector> materializeProjectors(std::vector const& projectors, std::shared_ptr const& inputSchema, std::vector> outputFields); +std::vector> materializeProjectors(std::vector const& projectors, std::shared_ptr const& inputSchema, std::vector> const& outputFields); template std::shared_ptr createProjectors(framework::pack, std::vector> const& fields, gandiva::SchemaPtr schema) diff --git a/Framework/Core/src/Expressions.cxx b/Framework/Core/src/Expressions.cxx index 43143f781ddf4..02a862d30032b 100644 --- a/Framework/Core/src/Expressions.cxx +++ b/Framework/Core/src/Expressions.cxx @@ -1348,11 +1348,11 @@ OpNode Parser::opFromToken(std::string const& token) return OpNode{static_cast(std::distance(mapping.begin(), locate))}; } -std::vector> materializeProjectors(std::vector const& projectors, std::shared_ptr const& inputSchema, std::vector> outputFields) +std::vector> materializeProjectors(std::vector const& projectors, std::shared_ptr const& inputSchema, std::vector> const& outputFields) { std::vector> expressions; int i = 0; - for (auto& p : projectors) { + for (auto const& p : projectors) { expressions.push_back( expressions::makeExpression( expressions::createExpressionTree( From 383912be5c6f0be9f8fc0bb7b0f622b80ad2bf92 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Tue, 20 Jan 2026 14:29:48 +0100 Subject: [PATCH 7/8] modernize WorkflowHelpers.cxx --- Framework/Core/src/WorkflowHelpers.cxx | 54 +++++++++++--------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/Framework/Core/src/WorkflowHelpers.cxx b/Framework/Core/src/WorkflowHelpers.cxx index fd9099e1aa24e..6e62683e1bf4f 100644 --- a/Framework/Core/src/WorkflowHelpers.cxx +++ b/Framework/Core/src/WorkflowHelpers.cxx @@ -100,7 +100,7 @@ std::vector // which have the current node as incoming. // nextEdges will contain all the edges which are not related // to the current node. - for (auto& ei : remainingEdgesIndex) { + for (auto const& ei : remainingEdgesIndex) { if (*(edgeIn + ei * stride) == node.index) { nextVertex.insert({*(edgeOut + ei * stride), node.layer + 1}); } else { @@ -112,7 +112,7 @@ std::vector // Of all the vertices which have node as incoming, // check if there is any other incoming node. std::set hasPredecessors; - for (auto& ei : remainingEdgesIndex) { + for (auto const& ei : remainingEdgesIndex) { for (auto& m : nextVertex) { if (m.index == *(edgeOut + ei * stride)) { hasPredecessors.insert({m.index, m.layer}); @@ -240,7 +240,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext for (size_t wi = 0; wi < workflow.size(); ++wi) { auto& processor = workflow[wi]; auto name = processor.name; - auto hash = runtime_hash(name.c_str()); + uint32_t hash = runtime_hash(name.c_str()); dec.outTskMap.push_back({hash, name}); std::string prefix = "internal-dpl-"; @@ -252,8 +252,8 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext processor.options.push_back(ConfigParamSpec{"end-value-enumeration", VariantType::Int64, -1ll, {"final value for the enumeration"}}); processor.options.push_back(ConfigParamSpec{"step-value-enumeration", VariantType::Int64, 1ll, {"step between one value and the other"}}); } - bool hasTimeframeInputs = std::any_of(processor.inputs.begin(), processor.inputs.end(), [](auto const& input) { return input.lifetime == Lifetime::Timeframe; }); - bool hasTimeframeOutputs = std::any_of(processor.outputs.begin(), processor.outputs.end(), [](auto const& output) { return output.lifetime == Lifetime::Timeframe; }); + bool hasTimeframeInputs = std::ranges::any_of(processor.inputs, [](auto const& input) { return input.lifetime == Lifetime::Timeframe; }); + bool hasTimeframeOutputs = std::ranges::any_of(processor.outputs, [](auto const& output) { return output.lifetime == Lifetime::Timeframe; }); // A timeframeSink consumes timeframes without creating new // timeframe data. @@ -261,10 +261,9 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext if (rateLimitingIPCID != -1) { if (timeframeSink && processor.name.find("internal-dpl-injected-dummy-sink") == std::string::npos) { O2_SIGNPOST_ID_GENERATE(sid, workflow_helpers); - uint32_t hash = runtime_hash(processor.name.c_str()); bool hasMatch = false; ConcreteDataMatcher summaryMatcher = ConcreteDataMatcher{"DPL", "SUMMARY", static_cast(hash)}; - auto summaryOutput = std::find_if(processor.outputs.begin(), processor.outputs.end(), [&summaryMatcher](auto const& output) { return DataSpecUtils::match(output, summaryMatcher); }); + auto summaryOutput = std::ranges::find_if(processor.outputs, [&summaryMatcher](auto const& output) { return DataSpecUtils::match(output, summaryMatcher); }); if (summaryOutput != processor.outputs.end()) { O2_SIGNPOST_EVENT_EMIT(workflow_helpers, sid, "output enumeration", "%{public}s already there in %{public}s", DataSpecUtils::describe(*summaryOutput).c_str(), processor.name.c_str()); @@ -283,7 +282,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext switch (input.lifetime) { case Lifetime::Timer: { auto concrete = DataSpecUtils::asConcreteDataMatcher(input); - auto hasOption = std::any_of(processor.options.begin(), processor.options.end(), [&input](auto const& option) { return (option.name == "period-" + input.binding); }); + auto hasOption = std::ranges::any_of(processor.options, [&input](auto const& option) { return (option.name == "period-" + input.binding); }); if (hasOption == false) { processor.options.push_back(ConfigParamSpec{"period-" + input.binding, VariantType::Int, 1000, {"period of the timer in milliseconds"}}); } @@ -299,7 +298,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext } break; case Lifetime::Condition: { requestedCCDBs.emplace_back(input); - if ((hasConditionOption == false) && std::none_of(processor.options.begin(), processor.options.end(), [](auto const& option) { return (option.name.compare("condition-backend") == 0); })) { + if ((hasConditionOption == false) && std::ranges::none_of(processor.options, [](auto const& option) { return (option.name.compare("condition-backend") == 0); })) { processor.options.emplace_back(ConfigParamSpec{"condition-backend", VariantType::String, defaultConditionBackend(), {"URL for CCDB"}}); processor.options.emplace_back(ConfigParamSpec{"condition-timestamp", VariantType::Int64, 0ll, {"Force timestamp for CCDB lookup"}}); hasConditionOption = true; @@ -307,7 +306,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext } break; case Lifetime::OutOfBand: { auto concrete = DataSpecUtils::asConcreteDataMatcher(input); - auto hasOption = std::any_of(processor.options.begin(), processor.options.end(), [&input](auto const& option) { return (option.name == "out-of-band-channel-name-" + input.binding); }); + auto hasOption = std::ranges::any_of(processor.options, [&input](auto const& option) { return (option.name == "out-of-band-channel-name-" + input.binding); }); if (hasOption == false) { processor.options.push_back(ConfigParamSpec{"out-of-band-channel-name-" + input.binding, VariantType::String, "out-of-band", {"channel to listen for out of band data"}}); } @@ -333,7 +332,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext } } - std::stable_sort(timer.outputs.begin(), timer.outputs.end(), [](OutputSpec const& a, OutputSpec const& b) { return *DataSpecUtils::getOptionalSubSpec(a) < *DataSpecUtils::getOptionalSubSpec(b); }); + std::ranges::stable_sort(timer.outputs, [](OutputSpec const& a, OutputSpec const& b) { return *DataSpecUtils::getOptionalSubSpec(a) < *DataSpecUtils::getOptionalSubSpec(b); }); for (auto& output : processor.outputs) { if (DataSpecUtils::partialMatch(output, AODOrigins)) { @@ -344,7 +343,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext dec.providedTIMs.emplace_back(output); } else if (DataSpecUtils::partialMatch(output, header::DataOrigin{"ATSK"})) { dec.providedOutputObjHist.emplace_back(output); - auto it = std::find_if(dec.outObjHistMap.begin(), dec.outObjHistMap.end(), [&](auto&& x) { return x.id == hash; }); + auto it = std::ranges::find_if(dec.outObjHistMap, [&](auto&& x) { return x.id == hash; }); if (it == dec.outObjHistMap.end()) { dec.outObjHistMap.push_back({hash, {output.binding.value}}); } else { @@ -359,10 +358,10 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext auto inputSpecLessThan = [](InputSpec const& lhs, InputSpec const& rhs) { return DataSpecUtils::describe(lhs) < DataSpecUtils::describe(rhs); }; auto outputSpecLessThan = [](OutputSpec const& lhs, OutputSpec const& rhs) { return DataSpecUtils::describe(lhs) < DataSpecUtils::describe(rhs); }; - std::sort(dec.requestedDYNs.begin(), dec.requestedDYNs.end(), inputSpecLessThan); - std::sort(dec.requestedTIMs.begin(), dec.requestedTIMs.end(), inputSpecLessThan); - std::sort(dec.providedDYNs.begin(), dec.providedDYNs.end(), outputSpecLessThan); - std::sort(dec.providedTIMs.begin(), dec.providedTIMs.end(), outputSpecLessThan); + std::ranges::sort(dec.requestedDYNs, inputSpecLessThan); + std::ranges::sort(dec.requestedTIMs, inputSpecLessThan); + std::ranges::sort(dec.providedDYNs, outputSpecLessThan); + std::ranges::sort(dec.providedTIMs, outputSpecLessThan); DataProcessorSpec indexBuilder{ "internal-dpl-aod-index-builder", @@ -389,8 +388,8 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext AnalysisSupportHelpers::addMissingOutputsToSpawner({}, dec.spawnerInputs, dec.requestedAODs, aodSpawner); AnalysisSupportHelpers::addMissingOutputsToReader(dec.providedAODs, dec.requestedAODs, aodReader); - std::sort(requestedCCDBs.begin(), requestedCCDBs.end(), inputSpecLessThan); - std::sort(providedCCDBs.begin(), providedCCDBs.end(), outputSpecLessThan); + std::ranges::sort(requestedCCDBs, inputSpecLessThan); + std::ranges::sort(providedCCDBs, outputSpecLessThan); AnalysisSupportHelpers::addMissingOutputsToReader(providedCCDBs, requestedCCDBs, ccdbBackend); std::vector extraSpecs; @@ -412,7 +411,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext // add the reader if (aodReader.outputs.empty() == false) { - auto mctracks2aod = std::find_if(workflow.begin(), workflow.end(), [](auto const& x) { return x.name == "mctracks-to-aod"; }); + auto mctracks2aod = std::ranges::find_if(workflow, [](auto const& x) { return x.name == "mctracks-to-aod"; }); if (mctracks2aod == workflow.end()) { // add normal reader aodReader.outputs.emplace_back(OutputSpec{"TFN", "TFNumber"}); @@ -440,7 +439,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext auto& dstf = std::get(matcher.matcher); // Check if any of the provided outputs is a DISTSTF // Check if any of the requested inputs is for a 0xccdb message - bool providesDISTSTF = std::any_of(workflow.begin(), workflow.end(), + bool providesDISTSTF = std::ranges::any_of(workflow, [&matcher](auto const& dp) { return std::any_of(dp.outputs.begin(), dp.outputs.end(), [&matcher](auto const& output) { return DataSpecUtils::match(matcher, output); @@ -450,7 +449,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext // If there is no CCDB requested, but we still ask for a FLP/DISTSUBTIMEFRAME/0xccdb // we add to the first data processor which has no inputs (apart from // enumerations / timers) the responsibility to provide the DISTSUBTIMEFRAME - bool requiresDISTSUBTIMEFRAME = std::any_of(workflow.begin(), workflow.end(), + bool requiresDISTSUBTIMEFRAME = std::ranges::any_of(workflow, [&dstf](auto const& dp) { return std::any_of(dp.inputs.begin(), dp.inputs.end(), [&dstf](auto const& input) { return DataSpecUtils::match(input, dstf); @@ -560,7 +559,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext auto fileSink = AnalysisSupportHelpers::getGlobalAODSink(ctx); extraSpecs.push_back(fileSink); - auto it = std::find_if(dec.outputsInputs.begin(), dec.outputsInputs.end(), [](InputSpec& spec) -> bool { + auto it = std::ranges::find_if(dec.outputsInputs, [](InputSpec& spec) -> bool { return DataSpecUtils::partialMatch(spec, o2::header::DataOrigin("TFN")); }); size_t ii = std::distance(dec.outputsInputs.begin(), it); @@ -694,15 +693,8 @@ void WorkflowHelpers::adjustTopology(WorkflowSpec& workflow, ConfigContext const } if (distSTFCount > 0) { - bool found = false; for (auto& spec : workflow) { - for (auto& output : spec.outputs) { - if (DataSpecUtils::match(output, ConcreteDataMatcher{"FLP", "DISTSUBTIMEFRAME", 0})) { - found = true; - break; - } - } - if (found) { + if (std::ranges::any_of(spec.outputs, [](auto const& output){ return DataSpecUtils::match(output, ConcreteDataMatcher{"FLP", "DISTSUBTIMEFRAME", 0}); })) { for (unsigned int i = 1; i < distSTFCount; ++i) { spec.outputs.emplace_back(OutputSpec{ConcreteDataMatcher{"FLP", "DISTSUBTIMEFRAME", i}, Lifetime::Timeframe}); } @@ -1005,7 +997,7 @@ std::tuple, std::vector> WorkflowHelpers::analyzeOu input.binding = (snprintf(buf, 63, "output_%zu_%zu", output.workflowId, output.id), buf); // make sure that entries are unique - if (std::find(results.begin(), results.end(), input) == results.end()) { + if (std::ranges::find(results, input) == results.end()) { results.emplace_back(input); isDangling.emplace_back(matched == false); } From 44f6882979cce625b9fd6a7cf074f75f58add93e Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Tue, 20 Jan 2026 13:40:59 +0000 Subject: [PATCH 8/8] Please consider the following formatting changes --- .../AnalysisSupport/src/AODReaderHelpers.cxx | 19 ++++++++-------- Framework/Core/src/ASoA.cxx | 13 ++++++----- Framework/Core/src/AnalysisHelpers.cxx | 8 +++---- Framework/Core/src/ArrowSupport.cxx | 2 +- Framework/Core/src/WorkflowHelpers.cxx | 22 +++++++++---------- 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/Framework/AnalysisSupport/src/AODReaderHelpers.cxx b/Framework/AnalysisSupport/src/AODReaderHelpers.cxx index fe3868b0b6d6e..4c1c065000186 100644 --- a/Framework/AnalysisSupport/src/AODReaderHelpers.cxx +++ b/Framework/AnalysisSupport/src/AODReaderHelpers.cxx @@ -59,7 +59,7 @@ struct Buildable { outputSchema = std::make_shared([](std::vector const& recs) { std::vector> fields; fields.reserve(recs.size()); - std::ranges::transform(recs, std::back_inserter(fields), [](auto& r){ return r.field(); }); + std::ranges::transform(recs, std::back_inserter(fields), [](auto& r) { return r.field(); }); return fields; }(records)) ->WithMetadata(std::make_shared(std::vector{std::string{"label"}}, std::vector{std::string{binding}})); @@ -88,10 +88,10 @@ AlgorithmSpec AODReaderHelpers::indexBuilderCallback(ConfigContext const& /*ctx* auto const& requested = ic.services().get().requestedIDXs; std::vector builders; builders.reserve(requested.size()); - std::ranges::transform(requested, std::back_inserter(builders), [](auto const& i){ return Buildable{i}.createBuilder(); }); + std::ranges::transform(requested, std::back_inserter(builders), [](auto const& i) { return Buildable{i}.createBuilder(); }); return [builders](ProcessingContext& pc) mutable { auto outputs = pc.outputs(); - std::ranges::for_each(builders, [&pc, &outputs](auto& builder){ outputs.adopt(Output{builder.origin, builder.description, builder.version}, builder.materialize(pc)); }); + std::ranges::for_each(builders, [&pc, &outputs](auto& builder) { outputs.adopt(Output{builder.origin, builder.description, builder.version}, builder.materialize(pc)); }); }; }}; } @@ -140,14 +140,13 @@ struct Spawnable { views::filter_string_params_starts_with("input:") | std::ranges::views::transform( [](auto const& param) { - return DataSpecUtils::fromMetadataString(param.defaultValue.template get()); - }), - std::back_inserter(matchers), [](auto const& i){ return std::get(i.matcher); }); - + return DataSpecUtils::fromMetadataString(param.defaultValue.template get()); + }), + std::back_inserter(matchers), [](auto const& i) { return std::get(i.matcher); }); std::vector> fields; std::ranges::for_each(schemas, - [&fields](auto const& s){ + [&fields](auto const& s) { std::ranges::copy(s->fields(), std::back_inserter(fields)); }); @@ -192,10 +191,10 @@ AlgorithmSpec AODReaderHelpers::aodSpawnerCallback(ConfigContext const& /*ctx*/) auto const& requested = ic.services().get().spawnerInputs; std::vector spawners; spawners.reserve(requested.size()); - std::ranges::transform(requested, std::back_inserter(spawners), [](auto const& i){ return Spawnable{i}.createMaker(); }); + std::ranges::transform(requested, std::back_inserter(spawners), [](auto const& i) { return Spawnable{i}.createMaker(); }); return [spawners](ProcessingContext& pc) mutable { auto outputs = pc.outputs(); - std::ranges::for_each(spawners, [&pc, &outputs](auto& spawner){ outputs.adopt(Output{spawner.origin, spawner.description, spawner.version}, spawner.materialize(pc)); }); + std::ranges::for_each(spawners, [&pc, &outputs](auto& spawner) { outputs.adopt(Output{spawner.origin, spawner.description, spawner.version}, spawner.materialize(pc)); }); }; }}; } diff --git a/Framework/Core/src/ASoA.cxx b/Framework/Core/src/ASoA.cxx index 9e11106fae838..1c73b257f81e4 100644 --- a/Framework/Core/src/ASoA.cxx +++ b/Framework/Core/src/ASoA.cxx @@ -63,9 +63,9 @@ SelectionVector sliceSelection(std::span const& mSelectedRows, in auto stop_iterator = std::lower_bound(start_iterator, mSelectedRows.end(), end); SelectionVector slicedSelection{start_iterator, stop_iterator}; std::ranges::transform(slicedSelection.begin(), slicedSelection.end(), slicedSelection.begin(), - [&start](int64_t idx) { - return idx - static_cast(start); - }); + [&start](int64_t idx) { + return idx - static_cast(start); + }); return slicedSelection; } @@ -74,7 +74,7 @@ std::shared_ptr ArrowHelpers::joinTables(std::vector> fields; std::vector> columns; bool notEmpty = (tables[0]->num_rows() != 0); - std::ranges::for_each(tables, [&fields, &columns, notEmpty](auto const& t){ + std::ranges::for_each(tables, [&fields, &columns, notEmpty](auto const& t) { std::ranges::copy(t->fields(), std::back_inserter(fields)); if (notEmpty) { std::ranges::copy(t->columns(), std::back_inserter(columns)); @@ -84,7 +84,8 @@ std::shared_ptr ArrowHelpers::joinTables(std::vector requires(std::same_as) auto makeString(T const& str) @@ -108,7 +109,7 @@ void canNotJoin(std::vector> const& tables, std::s } } } -} +} // namespace std::shared_ptr ArrowHelpers::joinTables(std::vector>&& tables, std::span labels) { diff --git a/Framework/Core/src/AnalysisHelpers.cxx b/Framework/Core/src/AnalysisHelpers.cxx index 326be388b2569..b7eac692d3859 100644 --- a/Framework/Core/src/AnalysisHelpers.cxx +++ b/Framework/Core/src/AnalysisHelpers.cxx @@ -65,13 +65,13 @@ std::shared_ptr IndexBuilder::materialize(std::vector> arrays; arrays.reserve(builders.size()); - std::ranges::transform(builders, std::back_inserter(arrays), [](auto& builder){ return builder.result(); }); + std::ranges::transform(builders, std::back_inserter(arrays), [](auto& builder) { return builder.result(); }); return arrow::Table::Make(schema, arrays); } @@ -130,7 +130,7 @@ std::shared_ptr spawnerHelper(std::shared_ptr const& } arrays.reserve(nColumns); - std::ranges::transform(chunks, std::back_inserter(arrays), [](auto&& chunk){ return std::make_shared(chunk); }); + std::ranges::transform(chunks, std::back_inserter(arrays), [](auto&& chunk) { return std::make_shared(chunk); }); return arrow::Table::Make(newSchema, arrays); } @@ -175,7 +175,7 @@ std::vector> extractSources(ProcessingContext& pc, { std::vector> tables; tables.reserve(matchers.size()); - std::ranges::transform(matchers, std::back_inserter(tables), [&pc](auto const& matcher){ return pc.inputs().get(matcher)->asArrowTable(); }); + std::ranges::transform(matchers, std::back_inserter(tables), [&pc](auto const& matcher) { return pc.inputs().get(matcher)->asArrowTable(); }); return tables; } diff --git a/Framework/Core/src/ArrowSupport.cxx b/Framework/Core/src/ArrowSupport.cxx index ef0f84812e3a4..60277dfc38a74 100644 --- a/Framework/Core/src/ArrowSupport.cxx +++ b/Framework/Core/src/ArrowSupport.cxx @@ -531,7 +531,7 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec() dh->dataOrigin.str, dh->dataDescription.str); continue; } - bool forwarded = std::ranges::any_of(ctx.services().get().forwards, [&dh](auto const& forward){ return DataSpecUtils::match(forward.matcher, *dh); }); + bool forwarded = std::ranges::any_of(ctx.services().get().forwards, [&dh](auto const& forward) { return DataSpecUtils::match(forward.matcher, *dh); }); if (forwarded) { O2_SIGNPOST_EVENT_EMIT(rate_limiting, sid, "offer", "Message %{public}.4s/%{public}.16s is forwarded so we are not returning its memory.", diff --git a/Framework/Core/src/WorkflowHelpers.cxx b/Framework/Core/src/WorkflowHelpers.cxx index 6e62683e1bf4f..ff1ff1f4cf13d 100644 --- a/Framework/Core/src/WorkflowHelpers.cxx +++ b/Framework/Core/src/WorkflowHelpers.cxx @@ -440,21 +440,21 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext // Check if any of the provided outputs is a DISTSTF // Check if any of the requested inputs is for a 0xccdb message bool providesDISTSTF = std::ranges::any_of(workflow, - [&matcher](auto const& dp) { - return std::any_of(dp.outputs.begin(), dp.outputs.end(), [&matcher](auto const& output) { - return DataSpecUtils::match(matcher, output); - }); - }); + [&matcher](auto const& dp) { + return std::any_of(dp.outputs.begin(), dp.outputs.end(), [&matcher](auto const& output) { + return DataSpecUtils::match(matcher, output); + }); + }); // If there is no CCDB requested, but we still ask for a FLP/DISTSUBTIMEFRAME/0xccdb // we add to the first data processor which has no inputs (apart from // enumerations / timers) the responsibility to provide the DISTSUBTIMEFRAME bool requiresDISTSUBTIMEFRAME = std::ranges::any_of(workflow, - [&dstf](auto const& dp) { - return std::any_of(dp.inputs.begin(), dp.inputs.end(), [&dstf](auto const& input) { - return DataSpecUtils::match(input, dstf); - }); - }); + [&dstf](auto const& dp) { + return std::any_of(dp.inputs.begin(), dp.inputs.end(), [&dstf](auto const& input) { + return DataSpecUtils::match(input, dstf); + }); + }); // We find the first device which has either just enumerations or // just timers, and we will add the DISTSUBTIMEFRAME to it. @@ -694,7 +694,7 @@ void WorkflowHelpers::adjustTopology(WorkflowSpec& workflow, ConfigContext const if (distSTFCount > 0) { for (auto& spec : workflow) { - if (std::ranges::any_of(spec.outputs, [](auto const& output){ return DataSpecUtils::match(output, ConcreteDataMatcher{"FLP", "DISTSUBTIMEFRAME", 0}); })) { + if (std::ranges::any_of(spec.outputs, [](auto const& output) { return DataSpecUtils::match(output, ConcreteDataMatcher{"FLP", "DISTSUBTIMEFRAME", 0}); })) { for (unsigned int i = 1; i < distSTFCount; ++i) { spec.outputs.emplace_back(OutputSpec{ConcreteDataMatcher{"FLP", "DISTSUBTIMEFRAME", i}, Lifetime::Timeframe}); }