From 41527616c00e943b609f8e9bee6d90e63c7d179f Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Wed, 22 Jan 2025 13:33:10 +0100 Subject: [PATCH 01/20] remove obsolete concept --- Framework/Core/include/Framework/ASoA.h | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index e098cd89f6d5d..ccc253850296e 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -814,9 +814,6 @@ concept is_dynamic_column = requires(C& c) { template concept is_marker_column = requires { &C::mark; }; -template -using is_dynamic_t = std::conditional_t, std::true_type, std::false_type>; - template concept is_column = is_persistent_column || is_dynamic_column || is_indexing_column || is_marker_column; @@ -1831,20 +1828,17 @@ class Table } } - template + template auto getDynamicColumn() const { - using decayed = std::decay_t; - static_assert(is_dynamic_t(), "Requested column is not a dynamic column"); - return static_cast(*this).template getDynamicValue(); + return static_cast>(*this).template getDynamicValue(); } template + requires(is_dynamic_column || is_persistent_column) auto getValue() const { - using COL = std::decay_t; - static_assert(is_dynamic_t() || soa::is_persistent_column, "Should be persistent or dynamic column with no argument that has a return type convertable to float"); - return static_cast(static_cast(*this).get()); + return static_cast(static_cast>(*this).get()); } template From 9a6f531571b212d35009c2f490f6e661ae37582d Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Thu, 23 Jan 2025 13:05:41 +0100 Subject: [PATCH 02/20] DPL Analysis: remove unnecessary instances of selected_pack --- Framework/Core/include/Framework/ASoA.h | 61 +++++++++++-------- .../include/Framework/GroupedCombinations.h | 19 +++++- 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index ccc253850296e..18f20cd177387 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -213,8 +213,6 @@ template struct TableMetadata { using columns = framework::pack; using persistent_columns_t = framework::selected_pack; - using external_index_columns_t = framework::selected_pack; - using internal_index_columns_t = framework::selected_pack; template static consteval std::array getMap(framework::pack) @@ -1036,6 +1034,13 @@ concept can_bind = requires(T&& t) { template concept has_index = (is_indexing_column || ...); +template + requires (!is_self_index_column) +auto getBinding() -> typename C::binding_t {} + +template +auto getBinding() -> void {} + template struct TableIterator : IP, C... { public: @@ -1043,9 +1048,9 @@ struct TableIterator : IP, C... { using policy_t = IP; using all_columns = framework::pack; using persistent_columns_t = framework::selected_pack; - using external_index_columns_t = framework::selected_pack; - using internal_index_columns_t = framework::selected_pack; - using bindings_pack_t = decltype([](framework::pack) -> framework::pack {}(external_index_columns_t{})); // decltype(extractBindings(external_index_columns_t{})); + using bindings_pack_t = decltype([](framework::pack) { + return framework::pack())...>{}; + }(all_columns{})); TableIterator(arrow::ChunkedArray* columnData[sizeof...(C)], IP&& policy) : IP{policy}, @@ -1138,7 +1143,7 @@ struct TableIterator : IP, C... { template void doSetCurrentIndex(framework::pack, TA* current) { - (CL::setCurrent(current), ...); + ([¤t, this](){ if constexpr (is_index_column && !is_self_index_column) {CL::setCurrent(current);} }(), ...); } template @@ -1150,24 +1155,30 @@ struct TableIterator : IP, C... { template auto getIndexBindingsImpl(framework::pack) const { - return std::vector{static_cast(*this).getCurrentRaw()...}; + std::vector result; + ([this, &result](){ + if constexpr (is_index_column && !is_self_index_column) { + result.emplace_back(static_cast(*this).getCurrentRaw()); + } + }(), ...); + return result; } auto getIndexBindings() const { - return getIndexBindingsImpl(external_index_columns_t{}); + return getIndexBindingsImpl(all_columns{}); } template void bindExternalIndices(TA*... current) { - (doSetCurrentIndex(external_index_columns_t{}, current), ...); + (doSetCurrentIndex(all_columns{}, current), ...); } template void doSetCurrentIndexRaw(framework::pack p, std::vector&& ptrs) { - (Cs::setCurrentRaw(ptrs[framework::has_type_at_v(p)]), ...); + ([&ptrs, p, this](){ if constexpr (is_index_column && !is_self_index_column) { Cs::setCurrentRaw(ptrs[framework::has_type_at_v(p)]); } }(), ...); } template @@ -1175,18 +1186,18 @@ struct TableIterator : IP, C... { { o2::soa::Binding b; b.bind(ptr); - (Cs::setCurrentRaw(b), ...); + ([&ptr, &b, this](){ if constexpr (is_self_index_column) { Cs::setCurrentRaw(b); } }(), ...); } void bindExternalIndicesRaw(std::vector&& ptrs) { - doSetCurrentIndexRaw(external_index_columns_t{}, std::forward>(ptrs)); + doSetCurrentIndexRaw(all_columns{}, std::forward>(ptrs)); } template void bindInternalIndices(I const* table) { - doSetCurrentInternal(internal_index_columns_t{}, table); + doSetCurrentInternal(all_columns{}, table); } private: @@ -1370,25 +1381,25 @@ static constexpr std::string getLabelFromTypeForKey(std::string const& key) template consteval static bool hasIndexTo(framework::pack&&) { - return (o2::soa::is_binding_compatible_v() || ...); + return ([](){ if constexpr (is_index_column && !is_self_index_column) { return o2::soa::is_binding_compatible_v(); } else { return false; } }() || ...); } template consteval static bool hasSortedIndexTo(framework::pack&&) { - return ((C::sorted && o2::soa::is_binding_compatible_v()) || ...); + return ([](){if constexpr (is_index_column && !is_self_index_column) { return (C::sorted && o2::soa::is_binding_compatible_v()); } else { return false; }}() || ...); } template consteval static bool relatedByIndex() { - return hasIndexTo(typename Z::table_t::external_index_columns_t{}); + return hasIndexTo(typename Z::table_t::columns_t{}); } template consteval static bool relatedBySortedIndex() { - return hasSortedIndexTo(typename Z::table_t::external_index_columns_t{}); + return hasSortedIndexTo(typename Z::table_t::columns_t{}); } } // namespace o2::soa @@ -1716,16 +1727,13 @@ class Table using persistent_columns_t = decltype([](framework::pack&&) -> framework::selected_pack {}(columns_t{})); using column_types = decltype([](framework::pack) -> framework::pack {}(persistent_columns_t{})); - using external_index_columns_t = decltype([](framework::pack&&) -> framework::selected_pack {}(columns_t{})); - using internal_index_columns_t = decltype([](framework::pack&&) -> framework::selected_pack {}(columns_t{})); template using base_iterator = decltype(base_iter(columns_t{})); template struct TableIteratorBase : base_iterator { using columns_t = typename Parent::columns_t; - using external_index_columns_t = typename Parent::external_index_columns_t; - using bindings_pack_t = decltype([](framework::pack) -> framework::pack {}(external_index_columns_t{})); + using bindings_pack_t = typename base_iterator::bindings_pack_t; // static constexpr const std::array originals{T::ref...}; static constexpr auto originals = Parent::originals; using policy_t = IP; @@ -1818,7 +1826,7 @@ class Table using decayed = std::decay_t; if constexpr (framework::has_type(bindings_pack_t{})) { // index to another table constexpr auto idx = framework::has_type_at_v(bindings_pack_t{}); - return framework::pack_element_t::getId(); + return framework::pack_element_t::getId(); } else if constexpr (std::same_as) { // self index return this->globalIndex(); } else if constexpr (is_indexing_column) { // soa::Index<> @@ -2043,13 +2051,13 @@ class Table void bindInternalIndicesExplicit(o2::soa::Binding binding) { - doBindInternalIndicesExplicit(internal_index_columns_t{}, binding); + doBindInternalIndicesExplicit(columns_t{}, binding); } template void doBindInternalIndicesExplicit(framework::pack, o2::soa::Binding binding) { - (static_cast(mBegin).setCurrentRaw(binding), ...); + ([this, &binding](){ if constexpr (is_self_index_column) { static_cast(mBegin).setCurrentRaw(binding); } }(), ...); } void bindExternalIndicesRaw(std::vector&& ptrs) @@ -2066,7 +2074,7 @@ class Table template void copyIndexBindings(T& dest) const { - doCopyIndexBindings(external_index_columns_t{}, dest); + doCopyIndexBindings(columns_t{}, dest); } auto select(framework::expressions::Filter const& f) const @@ -3343,7 +3351,6 @@ class FilteredBase : public T using T::originals; using columns_t = typename T::columns_t; using persistent_columns_t = typename T::persistent_columns_t; - using external_index_columns_t = typename T::external_index_columns_t; using iterator = T::template iterator_template_o; using unfiltered_iterator = T::template iterator_template_o; @@ -3489,7 +3496,7 @@ class FilteredBase : public T template void copyIndexBindings(T1& dest) const { - doCopyIndexBindings(external_index_columns_t{}, dest); + doCopyIndexBindings(columns_t{}, dest); } template diff --git a/Framework/Core/include/Framework/GroupedCombinations.h b/Framework/Core/include/Framework/GroupedCombinations.h index b0a6c9e658a10..91ca1fefe3b7c 100644 --- a/Framework/Core/include/Framework/GroupedCombinations.h +++ b/Framework/Core/include/Framework/GroupedCombinations.h @@ -34,14 +34,27 @@ auto interleaveTuples(std::tuple& t1, std::tuple& t2) return interleaveTuplesImpl(t1, t2, std::index_sequence_for()); } +template + requires(!soa::is_self_index_column) +auto isIndexTo() +{ + if constexpr (o2::soa::is_binding_compatible_v()) { + return std::true_type{}; + } else { + return std::false_type{}; + } +} + +template +auto isIndexTo() ->std::false_type {} + template -using is_index_to_g_t = typename std::conditional(), std::true_type, std::false_type>::type; +using is_index_to_g_t = decltype(isIndexTo()); template expressions::BindingNode getMatchingIndexNode() { - using external_index_columns_pack = typename A::external_index_columns_t; - using selected_indices_t = selected_pack_multicondition, external_index_columns_pack>; + using selected_indices_t = selected_pack_multicondition, typename A::columns_t>; static_assert(pack_size(selected_indices_t{}) == 1, "No matching index column from associated to grouping"); using index_column_t = pack_head_t; return expressions::BindingNode{index_column_t::mLabel, o2::framework::TypeIdHelpers::uniqueId(), expressions::selectArrowType()}; From a2312ae4562e144e06d77620e301b85656a2238d Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Thu, 23 Jan 2025 13:11:01 +0100 Subject: [PATCH 03/20] fixup! DPL Analysis: remove unnecessary instances of selected_pack --- Framework/Core/include/Framework/ASoA.h | 27 +++++++++++-------- .../include/Framework/GroupedCombinations.h | 4 ++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index 18f20cd177387..40b2bcfbb3129 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1035,11 +1035,15 @@ template concept has_index = (is_indexing_column || ...); template - requires (!is_self_index_column) -auto getBinding() -> typename C::binding_t {} + requires(!is_self_index_column) +auto getBinding() -> typename C::binding_t +{ +} template -auto getBinding() -> void {} +auto getBinding() -> void +{ +} template struct TableIterator : IP, C... { @@ -1143,7 +1147,7 @@ struct TableIterator : IP, C... { template void doSetCurrentIndex(framework::pack, TA* current) { - ([¤t, this](){ if constexpr (is_index_column && !is_self_index_column) {CL::setCurrent(current);} }(), ...); + ([¤t, this]() { if constexpr (is_index_column && !is_self_index_column) {CL::setCurrent(current);} }(), ...); } template @@ -1156,11 +1160,12 @@ struct TableIterator : IP, C... { auto getIndexBindingsImpl(framework::pack) const { std::vector result; - ([this, &result](){ + ([this, &result]() { if constexpr (is_index_column && !is_self_index_column) { result.emplace_back(static_cast(*this).getCurrentRaw()); } - }(), ...); + }(), + ...); return result; } @@ -1178,7 +1183,7 @@ struct TableIterator : IP, C... { template void doSetCurrentIndexRaw(framework::pack p, std::vector&& ptrs) { - ([&ptrs, p, this](){ if constexpr (is_index_column && !is_self_index_column) { Cs::setCurrentRaw(ptrs[framework::has_type_at_v(p)]); } }(), ...); + ([&ptrs, p, this]() { if constexpr (is_index_column && !is_self_index_column) { Cs::setCurrentRaw(ptrs[framework::has_type_at_v(p)]); } }(), ...); } template @@ -1186,7 +1191,7 @@ struct TableIterator : IP, C... { { o2::soa::Binding b; b.bind(ptr); - ([&ptr, &b, this](){ if constexpr (is_self_index_column) { Cs::setCurrentRaw(b); } }(), ...); + ([&ptr, &b, this]() { if constexpr (is_self_index_column) { Cs::setCurrentRaw(b); } }(), ...); } void bindExternalIndicesRaw(std::vector&& ptrs) @@ -1381,13 +1386,13 @@ static constexpr std::string getLabelFromTypeForKey(std::string const& key) template consteval static bool hasIndexTo(framework::pack&&) { - return ([](){ if constexpr (is_index_column && !is_self_index_column) { return o2::soa::is_binding_compatible_v(); } else { return false; } }() || ...); + return ([]() { if constexpr (is_index_column && !is_self_index_column) { return o2::soa::is_binding_compatible_v(); } else { return false; } }() || ...); } template consteval static bool hasSortedIndexTo(framework::pack&&) { - return ([](){if constexpr (is_index_column && !is_self_index_column) { return (C::sorted && o2::soa::is_binding_compatible_v()); } else { return false; }}() || ...); + return ([]() {if constexpr (is_index_column && !is_self_index_column) { return (C::sorted && o2::soa::is_binding_compatible_v()); } else { return false; } }() || ...); } template @@ -2057,7 +2062,7 @@ class Table template void doBindInternalIndicesExplicit(framework::pack, o2::soa::Binding binding) { - ([this, &binding](){ if constexpr (is_self_index_column) { static_cast(mBegin).setCurrentRaw(binding); } }(), ...); + ([this, &binding]() { if constexpr (is_self_index_column) { static_cast(mBegin).setCurrentRaw(binding); } }(), ...); } void bindExternalIndicesRaw(std::vector&& ptrs) diff --git a/Framework/Core/include/Framework/GroupedCombinations.h b/Framework/Core/include/Framework/GroupedCombinations.h index 91ca1fefe3b7c..abf5a36381508 100644 --- a/Framework/Core/include/Framework/GroupedCombinations.h +++ b/Framework/Core/include/Framework/GroupedCombinations.h @@ -46,7 +46,9 @@ auto isIndexTo() } template -auto isIndexTo() ->std::false_type {} +auto isIndexTo() -> std::false_type +{ +} template using is_index_to_g_t = decltype(isIndexTo()); From 16ea3a843452ef7a009f1d46f08aa95b58cab56f Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Thu, 23 Jan 2025 13:35:39 +0100 Subject: [PATCH 04/20] fixup! DPL Analysis: remove unnecessary instances of selected_pack --- Framework/Core/include/Framework/GroupedCombinations.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Framework/Core/include/Framework/GroupedCombinations.h b/Framework/Core/include/Framework/GroupedCombinations.h index abf5a36381508..7bed8519030fd 100644 --- a/Framework/Core/include/Framework/GroupedCombinations.h +++ b/Framework/Core/include/Framework/GroupedCombinations.h @@ -46,8 +46,9 @@ auto isIndexTo() } template -auto isIndexTo() -> std::false_type +auto isIndexTo() { + return std::false_type{}; } template From 9f7e13eecdf8cc40d7420493e41681d20d1d7a69 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Thu, 23 Jan 2025 13:36:14 +0100 Subject: [PATCH 05/20] fixup! DPL Analysis: remove unnecessary instances of selected_pack --- Framework/Core/include/Framework/GroupedCombinations.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Framework/Core/include/Framework/GroupedCombinations.h b/Framework/Core/include/Framework/GroupedCombinations.h index 7bed8519030fd..3f48086fe0380 100644 --- a/Framework/Core/include/Framework/GroupedCombinations.h +++ b/Framework/Core/include/Framework/GroupedCombinations.h @@ -36,7 +36,7 @@ auto interleaveTuples(std::tuple& t1, std::tuple& t2) template requires(!soa::is_self_index_column) -auto isIndexTo() +constexpr auto isIndexTo() { if constexpr (o2::soa::is_binding_compatible_v()) { return std::true_type{}; @@ -46,7 +46,7 @@ auto isIndexTo() } template -auto isIndexTo() +constexpr auto isIndexTo() { return std::false_type{}; } From b472ec7784f9915e62eb8129b73a535d430eb6b2 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Thu, 23 Jan 2025 14:24:11 +0100 Subject: [PATCH 06/20] fixup! DPL Analysis: remove unnecessary instances of selected_pack --- Framework/Core/include/Framework/ASoA.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index 40b2bcfbb3129..3ca9f46f66232 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1036,12 +1036,12 @@ concept has_index = (is_indexing_column || ...); template requires(!is_self_index_column) -auto getBinding() -> typename C::binding_t +constexpr auto getBinding() -> typename C::binding_t { } template -auto getBinding() -> void +constexpr auto getBinding() -> void { } From 84cee9a49111941fb26cc647e6d4cbad85174c18 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Thu, 23 Jan 2025 14:26:12 +0100 Subject: [PATCH 07/20] fixup! DPL Analysis: remove unnecessary instances of selected_pack --- Framework/Core/include/Framework/ASoA.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index 3ca9f46f66232..6be2657a90aca 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1036,12 +1036,12 @@ concept has_index = (is_indexing_column || ...); template requires(!is_self_index_column) -constexpr auto getBinding() -> typename C::binding_t +consteval auto getBinding() -> typename C::binding_t { } template -constexpr auto getBinding() -> void +consteval auto getBinding() -> void { } From 4d3fa45a969d1763a627f93c62ea7c209455bb90 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Thu, 23 Jan 2025 14:30:07 +0100 Subject: [PATCH 08/20] fixup! DPL Analysis: remove unnecessary instances of selected_pack --- Framework/Core/include/Framework/GroupedCombinations.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Framework/Core/include/Framework/GroupedCombinations.h b/Framework/Core/include/Framework/GroupedCombinations.h index 3f48086fe0380..2f8a5d3320f48 100644 --- a/Framework/Core/include/Framework/GroupedCombinations.h +++ b/Framework/Core/include/Framework/GroupedCombinations.h @@ -36,7 +36,7 @@ auto interleaveTuples(std::tuple& t1, std::tuple& t2) template requires(!soa::is_self_index_column) -constexpr auto isIndexTo() +consteval auto isIndexTo() { if constexpr (o2::soa::is_binding_compatible_v()) { return std::true_type{}; @@ -46,7 +46,7 @@ constexpr auto isIndexTo() } template -constexpr auto isIndexTo() +consteval auto isIndexTo() { return std::false_type{}; } From c67d408d885a9d06409c8de7ccef484e3e6779bd Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 24 Jan 2025 11:11:01 +0100 Subject: [PATCH 09/20] use requirements instead of if-constexpr --- Framework/Core/include/Framework/ASoA.h | 42 ++++++++++++++++++------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index 6be2657a90aca..cbcc6a97b91f1 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1147,7 +1147,10 @@ struct TableIterator : IP, C... { template void doSetCurrentIndex(framework::pack, TA* current) { - ([¤t, this]() { if constexpr (is_index_column && !is_self_index_column) {CL::setCurrent(current);} }(), ...); + (framework::overloaded{ + [¤t, this] requires(!is_self_index_column) () { CI::setCurrent(current); }, + [](){} + }.template operator()(), ...); } template @@ -1160,12 +1163,12 @@ struct TableIterator : IP, C... { auto getIndexBindingsImpl(framework::pack) const { std::vector result; - ([this, &result]() { - if constexpr (is_index_column && !is_self_index_column) { - result.emplace_back(static_cast(*this).getCurrentRaw()); - } - }(), - ...); + (framework::overloaded{ + [this, &result] requires(!is_self_index_column) () mutable { + result.emplace_back(CI::getCurrentRaw()); + }, + [](){} + }.template operator()(), ...); return result; } @@ -1183,7 +1186,10 @@ struct TableIterator : IP, C... { template void doSetCurrentIndexRaw(framework::pack p, std::vector&& ptrs) { - ([&ptrs, p, this]() { if constexpr (is_index_column && !is_self_index_column) { Cs::setCurrentRaw(ptrs[framework::has_type_at_v(p)]); } }(), ...); + (framework::overloaded{ + [&ptrs, p, this] requires(!is_self_index_column) () { CI::setCurrentRaw(ptrs[framework::has_type_at_v(p)]); }, + [](){} + }.template operator()(), ...); } template @@ -1191,7 +1197,10 @@ struct TableIterator : IP, C... { { o2::soa::Binding b; b.bind(ptr); - ([&ptr, &b, this]() { if constexpr (is_self_index_column) { Cs::setCurrentRaw(b); } }(), ...); + (framework::overloaded{ + [&ptr, &b, this]() { CI::setCurrentRaw(b); }, + [](){} + }.template operator()(), ...); } void bindExternalIndicesRaw(std::vector&& ptrs) @@ -1386,13 +1395,19 @@ static constexpr std::string getLabelFromTypeForKey(std::string const& key) template consteval static bool hasIndexTo(framework::pack&&) { - return ([]() { if constexpr (is_index_column && !is_self_index_column) { return o2::soa::is_binding_compatible_v(); } else { return false; } }() || ...); + return (framework::overloaded{ + [] requires(!is_self_index_column) () { return o2::soa::is_binding_compatible_v(); }, + [](){ return false; } + }.template operator()() || ...); } template consteval static bool hasSortedIndexTo(framework::pack&&) { - return ([]() {if constexpr (is_index_column && !is_self_index_column) { return (C::sorted && o2::soa::is_binding_compatible_v()); } else { return false; } }() || ...); + return (framework::overloaded{ + [] requires(!is_self_index_column) () {return (CI::sorted && o2::soa::is_binding_compatible_v()); }, + [](){} + }.template operator()() || ...); } template @@ -2062,7 +2077,10 @@ class Table template void doBindInternalIndicesExplicit(framework::pack, o2::soa::Binding binding) { - ([this, &binding]() { if constexpr (is_self_index_column) { static_cast(mBegin).setCurrentRaw(binding); } }(), ...); + (framework::overloaded{ + [this, &binding]() { static_cast(mBegin).setCurrentRaw(binding); }, + [](){} + }.template operator()(), ...); } void bindExternalIndicesRaw(std::vector&& ptrs) From 8234bde5ed4c7c8fae82548c276ca1e11614a847 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 24 Jan 2025 11:13:17 +0100 Subject: [PATCH 10/20] fixup! use requirements instead of if-constexpr --- Framework/Core/include/Framework/ASoA.h | 63 ++++++++++++++++--------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index cbcc6a97b91f1..b6184921c96d9 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1148,9 +1148,12 @@ struct TableIterator : IP, C... { void doSetCurrentIndex(framework::pack, TA* current) { (framework::overloaded{ - [¤t, this] requires(!is_self_index_column) () { CI::setCurrent(current); }, - [](){} - }.template operator()(), ...); + [¤t, this] + requires(!is_self_index_column) + () { CI::setCurrent(current); }, + []() {}} + .template operator()(), + ...); } template @@ -1164,11 +1167,14 @@ struct TableIterator : IP, C... { { std::vector result; (framework::overloaded{ - [this, &result] requires(!is_self_index_column) () mutable { - result.emplace_back(CI::getCurrentRaw()); - }, - [](){} - }.template operator()(), ...); + [this, &result] + requires(!is_self_index_column) + () mutable { + result.emplace_back(CI::getCurrentRaw()); + }, + []() {}} + .template operator()(), + ...); return result; } @@ -1187,9 +1193,12 @@ struct TableIterator : IP, C... { void doSetCurrentIndexRaw(framework::pack p, std::vector&& ptrs) { (framework::overloaded{ - [&ptrs, p, this] requires(!is_self_index_column) () { CI::setCurrentRaw(ptrs[framework::has_type_at_v(p)]); }, - [](){} - }.template operator()(), ...); + [&ptrs, p, this] + requires(!is_self_index_column) + () { CI::setCurrentRaw(ptrs[framework::has_type_at_v(p)]); }, + []() {}} + .template operator()(), + ...); } template @@ -1198,9 +1207,10 @@ struct TableIterator : IP, C... { o2::soa::Binding b; b.bind(ptr); (framework::overloaded{ - [&ptr, &b, this]() { CI::setCurrentRaw(b); }, - [](){} - }.template operator()(), ...); + [&ptr, &b, this]() { CI::setCurrentRaw(b); }, + []() {}} + .template operator()(), + ...); } void bindExternalIndicesRaw(std::vector&& ptrs) @@ -1396,18 +1406,24 @@ template consteval static bool hasIndexTo(framework::pack&&) { return (framework::overloaded{ - [] requires(!is_self_index_column) () { return o2::soa::is_binding_compatible_v(); }, - [](){ return false; } - }.template operator()() || ...); + [] + requires(!is_self_index_column) + () { return o2::soa::is_binding_compatible_v(); }, + []() { return false; }} + .template operator()() || + ...); } template consteval static bool hasSortedIndexTo(framework::pack&&) { return (framework::overloaded{ - [] requires(!is_self_index_column) () {return (CI::sorted && o2::soa::is_binding_compatible_v()); }, - [](){} - }.template operator()() || ...); + [] + requires(!is_self_index_column) + () { return (CI::sorted && o2::soa::is_binding_compatible_v()); }, + []() {}} + .template operator()() || + ...); } template @@ -2078,9 +2094,10 @@ class Table void doBindInternalIndicesExplicit(framework::pack, o2::soa::Binding binding) { (framework::overloaded{ - [this, &binding]() { static_cast(mBegin).setCurrentRaw(binding); }, - [](){} - }.template operator()(), ...); + [this, &binding]() { static_cast(mBegin).setCurrentRaw(binding); }, + []() {}} + .template operator()(), + ...); } void bindExternalIndicesRaw(std::vector&& ptrs) From f09930a1fd3f7850a3cd9654c1e1779817669eaf Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Wed, 29 Jan 2025 14:14:53 +0100 Subject: [PATCH 11/20] avoid overloaded{}; fix index binding ignored in certain cases --- Framework/Core/include/Framework/ASoA.h | 179 ++++++++++++------ .../include/Framework/GroupedCombinations.h | 20 +- 2 files changed, 135 insertions(+), 64 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index b6184921c96d9..dc98be9155e04 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1147,13 +1147,7 @@ struct TableIterator : IP, C... { template void doSetCurrentIndex(framework::pack, TA* current) { - (framework::overloaded{ - [¤t, this] - requires(!is_self_index_column) - () { CI::setCurrent(current); }, - []() {}} - .template operator()(), - ...); + (doSetCurrentIndexImpl(current), ...); } template @@ -1166,15 +1160,7 @@ struct TableIterator : IP, C... { auto getIndexBindingsImpl(framework::pack) const { std::vector result; - (framework::overloaded{ - [this, &result] - requires(!is_self_index_column) - () mutable { - result.emplace_back(CI::getCurrentRaw()); - }, - []() {}} - .template operator()(), - ...); + (doGetIndexBindingImpl(result), ...); return result; } @@ -1190,15 +1176,9 @@ struct TableIterator : IP, C... { } template - void doSetCurrentIndexRaw(framework::pack p, std::vector&& ptrs) + void doSetCurrentIndexRaw(framework::pack p, std::vector&& bindings) { - (framework::overloaded{ - [&ptrs, p, this] - requires(!is_self_index_column) - () { CI::setCurrentRaw(ptrs[framework::has_type_at_v(p)]); }, - []() {}} - .template operator()(), - ...); + (doSetCurrentIndexRawImpl(bindings[framework::has_type_at_v(p)]), ...); } template @@ -1206,16 +1186,12 @@ struct TableIterator : IP, C... { { o2::soa::Binding b; b.bind(ptr); - (framework::overloaded{ - [&ptr, &b, this]() { CI::setCurrentRaw(b); }, - []() {}} - .template operator()(), - ...); + (doSetCurrentInternalImpl(b), ...); } - void bindExternalIndicesRaw(std::vector&& ptrs) + void bindExternalIndicesRaw(std::vector&& bindings) { - doSetCurrentIndexRaw(all_columns{}, std::forward>(ptrs)); + doSetCurrentIndexRaw(all_columns{}, std::forward>(bindings)); } template @@ -1225,6 +1201,78 @@ struct TableIterator : IP, C... { } private: + /// Overloaded helpers for index manipulations + template + requires(!soa::is_self_index_column) + void doSetCurrentIndexImpl(TA* current) + { + CL::setCurrent(current); + } + + template + requires(!soa::is_index_column) + void doSetCurrentIndexImpl(TA*) + { + } + + template + requires(!soa::is_self_index_column) + auto doGetIndexBindingImpl(std::vector& bindings) const + { + bindings.emplace_back(CL::getCurrentRaw()); + } + + template + requires(!soa::is_index_column) + auto doGetIndexBindingImpl(std::vector& bindings) const + { + bindings.emplace_back(); + } + + template + requires(!soa::is_self_index_column) + void doSetCurrentIndexRawImpl(o2::soa::Binding const& b) + { + CL::setCurrentRaw(b); + } + + template + requires(!soa::is_index_column) + void doSetCurrentIndexRawImpl(o2::soa::Binding const&) + { + } + + template + void doSetCurrentInternalImpl(o2::soa::Binding const& b) + { + CL::setCurrentRaw(b); + } + + template + requires(!soa::is_self_index_column) + void doSetCurrentInternalImpl(o2::soa::Binding const&) + { + } + + ///Overloaded helpers for column binding + template + void doBind() + { + CL::mColumnIterator.mCurrentPos = &this->mRowIndex; + } + + template + void doBind() + { + bindDynamicColumn(typename CL::bindings_t{}); + } + + template + requires(!soa::is_persistent_column && !soa::is_dynamic_column) + void doBind() + { + } + /// Helper to move at the end of columns which actually have an iterator. template void doMoveToEnd(framework::pack) @@ -1237,12 +1285,7 @@ struct TableIterator : IP, C... { void bind() { using namespace o2::soa; - auto f = framework::overloaded{ - [this](T*) -> void { T::mColumnIterator.mCurrentPos = &this->mRowIndex; }, - [this](T*) -> void { bindDynamicColumn(typename T::bindings_t{}); }, - [this](T*) -> void {}, - }; - (f(static_cast(nullptr)), ...); + (doBind(), ...); if constexpr (has_index) { this->setIndices(this->getIndices()); this->setOffsets(this->getOffsets()); @@ -1402,28 +1445,44 @@ static constexpr std::string getLabelFromTypeForKey(std::string const& key) O2_BUILTIN_UNREACHABLE(); } +template + requires(!soa::is_self_index_column) +consteval static bool hasIndexToImpl() +{ + return o2::soa::is_binding_compatible_v(); +} + +template + requires(!soa::is_index_column) +consteval static bool hasIndexToImpl() +{ + return false; +} + template consteval static bool hasIndexTo(framework::pack&&) { - return (framework::overloaded{ - [] - requires(!is_self_index_column) - () { return o2::soa::is_binding_compatible_v(); }, - []() { return false; }} - .template operator()() || - ...); + return (hasIndexToImpl() || ...); +} + +template + requires(!soa::is_self_index_column) +consteval static bool hasSortedIndexToImpl() +{ + return CL::sorted && o2::soa::is_binding_compatible_v(); +} + +template + requires(!soa::is_index_column) +consteval static bool hasSortedIndexToImpl() +{ + return false; } template consteval static bool hasSortedIndexTo(framework::pack&&) { - return (framework::overloaded{ - [] - requires(!is_self_index_column) - () { return (CI::sorted && o2::soa::is_binding_compatible_v()); }, - []() {}} - .template operator()() || - ...); + return (hasSortedIndexToImpl() || ...); } template @@ -2090,14 +2149,22 @@ class Table doBindInternalIndicesExplicit(columns_t{}, binding); } + template + void doBindInternalIndicesExplicitImpl(o2::soa::Binding binding) + { + static_cast(mBegin).setCurrentRaw(binding); + } + + template + requires(!soa::is_self_index_column) + void doBindInternalIndicesExplicitImpl(o2::soa::Binding) + { + } + template void doBindInternalIndicesExplicit(framework::pack, o2::soa::Binding binding) { - (framework::overloaded{ - [this, &binding]() { static_cast(mBegin).setCurrentRaw(binding); }, - []() {}} - .template operator()(), - ...); + (doBindInternalIndicesExplicitImpl(binding), ...); } void bindExternalIndicesRaw(std::vector&& ptrs) diff --git a/Framework/Core/include/Framework/GroupedCombinations.h b/Framework/Core/include/Framework/GroupedCombinations.h index 2f8a5d3320f48..6ca7bbef1cbfa 100644 --- a/Framework/Core/include/Framework/GroupedCombinations.h +++ b/Framework/Core/include/Framework/GroupedCombinations.h @@ -34,18 +34,22 @@ auto interleaveTuples(std::tuple& t1, std::tuple& t2) return interleaveTuplesImpl(t1, t2, std::index_sequence_for()); } -template - requires(!soa::is_self_index_column) +template + requires(!soa::is_self_index_column && o2::soa::is_binding_compatible_v, typename std::decay_t::binding_t>()) consteval auto isIndexTo() { - if constexpr (o2::soa::is_binding_compatible_v()) { - return std::true_type{}; - } else { - return std::false_type{}; - } + return std::true_type{}; } -template +template + requires(!soa::is_self_index_column && !o2::soa::is_binding_compatible_v, typename std::decay_t::binding_t>()) +consteval auto isIndexTo() +{ + return std::false_type{}; +} + +template + requires(!soa::is_index_column) consteval auto isIndexTo() { return std::false_type{}; From be7018abf5c18f505250cc7733783b41eb960fb4 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Wed, 29 Jan 2025 14:23:20 +0100 Subject: [PATCH 12/20] format --- Framework/Core/include/Framework/ASoA.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index dc98be9155e04..b3913a0e24d73 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1254,7 +1254,7 @@ struct TableIterator : IP, C... { { } - ///Overloaded helpers for column binding + /// Overloaded helpers for column binding template void doBind() { From 4e3732b79a26b707db619164e34a1802aab376bf Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 28 Mar 2025 12:36:27 +0100 Subject: [PATCH 13/20] get rid of bindings_pack_t --- Framework/Core/include/Framework/ASoA.h | 37 ++++++++++++++----------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index b3913a0e24d73..4c37730f06659 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1045,6 +1045,12 @@ consteval auto getBinding() -> void { } +template +consteval auto inBindings(framework::pack) +{ + return framework::has_type_at_v(framework::pack())...>{}); +} + template struct TableIterator : IP, C... { public: @@ -1052,9 +1058,6 @@ struct TableIterator : IP, C... { using policy_t = IP; using all_columns = framework::pack; using persistent_columns_t = framework::selected_pack; - using bindings_pack_t = decltype([](framework::pack) { - return framework::pack())...>{}; - }(all_columns{})); TableIterator(arrow::ChunkedArray* columnData[sizeof...(C)], IP&& policy) : IP{policy}, @@ -1828,8 +1831,6 @@ class Table template struct TableIteratorBase : base_iterator { using columns_t = typename Parent::columns_t; - using bindings_pack_t = typename base_iterator::bindings_pack_t; - // static constexpr const std::array originals{T::ref...}; static constexpr auto originals = Parent::originals; using policy_t = IP; using parent_t = Parent; @@ -1918,17 +1919,21 @@ class Table template auto getId() const { - using decayed = std::decay_t; - if constexpr (framework::has_type(bindings_pack_t{})) { // index to another table - constexpr auto idx = framework::has_type_at_v(bindings_pack_t{}); - return framework::pack_element_t::getId(); - } else if constexpr (std::same_as) { // self index - return this->globalIndex(); - } else if constexpr (is_indexing_column) { // soa::Index<> - return this->globalIndex(); - } else { - return static_cast(-1); - } + return static_cast(-1); + } + + template + requires(std::same_as, Parent> || is_indexing_column>) + auto getId() const + { + return this->globalIndex(); + } + + template + requires(inBindings>(typename Parent::all_columns{}) < framework::pack_size(typename Parent::all_columns{})) + auto getId() const + { + return inBindings>(typename Parent::all_columns{}); } template From 5f7c49242593f66347d1bb26c23d22cecc711143 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Mon, 31 Mar 2025 10:54:16 +0200 Subject: [PATCH 14/20] do not use all_columns pack where the template arguments are available --- Framework/Core/include/Framework/ASoA.h | 44 +++++++------------------ 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index 4c37730f06659..c83a7f666bee6 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1061,7 +1061,7 @@ struct TableIterator : IP, C... { TableIterator(arrow::ChunkedArray* columnData[sizeof...(C)], IP&& policy) : IP{policy}, - C(columnData[framework::has_type_at_v(all_columns{})])... + C(columnData[framework::has_type_at_v(framework::pack{})])... { bind(); } @@ -1069,7 +1069,7 @@ struct TableIterator : IP, C... { TableIterator(arrow::ChunkedArray* columnData[sizeof...(C)], IP&& policy) requires(has_index) : IP{policy}, - C(columnData[framework::has_type_at_v(all_columns{})])... + C(columnData[framework::has_type_at_v(framework::pack{})])... { bind(); // In case we have an index column might need to constrain the actual @@ -1147,60 +1147,38 @@ struct TableIterator : IP, C... { return *this; } - template - void doSetCurrentIndex(framework::pack, TA* current) - { - (doSetCurrentIndexImpl(current), ...); - } - template auto getCurrent() const { return CL::getCurrentRaw(); } - template - auto getIndexBindingsImpl(framework::pack) const + auto getIndexBindings() const { std::vector result; - (doGetIndexBindingImpl(result), ...); + (doGetIndexBindingImpl(result), ...); return result; } - auto getIndexBindings() const - { - return getIndexBindingsImpl(all_columns{}); - } - template void bindExternalIndices(TA*... current) { - (doSetCurrentIndex(all_columns{}, current), ...); - } - - template - void doSetCurrentIndexRaw(framework::pack p, std::vector&& bindings) - { - (doSetCurrentIndexRawImpl(bindings[framework::has_type_at_v(p)]), ...); - } - - template - void doSetCurrentInternal(framework::pack, I const* ptr) - { - o2::soa::Binding b; - b.bind(ptr); - (doSetCurrentInternalImpl(b), ...); + ([this](framework::pack, TT* t){ + (doSetCurrentIndexImpl(t), ...); + }(framework::pack{}, current), ...); } void bindExternalIndicesRaw(std::vector&& bindings) { - doSetCurrentIndexRaw(all_columns{}, std::forward>(bindings)); + (doSetCurrentIndexRawImpl(bindings[framework::has_type_at_v(framework::pack{})]), ...); } template void bindInternalIndices(I const* table) { - doSetCurrentInternal(all_columns{}, table); + o2::soa::Binding b; + b.bind(table); + (doSetCurrentInternalImpl(b), ...); } private: From 9e77fe49a78954d164cb76e8748dc4da8615649b Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Mon, 31 Mar 2025 08:54:53 +0000 Subject: [PATCH 15/20] Please consider the following formatting changes --- Framework/Core/include/Framework/ASoA.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index c83a7f666bee6..9bf0d8c8e59dc 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1163,9 +1163,10 @@ struct TableIterator : IP, C... { template void bindExternalIndices(TA*... current) { - ([this](framework::pack, TT* t){ + ([this](framework::pack, TT* t) { (doSetCurrentIndexImpl(t), ...); - }(framework::pack{}, current), ...); + }(framework::pack{}, current), + ...); } void bindExternalIndicesRaw(std::vector&& bindings) From 016e431834576f1919c2442eccd29d50d1a8d539 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 16 May 2025 13:18:30 +0200 Subject: [PATCH 16/20] reduce amount of symbols --- Framework/Core/include/Framework/ASoA.h | 221 ++++++------------ .../include/Framework/GroupedCombinations.h | 29 +-- 2 files changed, 75 insertions(+), 175 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index 9bf0d8c8e59dc..a2cb31bb711e7 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1034,21 +1034,15 @@ concept can_bind = requires(T&& t) { template concept has_index = (is_indexing_column || ...); -template - requires(!is_self_index_column) -consteval auto getBinding() -> typename C::binding_t -{ -} - -template -consteval auto getBinding() -> void -{ -} - template consteval auto inBindings(framework::pack) { - return framework::has_type_at_v(framework::pack())...>{}); + return framework::has_type_at_v(framework::pack(){ + if constexpr (is_index_column && !is_self_index_column) { + return std::declval(); + } else { + return; + } }.template operator()())...>{}); } template @@ -1153,25 +1147,40 @@ struct TableIterator : IP, C... { return CL::getCurrentRaw(); } - auto getIndexBindings() const + auto getIndexBindings() -> std::vector const { - std::vector result; - (doGetIndexBindingImpl(result), ...); - return result; + return {[](){ + if constexpr (soa::is_index_column && !soa::is_self_index_column) { + return o2::soa::Binding{CL::getCurrentRaw()}; + } else { + return o2::soa::Binding{}; + } + }.template operator()()...}; } template void bindExternalIndices(TA*... current) { ([this](framework::pack, TT* t) { - (doSetCurrentIndexImpl(t), ...); + ([](TI* c){ + if constexpr (soa::is_index_column && !soa::is_self_index_column) { + CL::setCurrent(c); + } + }.template operator()(t), ...); }(framework::pack{}, current), ...); } void bindExternalIndicesRaw(std::vector&& bindings) { - (doSetCurrentIndexRawImpl(bindings[framework::has_type_at_v(framework::pack{})]), ...); + [&bindings](std::index_sequence){ + ([&bindings](){ + using column = typename framework::pack_element_t>; + if constexpr (soa::is_index_column && !soa::is_self_index_column) { + column::setCurrentRaw(bindings[Is]); + } + }(), ...); + }(std::make_index_sequence()); } template @@ -1179,82 +1188,14 @@ struct TableIterator : IP, C... { { o2::soa::Binding b; b.bind(table); - (doSetCurrentInternalImpl(b), ...); + ([](o2::soa::Binding const& bb){ + if constexpr(soa::is_self_index_column) { + CL::setCurrentRaw(bb); + } + }.template operator()(b), ...); } private: - /// Overloaded helpers for index manipulations - template - requires(!soa::is_self_index_column) - void doSetCurrentIndexImpl(TA* current) - { - CL::setCurrent(current); - } - - template - requires(!soa::is_index_column) - void doSetCurrentIndexImpl(TA*) - { - } - - template - requires(!soa::is_self_index_column) - auto doGetIndexBindingImpl(std::vector& bindings) const - { - bindings.emplace_back(CL::getCurrentRaw()); - } - - template - requires(!soa::is_index_column) - auto doGetIndexBindingImpl(std::vector& bindings) const - { - bindings.emplace_back(); - } - - template - requires(!soa::is_self_index_column) - void doSetCurrentIndexRawImpl(o2::soa::Binding const& b) - { - CL::setCurrentRaw(b); - } - - template - requires(!soa::is_index_column) - void doSetCurrentIndexRawImpl(o2::soa::Binding const&) - { - } - - template - void doSetCurrentInternalImpl(o2::soa::Binding const& b) - { - CL::setCurrentRaw(b); - } - - template - requires(!soa::is_self_index_column) - void doSetCurrentInternalImpl(o2::soa::Binding const&) - { - } - - /// Overloaded helpers for column binding - template - void doBind() - { - CL::mColumnIterator.mCurrentPos = &this->mRowIndex; - } - - template - void doBind() - { - bindDynamicColumn(typename CL::bindings_t{}); - } - - template - requires(!soa::is_persistent_column && !soa::is_dynamic_column) - void doBind() - { - } - /// Helper to move at the end of columns which actually have an iterator. template void doMoveToEnd(framework::pack) @@ -1267,37 +1208,35 @@ struct TableIterator : IP, C... { void bind() { using namespace o2::soa; - (doBind(), ...); + ([this](){ + if constexpr (soa::is_persistent_column) { + CL::mColumnIterator.mCurrentPos = &this->mRowIndex; + } else if constexpr (soa::is_dynamic_column) { + bindDynamicColumn(typename CL::bindings_t{}); + } + }.template operator()(), ...); + if constexpr (has_index) { this->setIndices(this->getIndices()); this->setOffsets(this->getOffsets()); } } - template - auto bindDynamicColumn(framework::pack) - { - DC::boundIterators = std::make_tuple(getDynamicBinding()...); - } - // Sometimes dynamic columns are defined for tables in // the hope that it will be joined / extended with another one which provides // the full set of bindings. This is to avoid a compilation // error if constructor for the table or any other thing involving a missing // binding is preinstanciated. - template - requires(can_bind) - decltype(auto) getDynamicBinding() - { - static_assert(std::same_as(this)->mColumnIterator)), std::decay_t*>, "foo"); - return &(static_cast(this)->mColumnIterator); - // return static_cast*>(nullptr); - } - - template - decltype(auto) getDynamicBinding() + template + auto bindDynamicColumn(framework::pack) { - return static_cast*>(nullptr); + DC::boundIterators = std::make_tuple([this](){ + if constexpr (can_bind) { + return &(static_cast(this)->mColumnIterator); + } else { + return static_cast*>(nullptr); + } + }.template operator()()...); } }; @@ -1427,44 +1366,28 @@ static constexpr std::string getLabelFromTypeForKey(std::string const& key) O2_BUILTIN_UNREACHABLE(); } -template - requires(!soa::is_self_index_column) -consteval static bool hasIndexToImpl() -{ - return o2::soa::is_binding_compatible_v(); -} - -template - requires(!soa::is_index_column) -consteval static bool hasIndexToImpl() -{ - return false; -} - template consteval static bool hasIndexTo(framework::pack&&) { - return (hasIndexToImpl() || ...); -} - -template - requires(!soa::is_self_index_column) -consteval static bool hasSortedIndexToImpl() -{ - return CL::sorted && o2::soa::is_binding_compatible_v(); -} - -template - requires(!soa::is_index_column) -consteval static bool hasSortedIndexToImpl() -{ - return false; + return ([](){ + if constexpr (soa::is_index_column && !soa::is_self_index_column) { + return o2::soa::is_binding_compatible_v(); + } else { + return false; + } + }.template operator()() || ...); } template consteval static bool hasSortedIndexTo(framework::pack&&) { - return (hasSortedIndexToImpl() || ...); + return ([](){ + if constexpr (soa::is_index_column && !soa::is_self_index_column) { + return CC::sorted && o2::soa::is_binding_compatible_v(); + } else { + return false; + } + }.template operator()() || ...); } template @@ -2133,22 +2056,14 @@ class Table doBindInternalIndicesExplicit(columns_t{}, binding); } - template - void doBindInternalIndicesExplicitImpl(o2::soa::Binding binding) - { - static_cast(mBegin).setCurrentRaw(binding); - } - - template - requires(!soa::is_self_index_column) - void doBindInternalIndicesExplicitImpl(o2::soa::Binding) - { - } - template void doBindInternalIndicesExplicit(framework::pack, o2::soa::Binding binding) { - (doBindInternalIndicesExplicitImpl(binding), ...); + ([this](o2::soa::Binding b){ + if constexpr (soa::is_self_index_column) { + static_cast(mBegin).setCurrentRaw(b); + } + }.template operator()(binding), ...); } void bindExternalIndicesRaw(std::vector&& ptrs) diff --git a/Framework/Core/include/Framework/GroupedCombinations.h b/Framework/Core/include/Framework/GroupedCombinations.h index 6ca7bbef1cbfa..e4c6465515262 100644 --- a/Framework/Core/include/Framework/GroupedCombinations.h +++ b/Framework/Core/include/Framework/GroupedCombinations.h @@ -34,29 +34,14 @@ auto interleaveTuples(std::tuple& t1, std::tuple& t2) return interleaveTuplesImpl(t1, t2, std::index_sequence_for()); } -template - requires(!soa::is_self_index_column && o2::soa::is_binding_compatible_v, typename std::decay_t::binding_t>()) -consteval auto isIndexTo() -{ - return std::true_type{}; -} - -template - requires(!soa::is_self_index_column && !o2::soa::is_binding_compatible_v, typename std::decay_t::binding_t>()) -consteval auto isIndexTo() -{ - return std::false_type{}; -} - -template - requires(!soa::is_index_column) -consteval auto isIndexTo() -{ - return std::false_type{}; -} - template -using is_index_to_g_t = decltype(isIndexTo()); +using is_index_to_g_t = decltype([](){ + if constexpr (soa::is_index_column && !soa::is_self_index_column) { + return std::conditional_t, typename std::decay_t::binding_t>, std::true_type, std::false_type>{}; + } else { + return std::false_type{}; + } +}()); template expressions::BindingNode getMatchingIndexNode() From d52443d993b20861ea1ba0d481bea0a077f96c68 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 16 May 2025 13:30:07 +0200 Subject: [PATCH 17/20] fixup! reduce amount of symbols --- Framework/Core/include/Framework/ASoA.h | 12 ++++++------ .../Core/include/Framework/GroupedCombinations.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index a2cb31bb711e7..462371453f2d1 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1147,9 +1147,9 @@ struct TableIterator : IP, C... { return CL::getCurrentRaw(); } - auto getIndexBindings() -> std::vector const + std::vector getIndexBindings() const { - return {[](){ + return {[this](){ if constexpr (soa::is_index_column && !soa::is_self_index_column) { return o2::soa::Binding{CL::getCurrentRaw()}; } else { @@ -1162,7 +1162,7 @@ struct TableIterator : IP, C... { void bindExternalIndices(TA*... current) { ([this](framework::pack, TT* t) { - ([](TI* c){ + ([this](TI* c){ if constexpr (soa::is_index_column && !soa::is_self_index_column) { CL::setCurrent(c); } @@ -1173,8 +1173,8 @@ struct TableIterator : IP, C... { void bindExternalIndicesRaw(std::vector&& bindings) { - [&bindings](std::index_sequence){ - ([&bindings](){ + [&bindings, this](std::index_sequence){ + ([&bindings, this](){ using column = typename framework::pack_element_t>; if constexpr (soa::is_index_column && !soa::is_self_index_column) { column::setCurrentRaw(bindings[Is]); @@ -1188,7 +1188,7 @@ struct TableIterator : IP, C... { { o2::soa::Binding b; b.bind(table); - ([](o2::soa::Binding const& bb){ + ([this](o2::soa::Binding const& bb){ if constexpr(soa::is_self_index_column) { CL::setCurrentRaw(bb); } diff --git a/Framework/Core/include/Framework/GroupedCombinations.h b/Framework/Core/include/Framework/GroupedCombinations.h index e4c6465515262..83153d98f6369 100644 --- a/Framework/Core/include/Framework/GroupedCombinations.h +++ b/Framework/Core/include/Framework/GroupedCombinations.h @@ -37,7 +37,7 @@ auto interleaveTuples(std::tuple& t1, std::tuple& t2) template using is_index_to_g_t = decltype([](){ if constexpr (soa::is_index_column && !soa::is_self_index_column) { - return std::conditional_t, typename std::decay_t::binding_t>, std::true_type, std::false_type>{}; + return std::conditional_t, typename std::decay_t::binding_t>(), std::true_type, std::false_type>{}; } else { return std::false_type{}; } From 177ecd1390f910da8618c72f6dbc4e0db4a08d28 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 16 May 2025 11:31:59 +0000 Subject: [PATCH 18/20] Please consider the following formatting changes --- Framework/Core/include/Framework/ASoA.h | 47 +++++++++++-------- .../include/Framework/GroupedCombinations.h | 2 +- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index 462371453f2d1..34790aa42e5b2 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1037,7 +1037,7 @@ concept has_index = (is_indexing_column || ...); template consteval auto inBindings(framework::pack) { - return framework::has_type_at_v(framework::pack(){ + return framework::has_type_at_v(framework::pack() { if constexpr (is_index_column && !is_self_index_column) { return std::declval(); } else { @@ -1149,37 +1149,39 @@ struct TableIterator : IP, C... { std::vector getIndexBindings() const { - return {[this](){ + return { [this]() { if constexpr (soa::is_index_column && !soa::is_self_index_column) { return o2::soa::Binding{CL::getCurrentRaw()}; } else { return o2::soa::Binding{}; } - }.template operator()()...}; + }.template operator()()... }; } template void bindExternalIndices(TA*... current) { ([this](framework::pack, TT* t) { - ([this](TI* c){ + ([this](TI* c) { if constexpr (soa::is_index_column && !soa::is_self_index_column) { CL::setCurrent(c); } - }.template operator()(t), ...); + }.template operator()(t), + ...); }(framework::pack{}, current), ...); } void bindExternalIndicesRaw(std::vector&& bindings) { - [&bindings, this](std::index_sequence){ - ([&bindings, this](){ + [&bindings, this](std::index_sequence) { + ([&bindings, this]() { using column = typename framework::pack_element_t>; if constexpr (soa::is_index_column && !soa::is_self_index_column) { column::setCurrentRaw(bindings[Is]); } - }(), ...); + }(), + ...); }(std::make_index_sequence()); } @@ -1188,11 +1190,12 @@ struct TableIterator : IP, C... { { o2::soa::Binding b; b.bind(table); - ([this](o2::soa::Binding const& bb){ - if constexpr(soa::is_self_index_column) { + ([this](o2::soa::Binding const& bb) { + if constexpr (soa::is_self_index_column) { CL::setCurrentRaw(bb); } - }.template operator()(b), ...); + }.template operator()(b), + ...); } private: @@ -1208,13 +1211,14 @@ struct TableIterator : IP, C... { void bind() { using namespace o2::soa; - ([this](){ + ([this]() { if constexpr (soa::is_persistent_column) { CL::mColumnIterator.mCurrentPos = &this->mRowIndex; } else if constexpr (soa::is_dynamic_column) { bindDynamicColumn(typename CL::bindings_t{}); } - }.template operator()(), ...); + }.template operator()(), + ...); if constexpr (has_index) { this->setIndices(this->getIndices()); @@ -1230,7 +1234,7 @@ struct TableIterator : IP, C... { template auto bindDynamicColumn(framework::pack) { - DC::boundIterators = std::make_tuple([this](){ + DC::boundIterators = std::make_tuple([this]() { if constexpr (can_bind) { return &(static_cast(this)->mColumnIterator); } else { @@ -1369,25 +1373,27 @@ static constexpr std::string getLabelFromTypeForKey(std::string const& key) template consteval static bool hasIndexTo(framework::pack&&) { - return ([](){ + return ([]() { if constexpr (soa::is_index_column && !soa::is_self_index_column) { return o2::soa::is_binding_compatible_v(); } else { return false; } - }.template operator()() || ...); + }.template operator()() || + ...); } template consteval static bool hasSortedIndexTo(framework::pack&&) { - return ([](){ + return ([]() { if constexpr (soa::is_index_column && !soa::is_self_index_column) { return CC::sorted && o2::soa::is_binding_compatible_v(); } else { return false; } - }.template operator()() || ...); + }.template operator()() || + ...); } template @@ -2059,11 +2065,12 @@ class Table template void doBindInternalIndicesExplicit(framework::pack, o2::soa::Binding binding) { - ([this](o2::soa::Binding b){ + ([this](o2::soa::Binding b) { if constexpr (soa::is_self_index_column) { static_cast(mBegin).setCurrentRaw(b); } - }.template operator()(binding), ...); + }.template operator()(binding), + ...); } void bindExternalIndicesRaw(std::vector&& ptrs) diff --git a/Framework/Core/include/Framework/GroupedCombinations.h b/Framework/Core/include/Framework/GroupedCombinations.h index 83153d98f6369..48780a157cf1d 100644 --- a/Framework/Core/include/Framework/GroupedCombinations.h +++ b/Framework/Core/include/Framework/GroupedCombinations.h @@ -35,7 +35,7 @@ auto interleaveTuples(std::tuple& t1, std::tuple& t2) } template -using is_index_to_g_t = decltype([](){ +using is_index_to_g_t = decltype([]() { if constexpr (soa::is_index_column && !soa::is_self_index_column) { return std::conditional_t, typename std::decay_t::binding_t>(), std::true_type, std::false_type>{}; } else { From 2507ed295b5964ec10ca632c3fd1e2ecef16ef21 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 16 May 2025 14:43:20 +0200 Subject: [PATCH 19/20] Fix typo --- Framework/Core/include/Framework/ASoA.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index 34790aa42e5b2..0a2a785cf4f1a 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1236,9 +1236,9 @@ struct TableIterator : IP, C... { { DC::boundIterators = std::make_tuple([this]() { if constexpr (can_bind) { - return &(static_cast(this)->mColumnIterator); + return &(static_cast(this)->mColumnIterator); } else { - return static_cast*>(nullptr); + return static_cast*>(nullptr); } }.template operator()()...); } From 8dd344df2909e33c3f5e47a3779a889d769e6a93 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 16 May 2025 22:10:01 +0200 Subject: [PATCH 20/20] attempt to fix --- Framework/Core/include/Framework/ASoA.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index 0a2a785cf4f1a..7bab9d89c7f9a 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1211,13 +1211,13 @@ struct TableIterator : IP, C... { void bind() { using namespace o2::soa; - ([this]() { - if constexpr (soa::is_persistent_column) { - CL::mColumnIterator.mCurrentPos = &this->mRowIndex; - } else if constexpr (soa::is_dynamic_column) { - bindDynamicColumn(typename CL::bindings_t{}); + ([this]() { + if constexpr (soa::is_persistent_column) { + C::mColumnIterator.mCurrentPos = &this->mRowIndex; + } else if constexpr (soa::is_dynamic_column) { + bindDynamicColumn(typename C::bindings_t{}); } - }.template operator()(), + }(), ...); if constexpr (has_index) {