:github_url: https://github.com/svenevs/exhale-companion .. _program_listing_file_py2cpp_nx2bgl.hpp: Program Listing for File nx2bgl.hpp =================================== |exhale_lsh| :ref:`Return to documentation for file ` (``py2cpp/nx2bgl.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #pragma once #include #include #include #include namespace xn { template class VertexView : public Graph { public: explicit VertexView(Graph &&G) noexcept : Graph{std::forward(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 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 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 class grAdaptor : public VertexView { public: using Vertex = typename boost::graph_traits::vertex_descriptor; using node_t = Vertex; using edge_t = typename boost::graph_traits::edge_descriptor; // using edge_wt_t = decltype( boost::get(boost::edge_weight, // std::declval()) ); grAdaptor() = delete; explicit grAdaptor(Graph &&G) noexcept : VertexView{std::forward(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 { return EdgeView(*this); } [[nodiscard]] auto neighbors(Vertex v) const -> AtlasView { return AtlasView(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::null_vertex(); } template auto source(const Edge &e) const -> Vertex { return boost::source(e, *this); } template auto target(const Edge &e) const -> Vertex { return boost::target(e, *this); } template [[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