vendredi 1 juin 2018

iterating over edges in boost reverse graph

I am unable to iterate over the list of edges in a reversed adjacency list graph. Minimal code sample listed below with corresponding clang 6/gcc 7.3 error messages. Any help will be greatly appreciated!!!

#include <boost/config.hpp>
#include <algorithm>
#include <vector>
#include <utility>
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/reverse_graph.hpp>

#include <boost/graph/graph_utility.hpp>

using namespace boost;

struct vertexinfo {
int index{12};
};

struct edgeinfo {
int index{10};
};

using Graph = adjacency_list < vecS, vecS, bidirectionalS ,vertexinfo,edgeinfo>;
using ReversedGraph = reverse_graph<Graph>;

int main()
{
Graph graph(5);
auto e1 = add_edge(0, 2, graph);
graph[e1.first].index = 1;
auto e2 = add_edge(1, 1, graph);
graph[e2.first].index = 2;
auto e3 = add_edge(1, 3, graph);
graph[e3.first].index = 3;
auto e4 = add_edge(1, 4, graph);
graph[e4.first].index = 4;
auto e5 = add_edge(2, 1, graph);
graph[e5.first].index = 5;
auto e6 = add_edge(2, 3, graph);
graph[e6.first].index = 6;
auto e7 = add_edge(2, 4, graph);
graph[e7.first].index = 7;
auto e8 = add_edge(3, 1, graph);
graph[e8.first].index = 8;
auto e9 = add_edge(3, 4, graph);
graph[e9.first].index = 9;
auto e10 = add_edge(4, 0, graph);
graph[e10.first].index = 10;
auto e11 = add_edge(4, 1, graph);
graph[e11.first].index = 11;

ReversedGraph reversed_graph(graph);

std::cout << "original graph:" << std::endl;
print_graph(graph, get(vertex_index, graph));

std::cout << std::endl << "reversed graph:" << std::endl;
print_graph(reversed_graph, get(vertex_index, graph));

auto range = edges(reversed_graph);
std::for_each(range.first,range.second,[&](const auto& item){
    std::cout << reversed_graph[item].index << '\n';
});

return EXIT_SUCCESS;
}

error message In file included from prog.cc:9: /opt/wandbox/boost-1.67.0/clang-6.0.0/include/boost/graph/reverse_graph.hpp:149:14: error: binding value of type 'const boost::adjacency_list::edge_bundled' (aka 'const edgeinfo') to reference to type 'typename graph::detail::bundled_result, typename detail::get_underlying_descriptor_from_reverse_descriptor > >::type>::type' (aka 'edgeinfo') drops 'const' qualifier { return m_g[detail::get_underlying_descriptor_from_reverse_descriptor::convert(x)]; } ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ prog.cc:61:22: note: in instantiation of function template specialization 'boost::reverse_graph, const boost::adjacency_list &>::operator[] > >' requested here std::cout << reversed_graph[item].index << '\n'; ^ prog.cc:60:10: note: in instantiation of function template specialization 'std::__1::for_each >, boost::detail::undirected_edge_iter, void *>, boost::detail::edge_desc_impl, long>, boost::iterators::use_default, boost::iterators::use_default>, (lambda at prog.cc:60:44)>' requested here std::for_each(range.first,range.second,[&](const auto& item){

Aucun commentaire:

Enregistrer un commentaire