@@ -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...>)
@@ -806,9 +804,6 @@ concept is_dynamic_column = requires(C& c) {
806804template <typename C>
807805concept is_marker_column = requires { &C::mark; };
808806
809- template <typename T>
810- using is_dynamic_t = std::conditional_t <is_dynamic_column<T>, std::true_type, std::false_type>;
811-
812807template <typename T>
813808concept is_column = is_persistent_column<T> || is_dynamic_column<T> || is_indexing_column<T> || is_marker_column<T>;
814809
@@ -1031,16 +1026,27 @@ concept can_bind = requires(T&& t) {
10311026template <typename ... C>
10321027concept has_index = (is_indexing_column<C> || ...);
10331028
1029+ template <is_index_column C>
1030+ requires (!is_self_index_column<C>)
1031+ consteval auto getBinding () -> typename C::binding_t
1032+ {
1033+ }
1034+
1035+ template <typename C>
1036+ consteval auto getBinding () -> void
1037+ {
1038+ }
1039+
10341040template <typename D, typename O, typename IP, typename ... C>
10351041struct TableIterator : IP, C... {
10361042 public:
10371043 using self_t = TableIterator<D, O, IP, C...>;
10381044 using policy_t = IP;
10391045 using all_columns = framework::pack<C...>;
10401046 using persistent_columns_t = framework::selected_pack<soa::is_persistent_column_t , C...>;
1041- using external_index_columns_t = framework::selected_pack<soa:: is_external_index_t , C ...>;
1042- using internal_index_columns_t = framework::selected_pack<soa:: is_self_index_t , C ...>;
1043- 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 {}));
1047+ using bindings_pack_t = decltype ([]< typename ... Cs>( framework::pack<Cs ...>) {
1048+ return framework::pack< decltype (getBinding<Cs>()) ...>{} ;
1049+ }(all_columns {}));
10441050
10451051 TableIterator (arrow::ChunkedArray* columnData[sizeof ...(C)], IP&& policy)
10461052 : IP{policy},
@@ -1133,7 +1139,13 @@ struct TableIterator : IP, C... {
11331139 template <typename ... CL, typename TA>
11341140 void doSetCurrentIndex (framework::pack<CL...>, TA* current)
11351141 {
1136- (CL::setCurrent (current), ...);
1142+ (framework::overloaded{
1143+ [¤t, this ]<is_index_column CI>
1144+ requires (!is_self_index_column<CI>)
1145+ () { CI::setCurrent (current); },
1146+ []<typename CI>() {}}
1147+ .template operator ()<CL>(),
1148+ ...);
11371149 }
11381150
11391151 template <typename CL>
@@ -1145,43 +1157,63 @@ struct TableIterator : IP, C... {
11451157 template <typename ... Cs>
11461158 auto getIndexBindingsImpl (framework::pack<Cs...>) const
11471159 {
1148- return std::vector<o2::soa::Binding>{static_cast <Cs const &>(*this ).getCurrentRaw ()...};
1160+ std::vector<o2::soa::Binding> result;
1161+ (framework::overloaded{
1162+ [this , &result]<is_index_column CI>
1163+ requires (!is_self_index_column<CI>)
1164+ () mutable {
1165+ result.emplace_back (CI::getCurrentRaw ());
1166+ },
1167+ []<typename CI>() {}}
1168+ .template operator ()<Cs>(),
1169+ ...);
1170+ return result;
11491171 }
11501172
11511173 auto getIndexBindings () const
11521174 {
1153- return getIndexBindingsImpl (external_index_columns_t {});
1175+ return getIndexBindingsImpl (all_columns {});
11541176 }
11551177
11561178 template <typename ... TA>
11571179 void bindExternalIndices (TA*... current)
11581180 {
1159- (doSetCurrentIndex (external_index_columns_t {}, current), ...);
1181+ (doSetCurrentIndex (all_columns {}, current), ...);
11601182 }
11611183
11621184 template <typename ... Cs>
11631185 void doSetCurrentIndexRaw (framework::pack<Cs...> p, std::vector<o2::soa::Binding>&& ptrs)
11641186 {
1165- (Cs::setCurrentRaw (ptrs[framework::has_type_at_v<Cs>(p)]), ...);
1187+ (framework::overloaded{
1188+ [&ptrs, p, this ]<is_self_index_column CI>
1189+ requires (!is_self_index_column<CI>)
1190+ () { CI::setCurrentRaw (ptrs[framework::has_type_at_v<CI>(p)]); },
1191+ []<typename CI>() {}}
1192+ .template operator ()<Cs>(),
1193+ ...);
11661194 }
11671195
11681196 template <typename ... Cs, typename I>
11691197 void doSetCurrentInternal (framework::pack<Cs...>, I const * ptr)
11701198 {
11711199 o2::soa::Binding b;
11721200 b.bind (ptr);
1173- (Cs::setCurrentRaw (b), ...);
1201+ (framework::overloaded{
1202+ [&ptr, &b, this ]<is_self_index_column CI>() { CI::setCurrentRaw (b); },
1203+ []<typename CI>() {}}
1204+ .template operator ()<Cs>(),
1205+ ...);
11741206 }
11751207
11761208 void bindExternalIndicesRaw (std::vector<o2::soa::Binding>&& ptrs)
11771209 {
1178- doSetCurrentIndexRaw (external_index_columns_t {}, std::forward<std::vector<o2::soa::Binding>>(ptrs));
1210+ doSetCurrentIndexRaw (all_columns {}, std::forward<std::vector<o2::soa::Binding>>(ptrs));
11791211 }
11801212
11811213 template <typename I>
11821214 void bindInternalIndices (I const * table)
11831215 {
1184- doSetCurrentInternal (internal_index_columns_t {}, table);
1216+ doSetCurrentInternal (all_columns {}, table);
11851217 }
11861218
11871219 private:
@@ -1365,25 +1397,37 @@ static constexpr std::string getLabelFromTypeForKey(std::string const& key)
13651397template <typename B, typename ... C>
13661398consteval static bool hasIndexTo (framework::pack<C...>&&)
13671399{
1368- return (o2::soa::is_binding_compatible_v<B, typename C::binding_t >() || ...);
1400+ return (framework::overloaded{
1401+ []<is_index_column CI>
1402+ requires (!is_self_index_column<CI>)
1403+ () { return o2::soa::is_binding_compatible_v<B, typename CI::binding_t >(); },
1404+ []<typename CI>() { return false ; }}
1405+ .template operator ()<C>() ||
1406+ ...);
13691407}
13701408
13711409template <typename B, typename ... C>
13721410consteval static bool hasSortedIndexTo (framework::pack<C...>&&)
13731411{
1374- return ((C::sorted && o2::soa::is_binding_compatible_v<B, typename C::binding_t >()) || ...);
1412+ return (framework::overloaded{
1413+ []<is_index_column CI>
1414+ requires (!is_self_index_column<CI>)
1415+ () { return (CI::sorted && o2::soa::is_binding_compatible_v<B, typename CI::binding_t >()); },
1416+ []<typename CI>() {}}
1417+ .template operator ()<C>() ||
1418+ ...);
13751419}
13761420
13771421template <typename B, typename Z>
13781422consteval static bool relatedByIndex ()
13791423{
1380- return hasIndexTo<B>(typename Z::table_t ::external_index_columns_t {});
1424+ return hasIndexTo<B>(typename Z::table_t ::columns_t {});
13811425}
13821426
13831427template <typename B, typename Z>
13841428consteval static bool relatedBySortedIndex ()
13851429{
1386- return hasSortedIndexTo<B>(typename Z::table_t ::external_index_columns_t {});
1430+ return hasSortedIndexTo<B>(typename Z::table_t ::columns_t {});
13871431}
13881432} // namespace o2::soa
13891433
@@ -1726,16 +1770,13 @@ class Table
17261770 using persistent_columns_t = decltype ([]<typename ... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_persistent_column_t , C...> {}(columns_t {}));
17271771 using column_types = decltype ([]<typename ... C>(framework::pack<C...>) -> framework::pack<typename C::type...> {}(persistent_columns_t {}));
17281772
1729- using external_index_columns_t = decltype ([]<typename ... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_external_index_t , C...> {}(columns_t {}));
1730- using internal_index_columns_t = decltype ([]<typename ... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_self_index_t , C...> {}(columns_t {}));
17311773 template <typename IP>
17321774 using base_iterator = decltype (base_iter<D, O, IP>(columns_t {}));
17331775
17341776 template <typename IP, typename Parent, typename ... T>
17351777 struct TableIteratorBase : base_iterator<IP> {
17361778 using columns_t = typename Parent::columns_t ;
1737- using external_index_columns_t = typename Parent::external_index_columns_t ;
1738- using bindings_pack_t = decltype ([]<typename ... C>(framework::pack<C...>) -> framework::pack<typename C::binding_t ...> {}(external_index_columns_t {}));
1779+ using bindings_pack_t = typename base_iterator<IP>::bindings_pack_t ;
17391780 // static constexpr const std::array<TableRef, sizeof...(T)> originals{T::ref...};
17401781 static constexpr auto originals = Parent::originals;
17411782 using policy_t = IP;
@@ -1828,7 +1869,7 @@ class Table
18281869 using decayed = std::decay_t <TI>;
18291870 if constexpr (framework::has_type<decayed>(bindings_pack_t {})) { // index to another table
18301871 constexpr auto idx = framework::has_type_at_v<decayed>(bindings_pack_t {});
1831- return framework::pack_element_t <idx, external_index_columns_t >::getId ();
1872+ return framework::pack_element_t <idx, columns_t >::getId ();
18321873 } else if constexpr (std::same_as<decayed, Parent>) { // self index
18331874 return this ->globalIndex ();
18341875 } else if constexpr (is_indexing_column<decayed>) { // soa::Index<>
@@ -1838,20 +1879,17 @@ class Table
18381879 }
18391880 }
18401881
1841- template <typename CD, typename ... CDArgs>
1882+ template <soa::is_dynamic_column CD, typename ... CDArgs>
18421883 auto getDynamicColumn () const
18431884 {
1844- using decayed = std::decay_t <CD>;
1845- static_assert (is_dynamic_t <decayed>(), " Requested column is not a dynamic column" );
1846- return static_cast <decayed>(*this ).template getDynamicValue <CDArgs...>();
1885+ return static_cast <std::decay_t <CD>>(*this ).template getDynamicValue <CDArgs...>();
18471886 }
18481887
18491888 template <typename B, typename CC>
1889+ requires (is_dynamic_column<CC> || is_persistent_column<CC>)
18501890 auto getValue () const
18511891 {
1852- using COL = std::decay_t <CC>;
1853- static_assert (is_dynamic_t <COL>() || soa::is_persistent_column<COL>, " Should be persistent or dynamic column with no argument that has a return type convertable to float" );
1854- return static_cast <B>(static_cast <COL>(*this ).get ());
1892+ return static_cast <B>(static_cast <std::decay_t <CC>>(*this ).get ());
18551893 }
18561894
18571895 template <typename B, typename ... CCs>
@@ -2056,13 +2094,17 @@ class Table
20562094
20572095 void bindInternalIndicesExplicit (o2::soa::Binding binding)
20582096 {
2059- doBindInternalIndicesExplicit (internal_index_columns_t {}, binding);
2097+ doBindInternalIndicesExplicit (columns_t {}, binding);
20602098 }
20612099
20622100 template <typename ... Cs>
20632101 void doBindInternalIndicesExplicit (framework::pack<Cs...>, o2::soa::Binding binding)
20642102 {
2065- (static_cast <Cs>(mBegin ).setCurrentRaw (binding), ...);
2103+ (framework::overloaded{
2104+ [this , &binding]<is_self_index_column CI>() { static_cast <CI>(mBegin ).setCurrentRaw (binding); },
2105+ []<typename CI>() {}}
2106+ .template operator ()<Cs>(),
2107+ ...);
20662108 }
20672109
20682110 void bindExternalIndicesRaw (std::vector<o2::soa::Binding>&& ptrs)
@@ -2079,7 +2121,7 @@ class Table
20792121 template <typename T>
20802122 void copyIndexBindings (T& dest) const
20812123 {
2082- doCopyIndexBindings (external_index_columns_t {}, dest);
2124+ doCopyIndexBindings (columns_t {}, dest);
20832125 }
20842126
20852127 auto select (framework::expressions::Filter const & f) const
@@ -3298,7 +3340,6 @@ class FilteredBase : public T
32983340 using T::originals;
32993341 using columns_t = typename T::columns_t ;
33003342 using persistent_columns_t = typename T::persistent_columns_t ;
3301- using external_index_columns_t = typename T::external_index_columns_t ;
33023343
33033344 using iterator = T::template iterator_template_o<FilteredIndexPolicy, self_t >;
33043345 using unfiltered_iterator = T::template iterator_template_o<DefaultIndexPolicy, self_t >;
@@ -3444,7 +3485,7 @@ class FilteredBase : public T
34443485 template <typename T1>
34453486 void copyIndexBindings (T1& dest) const
34463487 {
3447- doCopyIndexBindings (external_index_columns_t {}, dest);
3488+ doCopyIndexBindings (columns_t {}, dest);
34483489 }
34493490
34503491 template <typename T1>
0 commit comments