@@ -1620,7 +1620,29 @@ consteval auto base_iter(framework::pack<C...>&&) -> TableIterator<D, O, IP, C..
16201620{
16211621}
16221622
1623- template <TableRef ref>
1623+ template <TableRef ref, typename ... Ts>
1624+ requires ((sizeof ...(Ts) > 0 ) && (soa::is_column<Ts> && ...))
1625+ consteval auto getColumns ()
1626+ {
1627+ return framework::pack<Ts...>{};
1628+ }
1629+
1630+ template <TableRef ref, typename ... Ts>
1631+ requires ((sizeof ...(Ts) > 0 ) && !(soa::is_column<Ts> || ...) && (ref.origin_hash == " CONC" _h))
1632+ consteval auto getColumns ()
1633+ {
1634+ return framework::full_intersected_pack_t <typename Ts::columns_t ...>{};
1635+ }
1636+
1637+ template <TableRef ref, typename ... Ts>
1638+ requires ((sizeof ...(Ts) > 0 ) && !(soa::is_column<Ts> || ...) && (ref.origin_hash != " CONC" _h))
1639+ consteval auto getColumns ()
1640+ {
1641+ return framework::concatenated_pack_unique_t <typename Ts::columns_t ...>{};
1642+ }
1643+
1644+ template <TableRef ref, typename ... Ts>
1645+ requires (sizeof ...(Ts) == 0 && soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<ref.desc_hash>>>)
16241646consteval auto getColumns ()
16251647{
16261648 return typename aod::MetadataTrait<o2::aod::Hash<ref.desc_hash >>::metadata::columns{};
@@ -1636,58 +1658,42 @@ class Table
16361658 using self_t = Table<L, D, O, Ts...>;
16371659 using table_t = self_t ;
16381660
1639- static constexpr const auto originals = []() {
1640- if constexpr (sizeof ...(Ts) == 0 ) {
1641- return std::array<TableRef, 1 >{ref};
1642- } else {
1643- if constexpr ((o2::soa::is_column<Ts> && ...)) {
1644- return std::array<TableRef, 1 >{ref};
1645- } else {
1646- return o2::soa::mergeOriginals<Ts...>();
1647- }
1648- }
1649- }();
1661+ static constexpr const auto originals = framework::overloaded {
1662+ []<typename ... TTs> requires ((sizeof ... (TTs) == 0 ) || (o2::soa::is_column<TTs> && ...)) (framework::pack<TTs...>) { return std::array<TableRef, 1 >{ref}; },
1663+ []<typename ... TTs> requires ((sizeof ... (TTs) > 0 ) && (!o2::soa::is_column<TTs> || ...)) (framework::pack<TTs...>) { return o2::soa::mergeOriginals<TTs...>(); }
1664+ }.operator ()(framework::pack<Ts...>{});
16501665
16511666 template <size_t N, std::array<TableRef, N> bindings>
1667+ requires (ref.origin_hash == " CONC" _h)
16521668 static consteval auto isIndexTargetOf ()
16531669 {
1654- if constexpr (std::same_as<O, o2::aod::Hash<" CONC" _h>>) {
1655- return false ;
1656- } else if constexpr (std::same_as<O, o2::aod::Hash<" JOIN" _h>>) {
1657- return std::find_if (self_t ::originals.begin (), self_t ::originals.end (), [](TableRef const & r) {
1658- return std::find (bindings.begin (), bindings.end (), r) != bindings.end ();
1659- }) != self_t ::originals.end ();
1660- } else {
1661- return std::find (bindings.begin (), bindings.end (), self_t ::ref) != bindings.end ();
1662- }
1670+ return false ;
16631671 }
16641672
1665- template <TableRef r>
1666- static consteval bool hasOriginal ()
1673+ template <size_t N, std::array<TableRef, N> bindings>
1674+ requires (ref.origin_hash == " JOIN" _h)
1675+ static consteval auto isIndexTargetOf ()
16671676 {
1668- return std::find_if (originals.begin (), originals.end (), [](TableRef const & o) { return o.desc_hash == r.desc_hash ; }) != originals.end ();
1677+ return std::find_if (self_t ::originals.begin (), self_t ::originals.end (),
1678+ [](TableRef const & r) {
1679+ return std::find (bindings.begin (), bindings.end (), r) != bindings.end ();
1680+ }) != self_t ::originals.end ();
16691681 }
16701682
1671- static consteval bool hasOriginal_alt (TableRef const & r)
1683+ template <size_t N, std::array<TableRef, N> bindings>
1684+ requires (!(ref.origin_hash == " CONC" _h || ref.origin_hash == " JOIN" _h))
1685+ static consteval auto isIndexTargetOf ()
16721686 {
1673- return std::ranges::find_if (originals .begin (), originals .end (), [&](TableRef const & o) { return o. desc_hash == r. desc_hash ; }) != originals .end ();
1687+ return std::find (bindings .begin (), bindings .end (), self_t ::ref) != bindings .end ();
16741688 }
16751689
1676- using columns_t = decltype ([]() {
1677- if constexpr (sizeof ...(Ts) == 0 ) {
1678- return getColumns<originals[0 ]>();
1679- } else {
1680- if constexpr ((o2::soa::is_column<Ts> && ...)) {
1681- return framework::pack<Ts...>{};
1682- } else {
1683- if constexpr (std::same_as<O, o2::aod::Hash<" CONC" _h>>) {
1684- return framework::full_intersected_pack_t <typename Ts::columns_t ...>{};
1685- } else {
1686- return framework::concatenated_pack_unique_t <typename Ts::columns_t ...>{};
1687- }
1688- }
1689- }
1690- }());
1690+ template <TableRef r>
1691+ static consteval bool hasOriginal ()
1692+ {
1693+ return std::find_if (originals.begin (), originals.end (), [](TableRef const & o) { return o.desc_hash == r.desc_hash ; }) != originals.end ();
1694+ }
1695+
1696+ using columns_t = decltype (getColumns<ref, Ts...>());
16911697
16921698 using persistent_columns_t = decltype ([]<typename ... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_persistent_column_t , C...> {}(columns_t {}));
16931699 using column_types = decltype ([]<typename ... C>(framework::pack<C...>) -> framework::pack<typename C::type...> {}(persistent_columns_t {}));
@@ -1729,7 +1735,7 @@ class Table
17291735
17301736 template <typename P>
17311737 TableIteratorBase& operator =(TableIteratorBase<FilteredIndexPolicy, P, T...> other)
1732- requires std::is_same_v <IP, DefaultIndexPolicy>
1738+ requires std::same_as <IP, DefaultIndexPolicy>
17331739 {
17341740 static_cast <base_iterator<IP>&>(*this ) = static_cast <base_iterator<FilteredIndexPolicy>>(other);
17351741 return *this ;
@@ -1763,7 +1769,7 @@ class Table
17631769
17641770 template <typename P>
17651771 TableIteratorBase (TableIteratorBase<FilteredIndexPolicy, P, T...> other)
1766- requires std::is_same_v <IP, DefaultIndexPolicy>
1772+ requires std::same_as <IP, DefaultIndexPolicy>
17671773 {
17681774 *this = other;
17691775 }
@@ -1781,7 +1787,7 @@ class Table
17811787
17821788 template <typename P, typename ... Os>
17831789 void matchTo (TableIteratorBase<IP, P, Os...> const & other)
1784- requires std::is_same_v <typename P::table_t, typename Parent::table_t>
1790+ requires std::same_as <typename P::table_t, typename Parent::table_t>
17851791 {
17861792 this ->mRowIndex = other.mRowIndex ;
17871793 }
@@ -1821,7 +1827,7 @@ class Table
18211827 template <typename B, typename ... CCs>
18221828 std::array<B, sizeof ...(CCs)> getValues () const
18231829 {
1824- static_assert (std::is_same_v <B, float > || std::is_same_v <B, double >, " The common return type should be float or double" );
1830+ static_assert (std::same_as <B, float > || std::same_as <B, double >, " The common return type should be float or double" );
18251831 return {getValue<B, CCs>()...};
18261832 }
18271833
@@ -1901,13 +1907,13 @@ class Table
19011907 }
19021908
19031909 Table (std::vector<std::shared_ptr<arrow::Table>>&& tables, uint64_t offset = 0 )
1904- requires (!std::is_same_v<O, o2::aod::Hash< " CONC" _h>> )
1910+ requires (ref.origin_hash != " CONC" _h)
19051911 : Table(ArrowHelpers::joinTables(std::move(tables)), offset)
19061912 {
19071913 }
19081914
19091915 Table (std::vector<std::shared_ptr<arrow::Table>>&& tables, uint64_t offset = 0 )
1910- requires (std::is_same_v<O, o2::aod::Hash< " CONC" _h>> )
1916+ requires (ref.origin_hash == " CONC" _h)
19111917 : Table(ArrowHelpers::concatTables(std::move(tables)), offset)
19121918 {
19131919 }
0 commit comments