#pragma once #include #include #include using Association = std::tuple; using BoardPathsView = decltype(std::views::keys( std::declval&>())); class AssocName { public: std::string name; std::string reverse; AssocName(const std::string& name, const std::string& reverse, const std::set& allowedOnBoardTypes, const std::set& allowedOnBoardTypesReverse); AssocName() = delete; // The type (e.g. Chassis, Board, Valve, ...) on which the association is // allowed std::set allowedOnBoardTypes; // The type (e.g. Chassis, Board, Valve, ...) on which the reverse // association is allowed std::set allowedOnBoardTypesReverse; AssocName getReverse() const; bool operator==(const AssocName& other) const = default; bool operator<(const AssocName& other) const; }; extern const std::vector supportedAssocs; class Topology { public: explicit Topology() = default; void addBoard(const std::string& path, const std::string& boardType, const std::string& boardName, const nlohmann::json& exposesItem); std::unordered_map> getAssocs( BoardPathsView boardPaths); void remove(const std::string& boardName); private: using Path = std::string; using BoardType = std::string; using BoardName = std::string; using PortType = std::string; void addDownstreamPort(const Path& path, const nlohmann::json& exposesItem); // @brief: fill associations map with the associations for a port identifier // such as 'MB Upstream Port' void fillAssocsForPortId( std::unordered_map>& result, BoardPathsView boardPaths, const std::map>& pathAssocs); void fillAssocForPortId( std::unordered_map>& result, BoardPathsView boardPaths, const Path& upstream, const Path& downstream, const AssocName& assocName); void addConfiguredPort(const Path& path, const nlohmann::json& exposesItem); void addPort(const PortType& port, const Path& path, const AssocName& assocName); static std::optional getAssocByName(const std::string& name); // Maps the port name to the participating paths. // each path also has their role(s) in the association. // For example a PSU path which is part of "MB Upstream Port" // will have "powering" role. std::unordered_map>> ports; std::unordered_map boardTypes; std::unordered_map boardNames; };