Program Listing for File nx2bgl.hpp¶
↰ Return to documentation for file (py2cpp/nx2bgl.hpp)
#pragma once
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/graph_utility.hpp>
#include <type_traits>
namespace xn
{
template <typename Graph>
class VertexView : public Graph
{
public:
explicit VertexView(Graph&& G) noexcept
: Graph {std::forward<Graph>(G)}
{
}
[[nodiscard]] auto begin() const
{
// auto [v_iter, v_end] = boost::vertices(*this);
// return v_iter;
return boost::vertices(*this).first;
}
[[nodiscard]] auto end() const
{
// auto [v_iter, v_end] = boost::vertices(*this);
// return v_end;
return boost::vertices(*this).second;
}
[[nodiscard]] auto cbegin() const
{
// auto [v_iter, v_end] = boost::vertices(*this);
// return v_iter;
return boost::vertices(*this).first;
}
[[nodiscard]] auto cend() const
{
// auto [v_iter, v_end] = boost::vertices(*this);
// return v_end;
return boost::vertices(*this).second;
}
};
template <typename Graph>
class EdgeView
{
private:
const Graph& G;
public:
explicit EdgeView(const Graph& G)
: G {G}
{
}
[[nodiscard]] auto begin() const
{
// auto [e_iter, e_end] = boost::edges(_G);
// return e_iter;
return boost::edges(this->G).first;
}
[[nodiscard]] auto end() const
{
// auto [e_iter, e_end] = boost::edges(_G);
// return e_end;
return boost::edges(this->G).second;
}
[[nodiscard]] auto cbegin() const
{
// auto [e_iter, e_end] = boost::edges(_G);
// return e_iter;
return boost::edges(this->G).first;
}
[[nodiscard]] auto cend() const
{
// auto [e_iter, e_end] = boost::edges(_G);
// return e_end;
return boost::edges(this->G).second;
}
};
template <typename Vertex, typename Graph>
class AtlasView
{
private:
Vertex _v;
const Graph& G;
public:
AtlasView(Vertex v, const Graph& G)
: _v {v}
, G {G}
{
}
auto begin() const
{
// auto [e_iter, e_end] = boost::out_edges(_v, _G);
// return e_iter;
return boost::out_edges(this->_v, this->G).first;
}
auto end() const
{
// auto [e_iter, e_end] = boost::out_edges(_v, _G);
// return e_end;
return boost::out_edges(this->_v, this->G).second;
}
auto cbegin() const
{
// auto [e_iter, e_end] = boost::out_edges(_v, _G);
// return e_iter;
return boost::out_edges(this->_v, this->G).first;
}
auto cend() const
{
// auto [e_iter, e_end] = boost::out_edges(_v, _G);
// return e_end;
return boost::out_edges(this->_v, this->G).second;
}
};
template <typename Graph>
class grAdaptor : public VertexView<Graph>
{
public:
using Vertex = typename boost::graph_traits<Graph>::vertex_descriptor;
using node_t = Vertex;
using edge_t = typename boost::graph_traits<Graph>::edge_descriptor;
// using edge_wt_t = decltype( boost::get(boost::edge_weight,
// std::declval<Graph>()) );
grAdaptor() = delete;
explicit grAdaptor(Graph&& G) noexcept
: VertexView<Graph> {std::forward<Graph>(G)}
{
}
// grAdaptor(const grAdaptor&) = delete; // don't copy
// grAdaptor& operator=(const grAdaptor&) = delete; // don't assign
// grAdaptor(grAdaptor&&) noexcept = default; // don't copy
[[nodiscard]] auto number_of_nodes() const
{
return boost::num_vertices(*this);
}
[[nodiscard]] auto number_of_edges() const
{
return boost::num_edges(*this);
}
[[nodiscard]] auto edges() const -> EdgeView<Graph>
{
return EdgeView<Graph>(*this);
}
[[nodiscard]] auto neighbors(Vertex v) const -> AtlasView<Vertex, Graph>
{
return AtlasView<Vertex, Graph>(v, *this);
}
auto add_edge(int u, int v)
{
return boost::add_edge(u, v, *this);
}
static auto null_vertex() -> Vertex
{
return boost::graph_traits<Graph>::null_vertex();
}
template <typename Edge>
auto source(const Edge& e) const -> Vertex
{
return boost::source(e, *this);
}
template <typename Edge>
auto target(const Edge& e) const -> Vertex
{
return boost::target(e, *this);
}
template <typename Edge>
[[nodiscard]] auto end_points(const Edge& e) const
{
auto s = boost::source(e, *this);
auto t = boost::target(e, *this);
return std::make_pair(s, t);
}
};
} // namespace xn