@@ -213,8 +213,6 @@ template <typename D, typename... Cs>
213213struct 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...>)
@@ -1036,16 +1034,23 @@ concept can_bind = requires(T&& t) {
10361034template <typename... C>
10371035concept has_index = (is_indexing_column<C> || ...);
10381036
1037+ template <is_index_column C>
1038+ requires (!is_self_index_column<C>)
1039+ auto getBinding() -> typename C::binding_t {}
1040+
1041+ template <typename C>
1042+ auto getBinding() -> void {}
1043+
10391044template <typename D, typename O, typename IP, typename... C>
10401045struct TableIterator : IP, C... {
10411046 public:
10421047 using self_t = TableIterator<D, O, IP, C...>;
10431048 using policy_t = IP;
10441049 using all_columns = framework::pack<C...>;
10451050 using persistent_columns_t = framework::selected_pack<soa::is_persistent_column_t, C...>;
1046- using external_index_columns_t = framework::selected_pack<soa::is_external_index_t, C ...>;
1047- using internal_index_columns_t = framework::selected_pack<soa::is_self_index_t, C ...>;
1048- 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 {}));
1051+ using bindings_pack_t = decltype([]<typename... Cs>( framework::pack<Cs ...>) {
1052+ return framework::pack<decltype(getBinding<Cs>()) ...>{} ;
1053+ }(all_columns {}));
10491054
10501055 TableIterator(arrow::ChunkedArray* columnData[sizeof...(C)], IP&& policy)
10511056 : IP{policy},
@@ -1138,7 +1143,7 @@ struct TableIterator : IP, C... {
11381143 template <typename... CL, typename TA>
11391144 void doSetCurrentIndex(framework::pack<CL...>, TA* current)
11401145 {
1141- (CL ::setCurrent(current), ...);
1146+ ([¤t, this](){ if constexpr (is_index_column<CL> && !is_self_index_column<CL>) {CL ::setCurrent(current);} }( ), ...);
11421147 }
11431148
11441149 template <typename CL>
@@ -1150,43 +1155,49 @@ struct TableIterator : IP, C... {
11501155 template <typename... Cs>
11511156 auto getIndexBindingsImpl(framework::pack<Cs...>) const
11521157 {
1153- return std::vector<o2::soa::Binding>{static_cast<Cs const&>(*this).getCurrentRaw()...};
1158+ std::vector<o2::soa::Binding> result;
1159+ ([this, &result](){
1160+ if constexpr (is_index_column<Cs> && !is_self_index_column<Cs>) {
1161+ result.emplace_back(static_cast<Cs const&>(*this).getCurrentRaw());
1162+ }
1163+ }(), ...);
1164+ return result;
11541165 }
11551166
11561167 auto getIndexBindings() const
11571168 {
1158- return getIndexBindingsImpl(external_index_columns_t {});
1169+ return getIndexBindingsImpl(all_columns {});
11591170 }
11601171
11611172 template <typename... TA>
11621173 void bindExternalIndices(TA*... current)
11631174 {
1164- (doSetCurrentIndex(external_index_columns_t {}, current), ...);
1175+ (doSetCurrentIndex(all_columns {}, current), ...);
11651176 }
11661177
11671178 template <typename... Cs>
11681179 void doSetCurrentIndexRaw(framework::pack<Cs...> p, std::vector<o2::soa::Binding>&& ptrs)
11691180 {
1170- (Cs ::setCurrentRaw(ptrs[framework::has_type_at_v<Cs>(p)]), ...);
1181+ ([&ptrs, p, this](){ if constexpr (is_index_column<Cs> && !is_self_index_column<Cs>) { Cs ::setCurrentRaw(ptrs[framework::has_type_at_v<Cs>(p)]); } }( ), ...);
11711182 }
11721183
11731184 template <typename... Cs, typename I>
11741185 void doSetCurrentInternal(framework::pack<Cs...>, I const* ptr)
11751186 {
11761187 o2::soa::Binding b;
11771188 b.bind(ptr);
1178- (Cs ::setCurrentRaw(b), ...);
1189+ ([&ptr, &b, this](){ if constexpr (is_self_index_column<Cs>) { Cs ::setCurrentRaw(b); } }( ), ...);
11791190 }
11801191
11811192 void bindExternalIndicesRaw(std::vector<o2::soa::Binding>&& ptrs)
11821193 {
1183- doSetCurrentIndexRaw(external_index_columns_t {}, std::forward<std::vector<o2::soa::Binding>>(ptrs));
1194+ doSetCurrentIndexRaw(all_columns {}, std::forward<std::vector<o2::soa::Binding>>(ptrs));
11841195 }
11851196
11861197 template <typename I>
11871198 void bindInternalIndices(I const* table)
11881199 {
1189- doSetCurrentInternal(internal_index_columns_t {}, table);
1200+ doSetCurrentInternal(all_columns {}, table);
11901201 }
11911202
11921203 private:
@@ -1370,25 +1381,25 @@ static constexpr std::string getLabelFromTypeForKey(std::string const& key)
13701381template <typename B, typename... C>
13711382consteval static bool hasIndexTo(framework::pack<C...>&&)
13721383{
1373- return (o2::soa::is_binding_compatible_v<B, typename C::binding_t>() || ...);
1384+ 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; } } () || ...);
13741385}
13751386
13761387template <typename B, typename... C>
13771388consteval static bool hasSortedIndexTo(framework::pack<C...>&&)
13781389{
1379- return ((C ::sorted && o2::soa::is_binding_compatible_v<B, typename C::binding_t>()) || ...);
1390+ 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; }}( ) || ...);
13801391}
13811392
13821393template <typename B, typename Z>
13831394consteval static bool relatedByIndex()
13841395{
1385- return hasIndexTo<B>(typename Z::table_t::external_index_columns_t {});
1396+ return hasIndexTo<B>(typename Z::table_t::columns_t {});
13861397}
13871398
13881399template <typename B, typename Z>
13891400consteval static bool relatedBySortedIndex()
13901401{
1391- return hasSortedIndexTo<B>(typename Z::table_t::external_index_columns_t {});
1402+ return hasSortedIndexTo<B>(typename Z::table_t::columns_t {});
13921403}
13931404} // namespace o2::soa
13941405
@@ -1716,16 +1727,13 @@ class Table
17161727 using persistent_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_persistent_column_t, C...> {}(columns_t{}));
17171728 using column_types = decltype([]<typename... C>(framework::pack<C...>) -> framework::pack<typename C::type...> {}(persistent_columns_t{}));
17181729
1719- using external_index_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_external_index_t, C...> {}(columns_t{}));
1720- using internal_index_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_self_index_t, C...> {}(columns_t{}));
17211730 template <typename IP>
17221731 using base_iterator = decltype(base_iter<D, O, IP>(columns_t{}));
17231732
17241733 template <typename IP, typename Parent, typename... T>
17251734 struct TableIteratorBase : base_iterator<IP> {
17261735 using columns_t = typename Parent::columns_t;
1727- using external_index_columns_t = typename Parent::external_index_columns_t;
1728- using bindings_pack_t = decltype([]<typename... C>(framework::pack<C...>) -> framework::pack<typename C::binding_t...> {}(external_index_columns_t{}));
1736+ using bindings_pack_t = typename base_iterator<IP>::bindings_pack_t;
17291737 // static constexpr const std::array<TableRef, sizeof...(T)> originals{T::ref...};
17301738 static constexpr auto originals = Parent::originals;
17311739 using policy_t = IP;
@@ -1818,7 +1826,7 @@ class Table
18181826 using decayed = std::decay_t<TI>;
18191827 if constexpr (framework::has_type<decayed>(bindings_pack_t{})) { // index to another table
18201828 constexpr auto idx = framework::has_type_at_v<decayed>(bindings_pack_t{});
1821- return framework::pack_element_t<idx, external_index_columns_t >::getId();
1829+ return framework::pack_element_t<idx, columns_t >::getId();
18221830 } else if constexpr (std::same_as<decayed, Parent>) { // self index
18231831 return this->globalIndex();
18241832 } else if constexpr (is_indexing_column<decayed>) { // soa::Index<>
@@ -2043,13 +2051,13 @@ class Table
20432051
20442052 void bindInternalIndicesExplicit(o2::soa::Binding binding)
20452053 {
2046- doBindInternalIndicesExplicit(internal_index_columns_t {}, binding);
2054+ doBindInternalIndicesExplicit(columns_t {}, binding);
20472055 }
20482056
20492057 template <typename... Cs>
20502058 void doBindInternalIndicesExplicit(framework::pack<Cs...>, o2::soa::Binding binding)
20512059 {
2052- (static_cast<Cs>(mBegin).setCurrentRaw(binding), ...);
2060+ ([this, &binding](){ if constexpr (is_self_index_column<Cs>) { static_cast<Cs>(mBegin).setCurrentRaw(binding); } }( ), ...);
20532061 }
20542062
20552063 void bindExternalIndicesRaw(std::vector<o2::soa::Binding>&& ptrs)
@@ -2066,7 +2074,7 @@ class Table
20662074 template <typename T>
20672075 void copyIndexBindings(T& dest) const
20682076 {
2069- doCopyIndexBindings(external_index_columns_t {}, dest);
2077+ doCopyIndexBindings(columns_t {}, dest);
20702078 }
20712079
20722080 auto select(framework::expressions::Filter const& f) const
@@ -3343,7 +3351,6 @@ class FilteredBase : public T
33433351 using T::originals;
33443352 using columns_t = typename T::columns_t;
33453353 using persistent_columns_t = typename T::persistent_columns_t;
3346- using external_index_columns_t = typename T::external_index_columns_t;
33473354
33483355 using iterator = T::template iterator_template_o<FilteredIndexPolicy, self_t>;
33493356 using unfiltered_iterator = T::template iterator_template_o<DefaultIndexPolicy, self_t>;
@@ -3489,7 +3496,7 @@ class FilteredBase : public T
34893496 template <typename T1>
34903497 void copyIndexBindings(T1& dest) const
34913498 {
3492- doCopyIndexBindings(external_index_columns_t {}, dest);
3499+ doCopyIndexBindings(columns_t {}, dest);
34933500 }
34943501
34953502 template <typename T1>
0 commit comments