@@ -152,16 +152,19 @@ class TableConsumer;
152152// int64_t mCount = -1;
153153// };
154154
155- template <soa::ng_table T>
155+ template <typename T>
156+ concept producable = soa::has_ng_metadata<T> || soa::has_ng_metadata<typename T::parent_t >;
157+
158+ template <producable T>
156159struct WritingCursor {
157160 public:
158- using persistent_table_t = T ;
159- using cursor_t = decltype (std::declval<TableBuilder>().cursor<T >());
161+ using persistent_table_t = decltype ([](){ if constexpr (soa::ng_iterator<T>) { return typename T:: parent_t { nullptr }; } else { return T{ nullptr }; } }()); // std::conditional<soa::ng_iterator<T>, typename T::parent_t, T> ;
162+ using cursor_t = decltype (std::declval<TableBuilder>().cursor<persistent_table_t >());
160163
161164 template <typename ... Ts>
162165 void operator ()(Ts... args)
163166 {
164- static_assert (sizeof ...(Ts) == framework::pack_size (typename T ::persistent_columns_t {}), " Argument number mismatch" );
167+ static_assert (sizeof ...(Ts) == framework::pack_size (typename persistent_table_t ::persistent_columns_t {}), " Argument number mismatch" );
165168 ++mCount ;
166169 cursor (0 , extract (args)...);
167170 }
@@ -189,7 +192,7 @@ struct WritingCursor {
189192 // / spend time reallocating the buffers.
190193 void reserve (int64_t size)
191194 {
192- mBuilder ->reserve (typename T ::column_types{}, size);
195+ mBuilder ->reserve (typename persistent_table_t ::column_types{}, size);
193196 }
194197
195198 void release ()
@@ -206,7 +209,7 @@ struct WritingCursor {
206209 if constexpr (soa::ng_iterator<A>) {
207210 return arg.globalIndex ();
208211 } else {
209- static_assert (!framework::has_type<A>(typename T ::persistent_columns_t {}), " Argument type mismatch" );
212+ static_assert (!framework::has_type<A>(typename persistent_table_t ::persistent_columns_t {}), " Argument type mismatch" );
210213 return arg;
211214 }
212215 }
@@ -259,7 +262,7 @@ struct OutputForTable {
259262// struct Produces : WritingCursor<typename soa::PackToTable<aod::MetadataTrait<T>::metadata::origin(), typename T::table_t::persistent_columns_t>::table> {
260263// };
261264
262- template <soa::has_ng_metadata T>
265+ template <producable T>
263266struct Produces : WritingCursor<T> {
264267};
265268
0 commit comments