@@ -199,7 +199,33 @@ struct to_impl<impl::list_t<LayoutTag>, impl::flat_list_t<LayoutTag>> {
199199 }
200200};
201201
202- // TODO: matrix <-> flat-matrix specializations
202+ // Conversion: matrix -> flat matrix (same layout)
203+ template <traits::c_hypergraph_layout_tag LayoutTag>
204+ requires traits::c_hypergraph_asymmetric_layout_tag<LayoutTag>
205+ struct to_impl <impl::flat_matrix_t <LayoutTag>, impl::matrix_t <LayoutTag>> {
206+ template <typename TargetHypergraph, typename SourceHypergraph>
207+ static void convert (TargetHypergraph& target, SourceHypergraph& source) {
208+ target._impl ._matrix =
209+ decltype (target._impl ._matrix )(std::views::as_rvalue (std::move (source._impl ._matrix )));
210+ }
211+ };
212+
213+ // Conversion: flat matrix -> matrix (same layout)
214+ template <traits::c_hypergraph_layout_tag LayoutTag>
215+ requires traits::c_hypergraph_asymmetric_layout_tag<LayoutTag>
216+ struct to_impl <impl::matrix_t <LayoutTag>, impl::flat_matrix_t <LayoutTag>> {
217+ template <typename TargetHypergraph, typename SourceHypergraph>
218+ static void convert (TargetHypergraph& target, SourceHypergraph& source) {
219+ auto & target_impl = target._impl ;
220+ auto & source_impl = source._impl ;
221+
222+ target_impl._matrix_row_size = source_impl._matrix .n_cols ();
223+ target_impl._matrix .reserve (source_impl._matrix .n_rows ());
224+
225+ for (const auto row : source_impl._matrix )
226+ target_impl._matrix .emplace_back (row.begin (), row.end ());
227+ }
228+ };
203229
204230} // namespace detail
205231
0 commit comments