@@ -405,15 +405,15 @@ class Table;
405405// / Type-checking index column binding
406406struct Binding {
407407 void const * ptr = nullptr ;
408- uint32_t hash = 0 ;
409- // std::span<TableRef const> refs;
408+ size_t hash = 0 ;
409+ std::span<TableRef const > refs;
410410
411411 template <typename T>
412412 void bind (T const * table)
413413 {
414414 ptr = table;
415415 hash = o2::framework::TypeIdHelpers::uniqueId<T>();
416- // refs = std::span{T::originals};
416+ refs = std::span{T::originals};
417417 }
418418
419419 template <typename T>
@@ -1293,9 +1293,6 @@ struct ArrowHelpers {
12931293template <typename T>
12941294concept is_iterator = framework::base_of_template<TableIterator, T> || framework::specialization_of_template<TableIterator, T>;
12951295
1296- template <typename T>
1297- concept is_table_or_iterator = is_table<T> || is_iterator<T>;
1298-
12991296template <typename T>
13001297concept with_originals = requires {
13011298 T::originals.size ();
@@ -2727,7 +2724,7 @@ consteval auto getIndexTargets()
27272724 return !(*mColumnIterator ).empty (); \
27282725 } \
27292726 \
2730- template <soa::is_table T> \
2727+ template <typename T> \
27312728 auto _Getter_##_as() const \
27322729 { \
27332730 if (O2_BUILTIN_UNLIKELY (mBinding .ptr == nullptr )) { \
@@ -2737,15 +2734,10 @@ consteval auto getIndexTargets()
27372734 if (O2_BUILTIN_UNLIKELY (t == nullptr )) { \
27382735 o2::soa::dereferenceWithWrongType (#_Getter_, #_Table_); \
27392736 } \
2740- auto result = std::vector<typename T::unfiltered_iterator>(); \
2741- result.reserve ((*mColumnIterator ).size ()); \
2742- for (auto & i : *mColumnIterator ) { \
2743- result.emplace_back (t->rawIteratorAt (i)); \
2744- } \
2745- return result; \
2737+ return getIterators<T>(); \
27462738 } \
27472739 \
2748- template <soa::is_filtered_table T> \
2740+ template <typename T> \
27492741 auto filtered_##_Getter_##_as() const \
27502742 { \
27512743 if (O2_BUILTIN_UNLIKELY (mBinding .ptr == nullptr )) { \
@@ -2755,17 +2747,37 @@ consteval auto getIndexTargets()
27552747 if (O2_BUILTIN_UNLIKELY (t == nullptr )) { \
27562748 o2::soa::dereferenceWithWrongType (#_Getter_, #_Table_); \
27572749 } \
2758- auto result = std::vector<typename T::iterator>(); \
2759- result.reserve ((*mColumnIterator ).size ()); \
2760- for (auto const & i : *mColumnIterator ) { \
2761- auto pos = t->isInSelectedRows (i); \
2762- if (pos > 0 ) { \
2763- result.emplace_back (t->iteratorAt (pos)); \
2764- } \
2750+ return getFilteredIterators<T>(); \
2751+ } \
2752+ \
2753+ template <typename T> \
2754+ auto getIterators () const \
2755+ { \
2756+ auto result = std::vector<typename T::unfiltered_iterator>(); \
2757+ for (auto & i : *mColumnIterator ) { \
2758+ result.push_back (mBinding .get <T>()->rawIteratorAt (i)); \
27652759 } \
27662760 return result; \
27672761 } \
27682762 \
2763+ template <typename T> \
2764+ std::vector<typename T::iterator> getFilteredIterators () const \
2765+ { \
2766+ if constexpr (o2::soa::is_filtered_table<T>) { \
2767+ auto result = std::vector<typename T::iterator>(); \
2768+ for (auto const & i : *mColumnIterator ) { \
2769+ auto pos = mBinding .get <T>()->isInSelectedRows (i); \
2770+ if (pos > 0 ) { \
2771+ result.emplace_back (mBinding .get <T>()->iteratorAt (pos)); \
2772+ } \
2773+ } \
2774+ return result; \
2775+ } else { \
2776+ static_assert (o2::framework::always_static_assert_v<T>, " T is not a Filtered type" ); \
2777+ } \
2778+ return {}; \
2779+ } \
2780+ \
27692781 auto _Getter_ () const \
27702782 { \
27712783 return _Getter_##_as<binding_t >(); \
@@ -3078,9 +3090,15 @@ consteval auto getIndexTargets()
30783090 if (O2_BUILTIN_UNLIKELY (t == nullptr )) { \
30793091 o2::soa::dereferenceWithWrongType (#_Getter_, " self" ); \
30803092 } \
3093+ return getIterators<T>(); \
3094+ } \
3095+ \
3096+ template <typename T> \
3097+ auto getIterators () const \
3098+ { \
30813099 auto result = std::vector<typename T::unfiltered_iterator>(); \
30823100 for (auto & i : *mColumnIterator ) { \
3083- result.push_back (t ->rawIteratorAt (i)); \
3101+ result.push_back (mBinding . get <T>() ->rawIteratorAt (i)); \
30843102 } \
30853103 return result; \
30863104 } \
0 commit comments