BGL indexando um vértice por chaves
Meu requisito é ter uma estrutura gráfica em que cada vértice seja identificado exclusivamente por umboost::uuids::uuid
. Todos os vértices têm uma propriedade de cor pela qual os vértices de categoria semelhante serão agrupados. Não estou trabalhando em um mapa estático, vértices e bordas serão criados e removidos dinamicamente.
typedef boost::adjacency_list<
boost::listS,
boost::listS,
boost::bidirectionalS,
boost::property<boost::vertex_index_t, boost::uuids::uuid,
boost::property<boost::vertex_color_t, resource_color,
boost::property<boost::vertex_underlying_t, boost::shared_ptr<actual_object*> > > >,
detail::edge_property
> graph_type;
graph_type _graph;
boost::property_map<graph_type, boost::vertex_index_t>::type _index_map;
boost::property_map<graph_type, boost::vertex_color_t>::type _color_map;
boost::property_map<graph_type, boost::vertex_underlying_t>::type _underlying_map;
Noconstrutor Estou criando todos os 3 mapas
_index_map = boost::get(boost::vertex_index_t(), _graph);
_color_map = boost::get(boost::vertex_color_t(), _graph);
_underlying_map = boost::get(boost::vertex_underlying_t(), _graph);
enquantoadicionando um vértice
add_resource(resource_color c, actual_object* o){
graph_type::vertex_descriptor v = boost::add_vertex(o->uuid(), _graph);
_color_map[v] = c;
_underlying_map[v] = o;
}
ParaListaUUID de um vértice
uuid_list list;
boost::graph_traits<graph_type>::vertex_iterator vi, vi_end;
for(boost::tie(vi, vi_end) = boost::vertices(_graph); vi != vi_end; ++vi){
list.push_back(_index_map[*vi]);
}
return list;
Desta forma, eu estou sempre iterando através dos vértices do gráfico e obtendo suas propriedades. No entanto, eu quero o outro caminho também. Do UUID ao vértice, como um std :: map paralelo, que será atualizado automaticamente com operações de adição / remoção ou algo semelhante.
Também não consigo manter um externostd::map
e sincronizar manualmente, porqueboost::adjacency_list<boost::listS, boost::listS>::vertex_descriptor
avalia comovoid*
e preciso de suporte de serialização.
Então, as seguintes coisas são factíveis
encontre o vértice atravésboost::vertex_index_t
valoriterar através de umboost::property_map
sincronizando um externostd::map
oubimap
comindex
propriedade