@@ -1042,16 +1042,19 @@ consteval auto getBinding() -> void
10421042{
10431043}
10441044
1045+ template <typename T, typename ... Cs>
1046+ consteval auto inBindings (framework::pack<Cs...>)
1047+ {
1048+ return framework::has_type_at_v<T>(framework::pack<decltype (getBinding<Cs>())...>{});
1049+ }
1050+
10451051template <typename D, typename O, typename IP, typename ... C>
10461052struct TableIterator : IP, C... {
10471053 public:
10481054 using self_t = TableIterator<D, O, IP, C...>;
10491055 using policy_t = IP;
10501056 using all_columns = framework::pack<C...>;
10511057 using persistent_columns_t = framework::selected_pack<soa::is_persistent_column_t , C...>;
1052- using bindings_pack_t = decltype ([]<typename ... Cs>(framework::pack<Cs...>) {
1053- return framework::pack<decltype (getBinding<Cs>())...>{};
1054- }(all_columns{}));
10551058
10561059 TableIterator (arrow::ChunkedArray* columnData[sizeof ...(C)], IP&& policy)
10571060 : IP{policy},
@@ -1825,8 +1828,6 @@ class Table
18251828 template <typename IP, typename Parent, typename ... T>
18261829 struct TableIteratorBase : base_iterator<IP> {
18271830 using columns_t = typename Parent::columns_t ;
1828- using bindings_pack_t = typename base_iterator<IP>::bindings_pack_t ;
1829- // static constexpr const std::array<TableRef, sizeof...(T)> originals{T::ref...};
18301831 static constexpr auto originals = Parent::originals;
18311832 using policy_t = IP;
18321833 using parent_t = Parent;
@@ -1915,17 +1916,21 @@ class Table
19151916 template <typename TI>
19161917 auto getId () const
19171918 {
1918- using decayed = std::decay_t <TI>;
1919- if constexpr (framework::has_type<decayed>(bindings_pack_t {})) { // index to another table
1920- constexpr auto idx = framework::has_type_at_v<decayed>(bindings_pack_t {});
1921- return framework::pack_element_t <idx, columns_t >::getId ();
1922- } else if constexpr (std::same_as<decayed, Parent>) { // self index
1923- return this ->globalIndex ();
1924- } else if constexpr (is_indexing_column<decayed>) { // soa::Index<>
1925- return this ->globalIndex ();
1926- } else {
1927- return static_cast <int32_t >(-1 );
1928- }
1919+ return static_cast <int32_t >(-1 );
1920+ }
1921+
1922+ template <typename TI>
1923+ requires (std::same_as<std::decay_t <TI>, Parent> || is_indexing_column<std::decay_t <TI>>)
1924+ auto getId () const
1925+ {
1926+ return this ->globalIndex ();
1927+ }
1928+
1929+ template <typename TI>
1930+ requires (inBindings<std::decay_t <TI>>(typename Parent::all_columns{}) < framework::pack_size(typename Parent::all_columns{}))
1931+ auto getId () const
1932+ {
1933+ return inBindings<std::decay_t <TI>>(typename Parent::all_columns{});
19291934 }
19301935
19311936 template <soa::is_dynamic_column CD, typename ... CDArgs>
0 commit comments