// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include #include #include #include #include #include namespace rocRoller { namespace Serialization { template struct MappingTraits { using iot = IOTraits; static void mapping(IO& io, Graph::HypergraphIncidenceContainer& incidence) { iot::mapRequired(io, "incidenceBySrc", incidence.m_incidenceBySrc); iot::mapRequired(io, "incidenceByDst", incidence.m_incidenceByDst); } static void mapping(IO& io, Graph::HypergraphIncidenceContainer& incidence, EmptyContext&) { mapping(io, incidence); } }; template struct ElementEntry { int id; Var value; }; template struct MappingTraits, IO, Context> { using iot = IOTraits; using Entry = ElementEntry; static void mapping(IO& io, Entry& entry, Context ctx) { iot::mapRequired(io, "id", entry.id); MappingTraits::mapping(io, entry.value, ctx); } static void mapping(IO& io, Entry& entry) { AssertFatal((std::same_as)); Context ctx; mapping(io, entry, ctx); } }; template struct SequenceTraits>, IO> : public DefaultSequenceTraits>, IO, false> { }; // template // struct CustomMappingTraits, IO> // : public DefaultCustomMappingTraits, IO, false, false> // { // }; template struct MappingTraits, IO, EmptyContext> { using iot = IOTraits; using HG = Graph::Hypergraph; using Element = typename HG::Element; static void mapping(IO& io, HG& graph) { std::vector> elements; if(iot::outputting(io)) { elements.reserve(graph.m_elements.size()); for(auto const& pair : graph.m_elements) elements.push_back({pair.first, pair.second}); } iot::mapRequired(io, "elements", elements); if(!iot::outputting(io)) { for(auto const& entry : elements) graph.m_elements[entry.id] = entry.value; } iot::mapRequired(io, "incidence", graph.m_incidence); } static void mapping(IO& io, HG& graph, EmptyContext&) { mapping(io, graph); } }; } }