Program Listing for File LoopTopologyFactory.hpp

Return to documentation for file (include/netuit/arrange/LoopTopologyFactory.hpp)

#pragma once
#ifndef NETUIT_ARRANGE_LOOPTOPOLOGYFACTORY_HPP_INCLUDE
#define NETUIT_ARRANGE_LOOPTOPOLOGYFACTORY_HPP_INCLUDE

#include <algorithm>
#include <cassert>
#include <vector>

#include "../topology/TopoEdge.hpp"
#include "../topology/Topology.hpp"
#include "../topology/TopoNode.hpp"

namespace netuit {

inline netuit::Topology make_loop_topology(const size_t cardinality) {

  netuit::Topology res;

  size_t edge_counter{};

  std::generate_n(
    std::back_inserter(res),
    cardinality,
    [&](){
      netuit::TopoEdge self_edge{edge_counter++};
      return netuit::TopoNode{
        {self_edge.GetOutlet()},
        {self_edge.GetInlet()}
      };
    }
  );

  return res;

}

struct LoopTopologyFactory {

  netuit::Topology operator()(const size_t cardinality) const {
    return make_loop_topology(cardinality);
  }

  netuit::Topology operator()(const std::vector<size_t> cardinality) const {
    assert(cardinality.size() == 1);
    return make_loop_topology(cardinality.front());
  }

  static std::string GetName() { return "Loop Topology"; }

  static std::string GetSlug() { return "loop"; }

};

} // namespace netuit

#endif // #ifndef NETUIT_ARRANGE_LOOPTOPOLOGYFACTORY_HPP_INCLUDE