@@ -1045,16 +1045,19 @@ consteval auto getBinding() -> void
10451045{
10461046}
10471047
1048+ template <typename T, typename ... Cs>
1049+ consteval auto inBindings (framework::pack<Cs...>)
1050+ {
1051+ return framework::has_type_at_v<T>(framework::pack<decltype (getBinding<Cs>())...>{});
1052+ }
1053+
10481054template <typename D, typename O, typename IP, typename ... C>
10491055struct TableIterator : IP, C... {
10501056 public:
10511057 using self_t = TableIterator<D, O, IP, C...>;
10521058 using policy_t = IP;
10531059 using all_columns = framework::pack<C...>;
10541060 using persistent_columns_t = framework::selected_pack<soa::is_persistent_column_t , C...>;
1055- using bindings_pack_t = decltype ([]<typename ... Cs>(framework::pack<Cs...>) {
1056- return framework::pack<decltype (getBinding<Cs>())...>{};
1057- }(all_columns{}));
10581061
10591062 TableIterator (arrow::ChunkedArray* columnData[sizeof ...(C)], IP&& policy)
10601063 : IP{policy},
@@ -1828,8 +1831,6 @@ class Table
18281831 template <typename IP, typename Parent, typename ... T>
18291832 struct TableIteratorBase : base_iterator<IP> {
18301833 using columns_t = typename Parent::columns_t ;
1831- using bindings_pack_t = typename base_iterator<IP>::bindings_pack_t ;
1832- // static constexpr const std::array<TableRef, sizeof...(T)> originals{T::ref...};
18331834 static constexpr auto originals = Parent::originals;
18341835 using policy_t = IP;
18351836 using parent_t = Parent;
@@ -1918,17 +1919,21 @@ class Table
19181919 template <typename TI>
19191920 auto getId () const
19201921 {
1921- using decayed = std::decay_t <TI>;
1922- if constexpr (framework::has_type<decayed>(bindings_pack_t {})) { // index to another table
1923- constexpr auto idx = framework::has_type_at_v<decayed>(bindings_pack_t {});
1924- return framework::pack_element_t <idx, columns_t >::getId ();
1925- } else if constexpr (std::same_as<decayed, Parent>) { // self index
1926- return this ->globalIndex ();
1927- } else if constexpr (is_indexing_column<decayed>) { // soa::Index<>
1928- return this ->globalIndex ();
1929- } else {
1930- return static_cast <int32_t >(-1 );
1931- }
1922+ return static_cast <int32_t >(-1 );
1923+ }
1924+
1925+ template <typename TI>
1926+ requires (std::same_as<std::decay_t <TI>, Parent> || is_indexing_column<std::decay_t <TI>>)
1927+ auto getId () const
1928+ {
1929+ return this ->globalIndex ();
1930+ }
1931+
1932+ template <typename TI>
1933+ requires (inBindings<std::decay_t <TI>>(typename Parent::all_columns{}) < framework::pack_size(typename Parent::all_columns{}))
1934+ auto getId () const
1935+ {
1936+ return inBindings<std::decay_t <TI>>(typename Parent::all_columns{});
19321937 }
19331938
19341939 template <soa::is_dynamic_column CD, typename ... CDArgs>
0 commit comments