@@ -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+
205236namespace o2 ::aod
206237{
207238DECLARE_SOA_METADATA ();
208239
209240template <typename D, typename ... Cs>
210241struct 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
214248template <typename T>
@@ -316,12 +350,6 @@ auto createFieldsFromColumns(framework::pack<C...>)
316350
317351using 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-
325353template <typename , typename = void >
326354inline constexpr bool is_type_with_originals_v = false ;
327355
@@ -810,33 +838,27 @@ consteval bool is_soa_column_v()
810838template <typename T>
811839using 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
828856template <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
831859template <typename T>
832860constexpr 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-
840862template <typename T, template <auto ...> class Ref >
841863struct 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