Program Listing for File ProConTopologyFactory.hpp¶
↰ Return to documentation for file (include/netuit/arrange/ProConTopologyFactory.hpp)
#pragma once
#ifndef NETUIT_ARRANGE_PROCONTOPOLOGYFACTORY_HPP_INCLUDE
#define NETUIT_ARRANGE_PROCONTOPOLOGYFACTORY_HPP_INCLUDE
#include "../topology/TopoEdge.hpp"
#include "../topology/Topology.hpp"
#include "../topology/TopoNode.hpp"
namespace netuit {
Topology make_producer_consumer_topology(const size_t cardinality) {
Topology res;
size_t edge_counter{};
for (size_t pair = 0; pair < cardinality/2; ++pair) {
netuit::TopoEdge edge{edge_counter++};
res.push_back(TopoNode{
{},
{edge.GetInlet()}
});
res.push_back(TopoNode{
{edge.GetOutlet()},
{}
});
}
// for odd cardinality, add a loop pipe
if (cardinality%2) {
netuit::TopoEdge self_edge{edge_counter++};
res.push_back(TopoNode{
{self_edge.GetOutlet()},
{self_edge.GetInlet()}
});
};
return res;
}
struct ProConTopologyFactory {
Topology operator()(const size_t cardinality) const {
return make_producer_consumer_topology(cardinality);
}
netuit::Topology operator()(const emp::vector<size_t> cardinality) const {
emp_assert(cardinality.size() == 1);
return make_producer_consumer_topology(cardinality.front());
}
static std::string GetName() { return "Producer-Consumer Topology"; }
static std::string GetSlug() { return "procon"; }
};
} // namespace netuit
#endif // #ifndef NETUIT_ARRANGE_PROCONTOPOLOGYFACTORY_HPP_INCLUDE