Skip to content

Commit 4d8e7b5

Browse files
committed
WIP: replacing traits
1 parent 0dab754 commit 4d8e7b5

File tree

1 file changed

+61
-40
lines changed
  • Framework/Core/include/Framework

1 file changed

+61
-40
lines changed

Framework/Core/include/Framework/ASoA.h

Lines changed: 61 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -202,13 +202,47 @@ struct fmt::formatter<o2::soa::OriginEnc> {
202202
}
203203
};
204204

205+
namespace o2::soa
206+
{
207+
template <typename C>
208+
consteval auto is_persistent_column()
209+
{
210+
if constexpr (requires {typename C::persistent{};}) {
211+
return C::persistent::value;
212+
} else {
213+
return false;
214+
}
215+
}
216+
217+
template <typename C>
218+
using is_persistent_t = std::conditional_t<is_persistent_column<C>(), std::true_type, std::false_type>;
219+
220+
template <typename T>
221+
concept not_void = requires{ !std::same_as<T, void>;};
222+
223+
template <typename C>
224+
concept is_index_column = requires {not_void<typename C::binding_t>;};
225+
226+
template <typename C>
227+
using is_external_index_t = typename std::conditional_t<is_index_column<C>, std::true_type, std::false_type>;
228+
229+
template <typename C>
230+
concept is_self_index = requires{typename C::self_index_t{};};
231+
232+
template <typename C>
233+
using is_self_index_t = typename std::conditional_t<is_self_index<C>, std::true_type, std::false_type>;
234+
}
235+
205236
namespace o2::aod
206237
{
207238
DECLARE_SOA_METADATA();
208239

209240
template <typename D, typename... Cs>
210241
struct TableMetadataNG {
211242
using columns = framework::pack<Cs...>;
243+
using persistent_columns_t = framework::selected_pack<soa::is_persistent_t, Cs...>;
244+
using external_index_columns_t = framework::selected_pack<soa::is_external_index_t, Cs...>;
245+
using internal_index_columns_t = framework::selected_pack<soa::is_self_index_t, Cs...>;
212246
};
213247

214248
template <typename T>
@@ -316,12 +350,6 @@ auto createFieldsFromColumns(framework::pack<C...>)
316350

317351
using SelectionVector = std::vector<int64_t>;
318352

319-
template <typename, typename = void>
320-
inline constexpr bool is_index_column_v = false;
321-
322-
template <typename T>
323-
inline constexpr bool is_index_column_v<T, std::void_t<decltype(sizeof(typename T::binding_t))>> = true;
324-
325353
template <typename, typename = void>
326354
inline constexpr bool is_type_with_originals_v = false;
327355

@@ -810,33 +838,27 @@ consteval bool is_soa_column_v()
810838
template <typename T>
811839
using is_dynamic_t = framework::is_specialization<typename T::base, DynamicColumn>;
812840

813-
namespace persistent_type_helper
814-
{
815-
// This checks both for the existence of the ::persistent member in the class T as well as the value returned stored in it.
816-
// Hack: a pointer to any field of type int inside persistent. Both true_type and false_type do not have any int field, but anyways we pass nullptr.
817-
// The compiler picks the version with exact number of arguments when only it can, i.e., when T::persistent is defined.
818-
template <class T>
819-
typename T::persistent test(int T::persistent::*);
841+
// namespace persistent_type_helper
842+
// {
843+
// // This checks both for the existence of the ::persistent member in the class T as well as the value returned stored in it.
844+
// // Hack: a pointer to any field of type int inside persistent. Both true_type and false_type do not have any int field, but anyways we pass nullptr.
845+
// // The compiler picks the version with exact number of arguments when only it can, i.e., when T::persistent is defined.
846+
// template <class T>
847+
// typename T::persistent test(int T::persistent::*);
820848

821-
template <class>
822-
std::false_type test(...);
823-
} // namespace persistent_type_helper
849+
// template <class>
850+
// std::false_type test(...);
851+
// } // namespace persistent_type_helper
824852

825-
template <typename T>
826-
using is_persistent_t = decltype(persistent_type_helper::test<T>(nullptr));
853+
// template <typename T>
854+
// using is_persistent_t = decltype(persistent_type_helper::test<T>(nullptr));
827855

828856
template <typename T>
829-
constexpr auto is_persistent_v = is_persistent_t<T>::value;
857+
constexpr auto is_persistent_v = soa::is_persistent_t<T>::value;
830858

831859
template <typename T>
832860
constexpr auto is_dynamic_v = is_dynamic_t<T>::value;
833861

834-
template <typename T>
835-
using is_external_index_t = typename std::conditional<is_index_column_v<T>, std::true_type, std::false_type>::type;
836-
837-
template <typename T>
838-
using is_self_index_t = typename std::conditional<is_self_index_column_v<T>, std::true_type, std::false_type>::type;
839-
840862
template <typename T, template <auto...> class Ref>
841863
struct is_index : std::false_type {
842864
};
@@ -1064,11 +1086,11 @@ struct TableIterator : IP, C... {
10641086
using self_t = TableIterator<D, O, IP, C...>;
10651087
using policy_t = IP;
10661088
using all_columns = framework::pack<C...>;
1067-
using persistent_columns_t = framework::selected_pack<is_persistent_t, C...>;
1089+
using persistent_columns_t = framework::selected_pack<soa::is_persistent_t, C...>;
10681090
using index_columns_t = framework::selected_pack<is_index_t, C...>;
10691091
constexpr inline static bool has_index_v = framework::pack_size(index_columns_t{}) > 0;
1070-
using external_index_columns_t = framework::selected_pack<is_external_index_t, C...>;
1071-
using internal_index_columns_t = framework::selected_pack<is_self_index_t, C...>;
1092+
using external_index_columns_t = framework::selected_pack<soa::is_external_index_t, C...>;
1093+
using internal_index_columns_t = framework::selected_pack<soa::is_self_index_t, C...>;
10721094
using bindings_pack_t = decltype([]<typename... Cs>(framework::pack<Cs...>) -> framework::pack<typename Cs::binding_t...> {}(external_index_columns_t{})); // decltype(extractBindings(external_index_columns_t{}));
10731095

10741096
TableIterator(arrow::ChunkedArray* columnData[sizeof...(C)], IP&& policy)
@@ -1273,11 +1295,11 @@ struct RowViewCore : public IP, C... {
12731295
using policy_t = IP;
12741296
using table_t = o2::soa::Table<ORIGIN, C...>;
12751297
using all_columns = framework::pack<C...>;
1276-
using persistent_columns_t = framework::selected_pack<is_persistent_t, C...>;
1298+
using persistent_columns_t = framework::selected_pack<soa::is_persistent_t, C...>;
12771299
using index_columns_t = framework::selected_pack<is_index_t, C...>;
12781300
constexpr inline static bool has_index_v = framework::pack_size(index_columns_t{}) > 0;
1279-
using external_index_columns_t = framework::selected_pack<is_external_index_t, C...>;
1280-
using internal_index_columns_t = framework::selected_pack<is_self_index_t, C...>;
1301+
using external_index_columns_t = framework::selected_pack<soa::is_external_index_t, C...>;
1302+
using internal_index_columns_t = framework::selected_pack<soa::is_self_index_t, C...>;
12811303

12821304
RowViewCore(arrow::ChunkedArray* columnData[sizeof...(C)], IP&& policy)
12831305
: IP{policy},
@@ -2045,17 +2067,17 @@ class TableNG
20452067
}
20462068
}());
20472069

