@@ -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...>)
@@ -1033,16 +1031,23 @@ concept can_bind = requires(T&& t) {
10331031template <typename ... C>
10341032concept 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+
10361041template <typename D, typename O, typename IP, typename ... C>
10371042struct 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+ ([¤t, 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)
13671378template <typename B, typename ... C>
13681379consteval 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
13731384template <typename B, typename ... C>
13741385consteval 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
13791390template <typename B, typename Z>
13801391consteval 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
13851396template <typename B, typename Z>
13861397consteval 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>
0 commit comments