@@ -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