blob: cab4533329f9131e4cb4e4f5edf2f199fdacf9d3 [file] [log] [blame]
#pragma once
#include <nlohmann/json.hpp>
#include <set>
#include <unordered_map>
using Association = std::tuple<std::string, std::string, std::string>;
using BoardPathsView = decltype(std::views::keys(
std::declval<std::map<std::string, std::string>&>()));
class AssocName
{
public:
std::string name;
std::string reverse;
AssocName(const std::string& name, const std::string& reverse);
AssocName() = delete;
AssocName getReverse() const;
bool operator==(const AssocName& other) const = default;
bool operator<(const AssocName& other) const;
};
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<std::string, std::set<Association>> 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<std::string, std::set<Association>>& result,
BoardPathsView boardPaths,
const std::map<Path, std::set<AssocName>>& pathAssocs);
void fillAssocForPortId(
std::unordered_map<std::string, std::set<Association>>& result,
BoardPathsView boardPaths, const Path& upstream, const Path& downstream,
const AssocName& assocName);
void addPort(const PortType& port, const Path& path,
const AssocName& assocName);
// 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<PortType, std::map<Path, std::set<AssocName>>> ports;
std::unordered_map<Path, BoardType> boardTypes;
std::unordered_map<BoardName, Path> boardNames;
};