/** * Copyright 2021 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "easy_graph/builder/graph_builder.h" #include "easy_graph/graph/endpoint.h" #include "easy_graph/builder/link.h" #include "easy_graph/infra/log.h" EG_NS_BEGIN namespace { PortId getPortIdBy(const EdgeType &type, const PortId &specifiedPortId, PortId &reservedPortId) { if (type == EdgeType::CTRL) return 0; if (specifiedPortId == UNDEFINED_PORT_ID) return reservedPortId++; if (specifiedPortId < reservedPortId) return specifiedPortId; reservedPortId = specifiedPortId; return reservedPortId++; } } // namespace GraphBuilder::GraphBuilder(const std::string &name) : graph_(name) {} GraphBuilder::NodeInfo *GraphBuilder::FindNode(const NodeId &id) { auto it = nodes_.find(id); if (it == nodes_.end()) { return nullptr; } return &(it->second); } const GraphBuilder::NodeInfo *GraphBuilder::FindNode(const NodeId &id) const { return const_cast(*this).FindNode(id); } Node *GraphBuilder::BuildNode(const Node &node) { auto it = nodes_.find(node.GetId()); if (it == nodes_.end()) { nodes_.emplace(std::make_pair(node.GetId(), NodeInfo())); } return graph_.AddNode(node); } Edge *GraphBuilder::BuildEdge(const Node &src, const Node &dst, const Link &link) { NodeInfo *srcInfo = FindNode(src.GetId()); NodeInfo *dstInfo = FindNode(dst.GetId()); if (!srcInfo || !dstInfo) { EG_ERR("link edge{%d : %s} error!", link.type_, link.label_.c_str()); return nullptr; } PortId srcPortId = getPortIdBy(link.type_, link.src_port_id_, srcInfo->outPortMax); PortId dstPortId = getPortIdBy(link.type_, link.dst_port_id_, dstInfo->inPortMax); EG_DBG("link edge(%d) from (%s:%d) to (%s:%d)", link.type_, src.GetId().c_str(), srcPortId, dst.GetId().c_str(), dstPortId); return graph_.AddEdge( Edge(link.type_, link.label_, Endpoint(src.GetId(), srcPortId), Endpoint(dst.GetId(), dstPortId))); } EG_NS_END