@@ -742,12 +742,40 @@ struct RowViewCore : public IP, C... {
742742 (CL::setCurrent (current), ...);
743743 }
744744
745+ template <typename CL>
746+ auto getCurrent () const
747+ {
748+ return CL::getCurrentRaw ();
749+ }
750+
751+ template <typename ... Cs>
752+ auto getIndexBindingsImpl (framework::pack<Cs...>) const
753+ {
754+ return std::vector<void *>{static_cast <Cs const &>(*this ).getCurrentRaw ()...};
755+ }
756+
757+ auto getIndexBindings () const
758+ {
759+ return getIndexBindingsImpl (external_index_columns_t {});
760+ }
761+
745762 template <typename ... TA>
746763 void bindExternalIndices (TA*... current)
747764 {
748765 (doSetCurrentIndex (external_index_columns_t {}, current), ...);
749766 }
750767
768+ template <typename ... Cs>
769+ void doSetCurrentIndexRaw (framework::pack<Cs...> p, std::vector<void *>&& ptrs)
770+ {
771+ (Cs::setCurrentRaw (ptrs[framework::has_type_at_v<Cs>(p)]), ...);
772+ }
773+
774+ void bindExternalIndicesRaw (std::vector<void *>&& ptrs)
775+ {
776+ doSetCurrentIndexRaw (external_index_columns_t {}, std::forward<std::vector<void *>>(ptrs));
777+ }
778+
751779 private:
752780 // / Helper to move to the correct chunk, if needed.
753781 // / FIXME: not needed?
@@ -848,6 +876,7 @@ class Table
848876 using columns = framework::pack<C...>;
849877 using column_types = framework::pack<typename C::type...>;
850878 using persistent_columns_t = framework::selected_pack<is_persistent_t , C...>;
879+ using external_index_columns_t = framework::selected_pack<is_external_index_t , C...>;
851880
852881 template <typename IP, typename Parent, typename ... T>
853882 struct RowViewBase : public RowViewCore <IP, C...> {
@@ -1030,9 +1059,28 @@ class Table
10301059 mBegin .bindExternalIndices (current...);
10311060 }
10321061
1062+ void bindExternalIndicesRaw (std::vector<void *>&& ptrs)
1063+ {
1064+ mBegin .bindExternalIndicesRaw (std::forward<std::vector<void *>>(ptrs));
1065+ }
1066+
1067+ template <typename T, typename ... Cs>
1068+ void doCopyIndexBindings (framework::pack<Cs...>, T& dest) const
1069+ {
1070+ dest.bindExternalIndicesRaw (mBegin .getIndexBindings ());
1071+ }
1072+
1073+ template <typename T>
1074+ void copyIndexBindings (T& dest) const
1075+ {
1076+ doCopyIndexBindings (external_index_columns_t {}, dest);
1077+ }
1078+
10331079 auto select (framework::expressions::Filter&& f) const
10341080 {
1035- return o2::soa::select (*this , std::forward<framework::expressions::Filter>(f));
1081+ auto t = o2::soa::select (*this , std::forward<framework::expressions::Filter>(f));
1082+ copyIndexBindings (t);
1083+ return t;
10361084 }
10371085
10381086 private:
@@ -1300,7 +1348,14 @@ constexpr auto is_binding_compatible_v()
13001348 } \
13011349 return false ; \
13021350 } \
1303- binding_t * getCurrent () { return static_cast <binding_t *>(mBinding ); } \
1351+ \
1352+ bool setCurrentRaw (void * current) \
1353+ { \
1354+ this ->mBinding = current; \
1355+ return true ; \
1356+ } \
1357+ binding_t * getCurrent () const { return static_cast <binding_t *>(mBinding ); } \
1358+ void * getCurrentRaw () const { return mBinding ; } \
13041359 void * mBinding = nullptr ; \
13051360 }; \
13061361 static const o2::framework::expressions::BindingNode _Getter_##Id { _Label_, \
@@ -1535,6 +1590,7 @@ class FilteredPolicy : public T
15351590 using originals = originals_pack_t <T>;
15361591 using table_t = typename T::table_t ;
15371592 using persistent_columns_t = typename T::persistent_columns_t ;
1593+ using external_index_columns_t = typename T::external_index_columns_t ;
15381594
15391595 template <typename P, typename ... Os>
15401596 constexpr static auto make_it (framework::pack<Os...> const &)
@@ -1625,6 +1681,23 @@ class FilteredPolicy : public T
16251681 mFilteredBegin .bindExternalIndices (current...);
16261682 }
16271683
1684+ void bindExternalIndicesRaw (std::vector<void *>&& ptrs)
1685+ {
1686+ mFilteredBegin .bindExternalIndicesRaw (std::forward<std::vector<void *>>(ptrs));
1687+ }
1688+
1689+ template <typename T1, typename ... Cs>
1690+ void doCopyIndexBindings (framework::pack<Cs...>, T1& dest) const
1691+ {
1692+ dest.bindExternalIndicesRaw (mFilteredBegin .getIndexBindings ());
1693+ }
1694+
1695+ template <typename T1>
1696+ void copyIndexBindings (T1& dest) const
1697+ {
1698+ doCopyIndexBindings (external_index_columns_t {}, dest);
1699+ }
1700+
16281701 protected:
16291702 void sumWithSelection (SelectionVector const & selection)
16301703 {
0 commit comments