@@ -208,8 +208,6 @@ template <typename D, typename... Cs>
208208struct TableMetadata {
209209 using columns = framework::pack<Cs...>;
210210 using persistent_columns_t = framework::selected_pack<soa::is_persistent_column_t , Cs...>;
211- using external_index_columns_t = framework::selected_pack<soa::is_external_index_t , Cs...>;
212- using internal_index_columns_t = framework::selected_pack<soa::is_self_index_t , Cs...>;
213211
214212 template <typename Key, typename ... PCs>
215213 static consteval std::array<bool , sizeof ...(PCs)> getMap (framework::pack<PCs...>)
@@ -1028,16 +1026,23 @@ concept can_bind = requires(T&& t) {
10281026template <typename ... C>
10291027concept has_index = (is_indexing_column<C> || ...);
10301028
1029+ template <is_index_column C>
1030+ requires (!is_self_index_column<C>)
1031+ auto getBinding () -> typename C::binding_t {}
1032+
1033+ template <typename C>
1034+ auto getBinding () -> void {}
1035+
10311036template <typename D, typename O, typename IP, typename ... C>
10321037struct TableIterator : IP, C... {
10331038 public:
10341039 using self_t = TableIterator<D, O, IP, C...>;
10351040 using policy_t = IP;
10361041 using all_columns = framework::pack<C...>;
10371042 using persistent_columns_t = framework::selected_pack<soa::is_persistent_column_t , C...>;
1038- using external_index_columns_t = framework::selected_pack<soa:: is_external_index_t , C ...>;
1039- using internal_index_columns_t = framework::selected_pack<soa:: is_self_index_t , C ...>;
1040- 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 {}));
1043+ using bindings_pack_t = decltype ([]< typename ... Cs>( framework::pack<Cs ...>) {
1044+ return framework::pack< decltype (getBinding<Cs>()) ...>{} ;
1045+ }(all_columns {}));
10411046
10421047 TableIterator (arrow::ChunkedArray* columnData[sizeof ...(C)], IP&& policy)
10431048 : IP{policy},
@@ -1130,7 +1135,7 @@ struct TableIterator : IP, C... {
11301135 template <typename ... CL, typename TA>
11311136 void doSetCurrentIndex (framework::pack<CL...>, TA* current)
11321137 {
1133- (CL ::setCurrent (current), ...);
1138+ ([¤t, this ](){ if constexpr (is_index_column<CL> && !is_self_index_column<CL>) { CL ::setCurrent (current);} }( ), ...);
11341139 }
11351140
11361141 template <typename CL>
@@ -1142,43 +1147,49 @@ struct TableIterator : IP, C... {
11421147 template <typename ... Cs>
11431148 auto getIndexBindingsImpl (framework::pack<Cs...>) const
11441149 {
1145- return std::vector<o2::soa::Binding>{static_cast <Cs const &>(*this ).getCurrentRaw ()...};
1150+ std::vector<o2::soa::Binding> result;
1151+ ([this , &result](){
1152+ if constexpr (is_index_column<Cs> && !is_self_index_column<Cs>) {
1153+ result.emplace_back (static_cast <Cs const &>(*this ).getCurrentRaw ());
1154+ }
1155+ }(), ...);
1156+ return result;
11461157 }
11471158
11481159 auto getIndexBindings () const
11491160 {
1150- return getIndexBindingsImpl (external_index_columns_t {});
1161+ return getIndexBindingsImpl (all_columns {});
11511162 }
11521163
11531164 template <typename ... TA>
11541165 void bindExternalIndices (TA*... current)
11551166 {
1156- (doSetCurrentIndex (external_index_columns_t {}, current), ...);
1167+ (doSetCurrentIndex (all_columns {}, current), ...);
11571168 }
11581169
11591170 template <typename ... Cs>
11601171 void doSetCurrentIndexRaw (framework::pack<Cs...> p, std::vector<o2::soa::Binding>&& ptrs)
11611172 {
1162- (Cs ::setCurrentRaw (ptrs[framework::has_type_at_v<Cs>(p)]), ...);
1173+ ([&ptrs, p, this ](){ if constexpr (is_index_column<Cs> && !is_self_index_column<Cs>) { Cs ::setCurrentRaw (ptrs[framework::has_type_at_v<Cs>(p)]); } }( ), ...);
11631174 }
11641175
11651176 template <typename ... Cs, typename I>
11661177 void doSetCurrentInternal (framework::pack<Cs...>, I const * ptr)
11671178 {
11681179 o2::soa::Binding b;
11691180 b.bind (ptr);
1170- (Cs ::setCurrentRaw (b), ...);
1181+ ([&ptr, &b, this ](){ if constexpr (is_self_index_column<Cs>) { Cs ::setCurrentRaw (b); } }( ), ...);
11711182 }
11721183
11731184 void bindExternalIndicesRaw (std::vector<o2::soa::Binding>&& ptrs)
11741185 {
1175- doSetCurrentIndexRaw (external_index_columns_t {}, std::forward<std::vector<o2::soa::Binding>>(ptrs));
1186+ doSetCurrentIndexRaw (all_columns {}, std::forward<std::vector<o2::soa::Binding>>(ptrs));
11761187 }
11771188
11781189 template <typename I>
11791190 void bindInternalIndices (I const * table)
11801191 {
1181- doSetCurrentInternal (internal_index_columns_t {}, table);
1192+ doSetCurrentInternal (all_columns {}, table);
11821193 }
11831194
11841195 private:
@@ -1362,25 +1373,25 @@ static constexpr std::string getLabelFromTypeForKey(std::string const& key)
13621373template <typename B, typename ... C>
13631374consteval static bool hasIndexTo (framework::pack<C...>&&)
13641375{
1365- return (o2::soa::is_binding_compatible_v<B, typename C::binding_t >() || ...);
1376+ 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 ; } } () || ...);
13661377}
13671378
13681379template <typename B, typename ... C>
13691380consteval static bool hasSortedIndexTo (framework::pack<C...>&&)
13701381{
1371- return ((C ::sorted && o2::soa::is_binding_compatible_v<B, typename C::binding_t >()) || ...);
1382+ 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 ; }}( ) || ...);
13721383}
13731384
13741385template <typename B, typename Z>
13751386consteval static bool relatedByIndex ()
13761387{
1377- return hasIndexTo<B>(typename Z::table_t ::external_index_columns_t {});
1388+ return hasIndexTo<B>(typename Z::table_t ::columns_t {});
13781389}
13791390
13801391template <typename B, typename Z>
13811392consteval static bool relatedBySortedIndex ()
13821393{
1383- return hasSortedIndexTo<B>(typename Z::table_t ::external_index_columns_t {});
1394+ return hasSortedIndexTo<B>(typename Z::table_t ::columns_t {});
13841395}
13851396} // namespace o2::soa
13861397
@@ -1723,16 +1734,13 @@ class Table
17231734 using persistent_columns_t = decltype ([]<typename ... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_persistent_column_t , C...> {}(columns_t {}));
17241735 using column_types = decltype ([]<typename ... C>(framework::pack<C...>) -> framework::pack<typename C::type...> {}(persistent_columns_t {}));
17251736
1726- using external_index_columns_t = decltype ([]<typename ... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_external_index_t , C...> {}(columns_t {}));
1727- using internal_index_columns_t = decltype ([]<typename ... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_self_index_t , C...> {}(columns_t {}));
17281737 template <typename IP>
17291738 using base_iterator = decltype (base_iter<D, O, IP>(columns_t {}));
17301739
17311740 template <typename IP, typename Parent, typename ... T>
17321741 struct TableIteratorBase : base_iterator<IP> {
17331742 using columns_t = typename Parent::columns_t ;
1734- using external_index_columns_t = typename Parent::external_index_columns_t ;
1735- using bindings_pack_t = decltype ([]<typename ... C>(framework::pack<C...>) -> framework::pack<typename C::binding_t ...> {}(external_index_columns_t {}));
1743+ using bindings_pack_t = typename base_iterator<IP>::bindings_pack_t ;
17361744 // static constexpr const std::array<TableRef, sizeof...(T)> originals{T::ref...};
17371745 static constexpr auto originals = Parent::originals;
17381746 using policy_t = IP;
@@ -1825,7 +1833,7 @@ class Table
18251833 using decayed = std::decay_t <TI>;
18261834 if constexpr (framework::has_type<decayed>(bindings_pack_t {})) { // index to another table
18271835 constexpr auto idx = framework::has_type_at_v<decayed>(bindings_pack_t {});
1828- return framework::pack_element_t <idx, external_index_columns_t >::getId ();
1836+ return framework::pack_element_t <idx, columns_t >::getId ();
18291837 } else if constexpr (std::same_as<decayed, Parent>) { // self index
18301838 return this ->globalIndex ();
18311839 } else if constexpr (is_indexing_column<decayed>) { // soa::Index<>
@@ -2050,13 +2058,13 @@ class Table
20502058
20512059 void bindInternalIndicesExplicit (o2::soa::Binding binding)
20522060 {
2053- doBindInternalIndicesExplicit (internal_index_columns_t {}, binding);
2061+ doBindInternalIndicesExplicit (columns_t {}, binding);
20542062 }
20552063
20562064 template <typename ... Cs>
20572065 void doBindInternalIndicesExplicit (framework::pack<Cs...>, o2::soa::Binding binding)
20582066 {
2059- (static_cast <Cs>(mBegin ).setCurrentRaw (binding), ...);
2067+ ([ this , &binding](){ if constexpr (is_self_index_column<Cs>) { static_cast <Cs>(mBegin ).setCurrentRaw (binding); } }( ), ...);
20602068 }
20612069
20622070 void bindExternalIndicesRaw (std::vector<o2::soa::Binding>&& ptrs)
@@ -2073,7 +2081,7 @@ class Table
20732081 template <typename T>
20742082 void copyIndexBindings (T& dest) const
20752083 {
2076- doCopyIndexBindings (external_index_columns_t {}, dest);
2084+ doCopyIndexBindings (columns_t {}, dest);
20772085 }
20782086
20792087 auto select (framework::expressions::Filter const & f) const
@@ -3292,7 +3300,6 @@ class FilteredBase : public T
32923300 using T::originals;
32933301 using columns_t = typename T::columns_t ;
32943302 using persistent_columns_t = typename T::persistent_columns_t ;
3295- using external_index_columns_t = typename T::external_index_columns_t ;
32963303
32973304 using iterator = T::template iterator_template_o<FilteredIndexPolicy, self_t >;
32983305 using unfiltered_iterator = T::template iterator_template_o<DefaultIndexPolicy, self_t >;
@@ -3438,7 +3445,7 @@ class FilteredBase : public T
34383445 template <typename T1>
34393446 void copyIndexBindings (T1& dest) const
34403447 {
3441- doCopyIndexBindings (external_index_columns_t {}, dest);
3448+ doCopyIndexBindings (columns_t {}, dest);
34423449 }
34433450
34443451 template <typename T1>
0 commit comments