Skip to content

Commit 50c3b5a

Browse files
committed
improve requirements; separate nested if-constexpr
1 parent 94344f6 commit 50c3b5a

File tree

1 file changed

+53
-47
lines changed
  • Framework/Core/include/Framework

1 file changed

+53
-47
lines changed

Framework/Core/include/Framework/ASoA.h

Lines changed: 53 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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>>>)
16241646
consteval 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

Comments
 (0)