Skip to content

Commit 1f06f34

Browse files
committed
DPL Analysis: remove unnecessary instances of selected_pack
1 parent e378c4e commit 1f06f34

File tree

2 files changed

+50
-30
lines changed

2 files changed

+50
-30
lines changed

Framework/Core/include/Framework/ASoA.h

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,6 @@ template <typename D, typename... Cs>
213213
struct TableMetadata {
214214
using columns = framework::pack<Cs...>;
215215
using persistent_columns_t = framework::selected_pack<soa::is_persistent_column_t, Cs...>;
216-
using external_index_columns_t = framework::selected_pack<soa::is_external_index_t, Cs...>;
217-
using internal_index_columns_t = framework::selected_pack<soa::is_self_index_t, Cs...>;
218216

219217
template <typename Key, typename... PCs>
220218
static consteval std::array<bool, sizeof...(PCs)> getMap(framework::pack<PCs...>)
@@ -1033,16 +1031,23 @@ concept can_bind = requires(T&& t) {
10331031
template <typename... C>
10341032
concept has_index = (is_indexing_column<C> || ...);
10351033

1034+
template <is_index_column C>
1035+
requires (!is_self_index_column<C>)
1036+
auto getBinding() -> typename C::binding_t {}
1037+
1038+
template <typename C>
1039+
auto getBinding() -> void {}
1040+
10361041
template <typename D, typename O, typename IP, typename... C>
10371042
struct TableIterator : IP, C... {
10381043
public:
10391044
using self_t = TableIterator<D, O, IP, C...>;
10401045
using policy_t = IP;
10411046
using all_columns = framework::pack<C...>;
10421047
using persistent_columns_t = framework::selected_pack<soa::is_persistent_column_t, C...>;
1043-
using external_index_columns_t = framework::selected_pack<soa::is_external_index_t, C...>;
1044-
using internal_index_columns_t = framework::selected_pack<soa::is_self_index_t, C...>;
1045-
using bindings_pack_t = decltype([]<typename... Cs>(framework::pack<Cs...>) -> framework::pack<typename Cs::binding_t...> {}(external_index_columns_t{})); // decltype(extractBindings(external_index_columns_t{}));
1048+
using bindings_pack_t = decltype([]<typename... Cs>(framework::pack<Cs...>) {
1049+
return framework::pack<decltype(getBinding<Cs>())...>{};
1050+
}(all_columns{}));
10461051

10471052
TableIterator(arrow::ChunkedArray* columnData[sizeof...(C)], IP&& policy)
10481053
: IP{policy},
@@ -1135,7 +1140,7 @@ struct TableIterator : IP, C... {
11351140
template <typename... CL, typename TA>
11361141
void doSetCurrentIndex(framework::pack<CL...>, TA* current)
11371142
{
1138-
(CL::setCurrent(current), ...);
1143+
([&current, this](){ if constexpr (is_index_column<CL> && !is_self_index_column<CL>) {CL::setCurrent(current);} }(), ...);
11391144
}
11401145

11411146
template <typename CL>
@@ -1147,43 +1152,49 @@ struct TableIterator : IP, C... {
11471152
template <typename... Cs>
11481153
auto getIndexBindingsImpl(framework::pack<Cs...>) const
11491154
{
1150-
return std::vector<o2::soa::Binding>{static_cast<Cs const&>(*this).getCurrentRaw()...};
1155+
std::vector<o2::soa::Binding> result;
1156+
([this, &result](){
1157+
if constexpr (is_index_column<Cs> && !is_self_index_column<Cs>) {
1158+
result.emplace_back(static_cast<Cs const&>(*this).getCurrentRaw());
1159+
}
1160+
}(), ...);
1161+
return result;
11511162
}
11521163

11531164
auto getIndexBindings() const
11541165
{
1155-
return getIndexBindingsImpl(external_index_columns_t{});
1166+
return getIndexBindingsImpl(all_columns{});
11561167
}
11571168

11581169
template <typename... TA>
11591170
void bindExternalIndices(TA*... current)
11601171
{
1161-
(doSetCurrentIndex(external_index_columns_t{}, current), ...);
1172+
(doSetCurrentIndex(all_columns{}, current), ...);
11621173
}
11631174

11641175
template <typename... Cs>
11651176
void doSetCurrentIndexRaw(framework::pack<Cs...> p, std::vector<o2::soa::Binding>&& ptrs)
11661177
{
1167-
(Cs::setCurrentRaw(ptrs[framework::has_type_at_v<Cs>(p)]), ...);
1178+
([&ptrs, p, this](){ if constexpr (is_index_column<Cs> && !is_self_index_column<Cs>) { Cs::setCurrentRaw(ptrs[framework::has_type_at_v<Cs>(p)]); } }(), ...);
11681179
}
11691180

11701181
template <typename... Cs, typename I>
11711182
void doSetCurrentInternal(framework::pack<Cs...>, I const* ptr)
11721183
{
11731184
o2::soa::Binding b;
11741185
b.bind(ptr);
1175-
(Cs::setCurrentRaw(b), ...);
1186+
([&ptr, &b, this](){ if constexpr (is_self_index_column<Cs>) { Cs::setCurrentRaw(b); } }(), ...);
11761187
}
11771188

11781189
void bindExternalIndicesRaw(std::vector<o2::soa::Binding>&& ptrs)
11791190
{
1180-
doSetCurrentIndexRaw(external_index_columns_t{}, std::forward<std::vector<o2::soa::Binding>>(ptrs));
1191+
doSetCurrentIndexRaw(all_columns{}, std::forward<std::vector<o2::soa::Binding>>(ptrs));
11811192
}
11821193

11831194
template <typename I>
11841195
void bindInternalIndices(I const* table)
11851196
{
1186-
doSetCurrentInternal(internal_index_columns_t{}, table);
1197+
doSetCurrentInternal(all_columns{}, table);
11871198
}
11881199

11891200
private:
@@ -1367,25 +1378,25 @@ static constexpr std::string getLabelFromTypeForKey(std::string const& key)
13671378
template <typename B, typename... C>
13681379
consteval static bool hasIndexTo(framework::pack<C...>&&)
13691380
{
1370-
return (o2::soa::is_binding_compatible_v<B, typename C::binding_t>() || ...);
1381+
return ([](){ if constexpr (is_index_column<C> && !is_self_index_column<C>) { return o2::soa::is_binding_compatible_v<B, typename C::binding_t>(); } else { return false; } }() || ...);
13711382
}
13721383

13731384
template <typename B, typename... C>
13741385
consteval static bool hasSortedIndexTo(framework::pack<C...>&&)
13751386
{
1376-
return ((C::sorted && o2::soa::is_binding_compatible_v<B, typename C::binding_t>()) || ...);
1387+
return ([](){if constexpr (is_index_column<C> && !is_self_index_column<C>) { return (C::sorted && o2::soa::is_binding_compatible_v<B, typename C::binding_t>()); } else { return false; }}() || ...);
13771388
}
13781389

13791390
template <typename B, typename Z>
13801391
consteval static bool relatedByIndex()
13811392
{
1382-
return hasIndexTo<B>(typename Z::table_t::external_index_columns_t{});
1393+
return hasIndexTo<B>(typename Z::table_t::columns_t{});
13831394
}
13841395

13851396
template <typename B, typename Z>
13861397
consteval static bool relatedBySortedIndex()
13871398
{
1388-
return hasSortedIndexTo<B>(typename Z::table_t::external_index_columns_t{});
1399+
return hasSortedIndexTo<B>(typename Z::table_t::columns_t{});
13891400
}
13901401
} // namespace o2::soa
13911402

@@ -1713,16 +1724,13 @@ class Table
17131724
using persistent_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_persistent_column_t, C...> {}(columns_t{}));
17141725
using column_types = decltype([]<typename... C>(framework::pack<C...>) -> framework::pack<typename C::type...> {}(persistent_columns_t{}));
17151726

1716-
using external_index_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_external_index_t, C...> {}(columns_t{}));
1717-
using internal_index_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_self_index_t, C...> {}(columns_t{}));
17181727
template <typename IP>
17191728
using base_iterator = decltype(base_iter<D, O, IP>(columns_t{}));
17201729

17211730
template <typename IP, typename Parent, typename... T>
17221731
struct TableIteratorBase : base_iterator<IP> {
17231732
using columns_t = typename Parent::columns_t;
1724-
using external_index_columns_t = typename Parent::external_index_columns_t;
1725-
using bindings_pack_t = decltype([]<typename... C>(framework::pack<C...>) -> framework::pack<typename C::binding_t...> {}(external_index_columns_t{}));
1733+
using bindings_pack_t = typename base_iterator<IP>::bindings_pack_t;
17261734
// static constexpr const std::array<TableRef, sizeof...(T)> originals{T::ref...};
17271735
static constexpr auto originals = Parent::originals;
17281736
using policy_t = IP;
@@ -1815,7 +1823,7 @@ class Table
18151823
using decayed = std::decay_t<TI>;
18161824
if constexpr (framework::has_type<decayed>(bindings_pack_t{})) { // index to another table
18171825
constexpr auto idx = framework::has_type_at_v<decayed>(bindings_pack_t{});
1818-
return framework::pack_element_t<idx, external_index_columns_t>::getId();
1826+
return framework::pack_element_t<idx, columns_t>::getId();
18191827
} else if constexpr (std::same_as<decayed, Parent>) { // self index
18201828
return this->globalIndex();
18211829
} else if constexpr (is_indexing_column<decayed>) { // soa::Index<>
@@ -2040,13 +2048,13 @@ class Table
20402048

20412049
void bindInternalIndicesExplicit(o2::soa::Binding binding)
20422050
{
2043-
doBindInternalIndicesExplicit(internal_index_columns_t{}, binding);
2051+
doBindInternalIndicesExplicit(columns_t{}, binding);
20442052
}
20452053

20462054
template <typename... Cs>
20472055
void doBindInternalIndicesExplicit(framework::pack<Cs...>, o2::soa::Binding binding)
20482056
{
2049-
(static_cast<Cs>(mBegin).setCurrentRaw(binding), ...);
2057+
([this, &binding](){ if constexpr (is_self_index_column<Cs>) { static_cast<Cs>(mBegin).setCurrentRaw(binding); } }(), ...);
20502058
}
20512059

20522060
void bindExternalIndicesRaw(std::vector<o2::soa::Binding>&& ptrs)
@@ -2063,7 +2071,7 @@ class Table
20632071
template <typename T>
20642072
void copyIndexBindings(T& dest) const
20652073
{
2066-
doCopyIndexBindings(external_index_columns_t{}, dest);
2074+
doCopyIndexBindings(columns_t{}, dest);
20672075
}
20682076

20692077
auto select(framework::expressions::Filter const& f) const
@@ -3282,7 +3290,6 @@ class FilteredBase : public T
32823290
using T::originals;
32833291
using columns_t = typename T::columns_t;
32843292
using persistent_columns_t = typename T::persistent_columns_t;
3285-
using external_index_columns_t = typename T::external_index_columns_t;
32863293

32873294
using iterator = T::template iterator_template_o<FilteredIndexPolicy, self_t>;
32883295
using unfiltered_iterator = T::template iterator_template_o<DefaultIndexPolicy, self_t>;
@@ -3428,7 +3435,7 @@ class FilteredBase : public T
34283435
template <typename T1>
34293436
void copyIndexBindings(T1& dest) const
34303437
{
3431-
doCopyIndexBindings(external_index_columns_t{}, dest);
3438+
doCopyIndexBindings(columns_t{}, dest);
34323439
}
34333440

34343441
template <typename T1>

Framework/Core/include/Framework/GroupedCombinations.h

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,27 @@ auto interleaveTuples(std::tuple<T1s...>& t1, std::tuple<T2s...>& t2)
3434
return interleaveTuplesImpl(t1, t2, std::index_sequence_for<T1s...>());
3535
}
3636

37+
template <soa::is_index_column T, typename G>
38+
requires(!soa::is_self_index_column<T>)
39+
auto isIndexTo()
40+
{
41+
if constexpr (o2::soa::is_binding_compatible_v<G, typename T::binding_t>()) {
42+
return std::true_type{};
43+
} else {
44+
return std::false_type{};
45+
}
46+
}
47+
48+
template <typename T, typename G>
49+
auto isIndexTo() ->std::false_type {}
50+
3751
template <typename T, typename G>
38-
using is_index_to_g_t = typename std::conditional<o2::soa::is_binding_compatible_v<G, typename T::binding_t>(), std::true_type, std::false_type>::type;
52+
using is_index_to_g_t = decltype(isIndexTo<T, G>());
3953

4054
template <typename G, typename A>
4155
expressions::BindingNode getMatchingIndexNode()
4256
{
43-
using external_index_columns_pack = typename A::external_index_columns_t;
44-
using selected_indices_t = selected_pack_multicondition<is_index_to_g_t, pack<G>, external_index_columns_pack>;
57+
using selected_indices_t = selected_pack_multicondition<is_index_to_g_t, pack<G>, typename A::columns_t>;
4558
static_assert(pack_size(selected_indices_t{}) == 1, "No matching index column from associated to grouping");
4659
using index_column_t = pack_head_t<selected_indices_t>;
4760
return expressions::BindingNode{index_column_t::mLabel, o2::framework::TypeIdHelpers::uniqueId<typename index_column_t::column_t>(), expressions::selectArrowType<typename index_column_t::type>()};

0 commit comments

Comments
 (0)