2048-
using persistent_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<is_persistent_t, C...> {}(columns_t{}));
2070+
using persistent_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_persistent_t, C...> {}(columns_t{}));
20492071
using column_types = decltype([]<typename... C>(framework::pack<C...>) -> framework::pack<typename C::type...> {}(persistent_columns_t{}));
20502072

2051-
using external_index_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<is_external_index_t, C...> {}(columns_t{}));
2052-
using internal_index_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<is_self_index_t, C...> {}(columns_t{}));
2073+
using external_index_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_external_index_t, C...> {}(columns_t{}));
2074+
using internal_index_columns_t = decltype([]<typename... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_self_index_t, C...> {}(columns_t{}));
20532075
template <typename IP>
20542076
using base_iterator = decltype(base_iter<D, O, IP>(columns_t{}));
20552077

20562078
template <typename IP, typename Parent, typename... T>
20572079
struct TableIteratorBase : base_iterator<IP> {
2058-
using external_index_columns_t = decltype([]<typename... C>(framework::pack<C...>) -> framework::selected_pack<is_external_index_t, C...> {}(columns_t{}));
2080+
using external_index_columns_t = decltype([]<typename... C>(framework::pack<C...>) -> framework::selected_pack<soa::is_external_index_t, C...> {}(columns_t{}));
20592081
using bindings_pack_t = decltype([]<typename... C>(framework::pack<C...>) -> framework::pack<typename C::binding_t...> {}(external_index_columns_t{}));
20602082
static constexpr const std::array<TableRef, sizeof...(T)> originals{T::ref...};
20612083
using policy_t = IP;
@@ -2459,9 +2481,9 @@ class Table
24592481
using table_t = Table<ORIGIN, C...>;
24602482
using columns = framework::pack<C...>;
24612483
using column_types = framework::pack<typename C::type...>;
2462-
using persistent_columns_t = framework::selected_pack<is_persistent_t, C...>;
2463-
using external_index_columns_t = framework::selected_pack<is_external_index_t, C...>;
2464-
using internal_index_columns_t = framework::selected_pack<is_self_index_t, C...>;
2484+
using persistent_columns_t = framework::selected_pack<soa::is_persistent_t, C...>;
2485+
using external_index_columns_t = framework::selected_pack<soa::is_external_index_t, C...>;
2486+
using internal_index_columns_t = framework::selected_pack<soa::is_self_index_t, C...>;
24652487

24662488
static constexpr auto hashes()
24672489
{
@@ -2470,8 +2492,7 @@ class Table
24702492

24712493
template <typename IP, typename Parent, typename... T>
24722494
struct RowViewBase : public RowViewCore<ORIGIN, IP, C...> {
2473-
2474-
using external_index_columns_t = framework::selected_pack<is_external_index_t, C...>;
2495+
using external_index_columns_t = framework::selected_pack<soa::is_external_index_t, C...>;
24752496
using bindings_pack_t = decltype(extractBindings(external_index_columns_t{}));
24762497
using parent_t = Parent;
24772498
using originals = originals_pack_t<T...>;

0 commit comments

Comments
 (0)