GraphDom
Loading...
Searching...
No Matches
full_labeled_set_ugraph.h
1/*
2 * Copyright 2026 Michele Comparini
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef GRAPHDOM_FULL_LABELED_SET_UGRAPH_IMPL_H
8#define GRAPHDOM_FULL_LABELED_SET_UGRAPH_IMPL_H
9
10#include "../full_labeled_set_ugraph.h"
11
12template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
14full_labeled_set_ugraph(const Compare& v_comp, const VertexLabellerType& v_lab, const EdgeLabellerType& e_lab) :
15labeled_vertex_set_graph<VertexType,VertexLabelType,VertexLabellerType>(v_lab),
16labeled_edge_non_mixed_graph<VertexType,EdgeLabelType,EdgeLabellerType>(e_lab),
17vertices( custom_vertices_set_compare(v_comp) ) {}
18
19template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
21full_labeled_set_ugraph(const Compare& v_comp, const VertexLabellerType& v_lab, EdgeLabellerType&& e_lab) :
22labeled_vertex_set_graph<VertexType,VertexLabelType,VertexLabellerType>(v_lab),
23labeled_edge_non_mixed_graph<VertexType,EdgeLabelType,EdgeLabellerType>(std::move(e_lab)),
24vertices( custom_vertices_set_compare(v_comp) ) {}
25
26template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
28full_labeled_set_ugraph(const Compare& v_comp, VertexLabellerType&& v_lab, const EdgeLabellerType& e_lab) :
29labeled_vertex_set_graph<VertexType,VertexLabelType,VertexLabellerType>(std::move(v_lab)),
30labeled_edge_non_mixed_graph<VertexType,EdgeLabelType,EdgeLabellerType>(e_lab),
31vertices( custom_vertices_set_compare(v_comp) ) {}
32
33template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
35full_labeled_set_ugraph(const Compare& v_comp, VertexLabellerType&& v_lab, EdgeLabellerType&& e_lab) :
36labeled_vertex_set_graph<VertexType,VertexLabelType,VertexLabellerType>(std::move(v_lab)),
37labeled_edge_non_mixed_graph<VertexType,EdgeLabelType,EdgeLabellerType>(std::move(e_lab)),
38vertices( custom_vertices_set_compare(v_comp) ) {}
39
40template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
42full_labeled_set_ugraph(Compare&& v_comp, const VertexLabellerType& v_lab, const EdgeLabellerType& e_lab) :
43labeled_vertex_set_graph<VertexType,VertexLabelType,VertexLabellerType>(v_lab),
44labeled_edge_non_mixed_graph<VertexType,EdgeLabelType,EdgeLabellerType>(e_lab),
45vertices( custom_vertices_set_compare(std::move(v_comp)) ) {}
46
47template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
49full_labeled_set_ugraph(Compare&& v_comp, const VertexLabellerType& v_lab, EdgeLabellerType&& e_lab) :
50labeled_vertex_set_graph<VertexType,VertexLabelType,VertexLabellerType>(v_lab),
51labeled_edge_non_mixed_graph<VertexType,EdgeLabelType,EdgeLabellerType>(std::move(e_lab)),
52vertices( custom_vertices_set_compare(std::move(v_comp)) ) {}
53
54template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
56full_labeled_set_ugraph(Compare&& v_comp, VertexLabellerType&& v_lab, const EdgeLabellerType& e_lab) :
57labeled_vertex_set_graph<VertexType,VertexLabelType,VertexLabellerType>(std::move(v_lab)),
58labeled_edge_non_mixed_graph<VertexType,EdgeLabelType,EdgeLabellerType>(e_lab),
59vertices( custom_vertices_set_compare(std::move(v_comp)) ) {}
60
61template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
63full_labeled_set_ugraph(Compare&& v_comp, VertexLabellerType&& v_lab, EdgeLabellerType&& e_lab) :
64labeled_vertex_set_graph<VertexType,VertexLabelType,VertexLabellerType>(std::move(v_lab)),
65labeled_edge_non_mixed_graph<VertexType,EdgeLabelType,EdgeLabellerType>(std::move(e_lab)),
66vertices( custom_vertices_set_compare(std::move(v_comp)) ) {}
67
68template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
71 for (auto ugraph_vertices_itr = vertices.begin(); ugraph_vertices_itr != vertices.end(); ++ugraph_vertices_itr) {
72 auto& ugv_itr_vertex_container = *ugraph_vertices_itr;
73 auto& ugv_itr_vc_adj = ugv_itr_vertex_container.adj;
74 for (auto edge_endpoint_to_deallocate = ugv_itr_vc_adj.begin(); edge_endpoint_to_deallocate != ugv_itr_vc_adj.end(); ++edge_endpoint_to_deallocate) {
75 safe_edge_endpoint_deallocation(*edge_endpoint_to_deallocate); // This is to avoid memory leaks
76 }
77 ugv_itr_vc_adj.clear();
78 }
79}
80
81template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
85
86template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
88 const typename graph<VertexType>::vertex_const_handle& vertex) const {
89 if ( graphdom::graph<VertexType>::get_owner_graph(vertex) != this ) {
90 throw std::runtime_error("Error"); //TODO: write a better message
91 }
92 const auto* const vertex_container_ptr = static_cast< const vertex_container* >( graphdom::graph< VertexType >::get_vertex_container( vertex ) );
93 return vertex_container_ptr->vertex_label;
94}
95
96template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
98const typename graph<VertexType>::adj_list_const_iterator& edge) const {
99 if ( graphdom::graph<VertexType>::get_owner_graph( edge ) != this ) {
100 throw std::runtime_error("Error"); //TODO: write a better message
101 }
102 return
103 *(
104 (
105 *(
106 static_cast<edge_endpoint*>(
108 )
109 )
110 ).edge_label_ptr
111 );
112}
113
114template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
116 const typename graphdom::graph<VertexType>::vertex_const_handle& const_vertex_ptr) {
117 if ( graphdom::graph<VertexType>::get_owner_graph(const_vertex_ptr) == this ) {
118 const auto* const vertex_container_to_erase_ptr =
119 static_cast< const vertex_container* >( graphdom::graph<VertexType>::get_vertex_container(const_vertex_ptr) );
120 if ( vertex_container_to_erase_ptr != nullptr ) {
121 const auto vertex_container_to_erase_found_vertices_itr = vertices.find( *vertex_container_to_erase_ptr );
122 auto& vertex_container_to_erase_adj = ( *vertex_container_to_erase_found_vertices_itr ).adj;
123 for (auto vertex_container_to_erase_adj_itr = vertex_container_to_erase_adj.begin();
124 vertex_container_to_erase_adj_itr != vertex_container_to_erase_adj.end();
125 ++vertex_container_to_erase_adj_itr) {
126 const auto& edge_endpoint_vertex_container =
127 *(
128 static_cast< const vertex_container* >(
129 (
130 *(
131 *(
132 vertex_container_to_erase_adj_itr
133 )
134 )
135 ).vertex_container_ptr
136 )
137 );
138 if ( ( &edge_endpoint_vertex_container ) != vertex_container_to_erase_ptr ) { //The edge could be a loop
139 auto& edge_endpoint_vertex_container_adj = edge_endpoint_vertex_container.adj;
140 const auto vertex_container_to_erase_founded_in_edge_endpoint_vertex_container_adj =
141 edge_endpoint_vertex_container_adj.find( vertex_container_to_erase_ptr );
142 safe_edge_endpoint_deallocation( *vertex_container_to_erase_founded_in_edge_endpoint_vertex_container_adj );
143 edge_endpoint_vertex_container_adj.erase( vertex_container_to_erase_founded_in_edge_endpoint_vertex_container_adj );
144 }
145 safe_edge_endpoint_deallocation( *vertex_container_to_erase_adj_itr );
146 }
147 vertices.erase(vertex_container_to_erase_found_vertices_itr);
148 }
149 //TODO:: Evaluate a possible exception throw HERE
150 }
151 //TODO:: Evaluate a possible exception throw HERE
152}
153
154template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
155typename graphdom::graph<VertexType>::adj_list_iterator
157 const typename graph<VertexType>::adj_list_const_iterator& edge_itr) {
158 if ( graphdom::graph<VertexType>::get_owner_graph(edge_itr) != this ) {
159 throw std::runtime_error("Error"); //TODO: write a better message
160 }
161 auto const edge_itr_begin_point = static_cast< const vertex_container* >( graphdom::graph<VertexType>::get_begin_point( edge_itr ) );
162 auto inner_iterator_of_begin_point_adj = graphdom::set_graph<VertexType>::get_inner_iterator( edge_itr );
163 auto const edge_itr_endpoint = static_cast< const vertex_container* >( ( *( *inner_iterator_of_begin_point_adj ) ).vertex_container_ptr );
164 if ( edge_itr_begin_point != edge_itr_endpoint ) { //The edge could be a loop
165 auto inner_iterator_of_end_point_adj = ( (*edge_itr_endpoint).adj ).find( edge_itr_begin_point );
166 safe_edge_endpoint_deallocation(*inner_iterator_of_end_point_adj);
167 ( (*edge_itr_endpoint).adj ).erase( inner_iterator_of_end_point_adj );
168 }
169 safe_edge_endpoint_deallocation(*inner_iterator_of_begin_point_adj);
171 this,
172 edge_itr_begin_point,
174 ( (*edge_itr_begin_point).adj ).erase( inner_iterator_of_begin_point_adj )
175 );
176}
177
178template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
180 const typename graph<VertexType>::vertex_const_handle& vertex) {
181 if ( graphdom::graph<VertexType>::get_owner_graph(vertex) != this ) {
182 throw std::runtime_error("Error"); //TODO: write a better message
183 }
184 const auto* const vertex_container_ptr = static_cast< const vertex_container* >( graphdom::graph< VertexType >::get_vertex_container( vertex ) );
185 return const_cast< VertexLabelType& >( (*vertex_container_ptr).vertex_label );
186}
187
188template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
189std::pair<typename graphdom::graph<VertexType>::vertex_handle,bool>
191 const VertexType& v_core, const VertexLabelType& vertex_label) {
192 auto inner_insertion_result = vertices.emplace(
193 v_core,
194 vertex_label
195 );
196 return std::pair<typename graphdom::graph<VertexType>::vertex_handle, bool>(
197 graphdom::graph<VertexType>::vertex_handle_factory(
198 this,
199 *(inner_insertion_result.first),
201 ),
202 inner_insertion_result.second
203 );
204}
205
206template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
207std::pair<typename graphdom::graph<VertexType>::vertex_handle,bool>
209const VertexType& v_core, VertexLabelType&& vertex_label) {
210 const auto lower_bound = vertices.lower_bound(v_core);
211 if ( lower_bound == vertices.cend() ) {
212 return std::pair<typename graphdom::graph<VertexType>::vertex_handle, bool>(
213 graphdom::graph<VertexType>::vertex_handle_factory(
214 this,
215 *( vertices.emplace_hint(lower_bound, v_core, std::move(vertex_label)) ),
217 ),
218 true
219 );
220 }
221 if ( ( vertices.key_comp() )( v_core, *lower_bound ) ) {
222 return std::pair<typename graphdom::graph<VertexType>::vertex_handle, bool>(
223 graphdom::graph<VertexType>::vertex_handle_factory(
224 this,
225 *( vertices.emplace_hint(lower_bound, v_core, std::move(vertex_label)) ),
227 ),
228 true
229 );
230 }
231 return std::pair<typename graphdom::graph<VertexType>::vertex_handle, bool>(
232 graphdom::graph<VertexType>::vertex_handle_factory(
233 this,
234 *( lower_bound ),
236 ),
237 false
238 );
239}
240
241template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
242std::pair<typename graphdom::graph<VertexType>::vertex_handle,bool>
244VertexType&& v_core, const VertexLabelType& vertex_label) {
245 const auto lower_bound = vertices.lower_bound(v_core);
246 if ( lower_bound == vertices.cend() ) {
247 return std::pair<typename graphdom::graph<VertexType>::vertex_handle, bool>(
248 graphdom::graph<VertexType>::vertex_handle_factory(
249 this,
250 *( vertices.emplace_hint(lower_bound, std::move(v_core), vertex_label) ),
252 ),
253 true
254 );
255 }
256 if ( ( vertices.key_comp() )( v_core, *lower_bound ) ) {
257 return std::pair<typename graphdom::graph<VertexType>::vertex_handle, bool>(
258 graphdom::graph<VertexType>::vertex_handle_factory(
259 this,
260 *( vertices.emplace_hint(lower_bound, std::move(v_core), vertex_label) ),
262 ),
263 true
264 );
265 }
266 return std::pair<typename graphdom::graph<VertexType>::vertex_handle, bool>(
267 graphdom::graph<VertexType>::vertex_handle_factory(
268 this,
269 *( lower_bound ),
271 ),
272 false
273 );
274}
275
276template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
277std::pair<typename graphdom::graph<VertexType>::vertex_handle,bool>
279VertexType&& v_core, VertexLabelType&& vertex_label) {
280 const auto lower_bound = vertices.lower_bound(v_core);
281 if ( lower_bound == vertices.cend() ) {
282 return std::pair<typename graphdom::graph<VertexType>::vertex_handle, bool>(
283 graphdom::graph<VertexType>::vertex_handle_factory(
284 this,
285 *( vertices.emplace_hint(lower_bound, std::move(v_core), std::move(vertex_label)) ),
287 ),
288 true
289 );
290 }
291 if ( ( vertices.key_comp() )( v_core, *lower_bound ) ) {
292 return std::pair<typename graphdom::graph<VertexType>::vertex_handle, bool>(
293 graphdom::graph<VertexType>::vertex_handle_factory(
294 this,
295 *( vertices.emplace_hint(lower_bound, std::move(v_core), std::move(vertex_label)) ),
297 ),
298 true
299 );
300 }
301 return std::pair<typename graphdom::graph<VertexType>::vertex_handle, bool>(
302 graphdom::graph<VertexType>::vertex_handle_factory(
303 this,
304 *( lower_bound ),
306 ),
307 false
308 );
309}
310
311template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
313 const typename graph<VertexType>::adj_list_const_iterator& edge ) {
314 if ( graphdom::graph<VertexType>::get_owner_graph( edge ) != this ) {
315 throw std::runtime_error("Error"); //TODO: write a better message
316 }
317 return
318 *(
319 (
320 *(
321 static_cast<edge_endpoint*>(
323 )
324 )
325 ).edge_label_ptr
326 );
327}
328
329template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
331 const typename graph<VertexType>::vertex_const_handle& first_endpoint,
332 const typename graph<VertexType>::vertex_const_handle& second_endpoint,
333 const EdgeLabelType& edge_label) {
334 if (
335 graphdom::graph<VertexType>::get_owner_graph( first_endpoint ) != this ||
336 graphdom::graph<VertexType>::get_owner_graph( second_endpoint ) != this
337 ) {
338 throw std::runtime_error("Error"); //TODO: write a better message
339 }
340 auto const begin_point_vertex_container = static_cast< const vertex_container* >( graphdom::graph<VertexType>::get_vertex_container( first_endpoint ) );
341 auto const end_point_vertex_container = static_cast< const vertex_container* >( graphdom::graph<VertexType>::get_vertex_container( second_endpoint ) );
342 if ( begin_point_vertex_container == nullptr || end_point_vertex_container == nullptr ) {
343 throw std::runtime_error("Error"); //TODO: write a better message
344 }
345 std::unique_ptr< edge_endpoint > edge_endpoint_to_insert_in_begin_point_adj( new edge_endpoint( end_point_vertex_container , edge_label ) );
346 const auto inner_insertion_result_in_begin_point_adj = ( begin_point_vertex_container->adj ).insert( edge_endpoint_to_insert_in_begin_point_adj.get() );
347 if ( inner_insertion_result_in_begin_point_adj.second ) {
348 edge_endpoint_to_insert_in_begin_point_adj.release();
349 if ( begin_point_vertex_container != end_point_vertex_container ) { //The edge could be a loop
350 std::unique_ptr< edge_endpoint > edge_endpoint_to_insert_in_end_point_adj(
351 new edge_endpoint(
352 begin_point_vertex_container ,
353 ( static_cast< edge_endpoint* >( *( inner_insertion_result_in_begin_point_adj.first ) ) )->edge_label_ptr
354 )
355 );
356 const auto inner_insertion_result_in_end_point_adj = ( ( end_point_vertex_container->adj ).insert( edge_endpoint_to_insert_in_end_point_adj.get() ) ).second;
357 if ( inner_insertion_result_in_end_point_adj ) {
358 edge_endpoint_to_insert_in_end_point_adj.release();
359 }
360 else {
361 safe_edge_endpoint_deallocation( *( inner_insertion_result_in_begin_point_adj.first ) );
362 ( begin_point_vertex_container->adj ).erase( inner_insertion_result_in_begin_point_adj.first );
363 }
364 }
365 }
366}
367
368template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
370 const typename graph<VertexType>::vertex_const_handle& first_endpoint,
371 const typename graph<VertexType>::vertex_const_handle& second_endpoint,
372 EdgeLabelType&& edge_label) {
373 if (
374 graphdom::graph<VertexType>::get_owner_graph( first_endpoint ) != this ||
375 graphdom::graph<VertexType>::get_owner_graph( second_endpoint ) != this
376 ) {
377 throw std::runtime_error("Error"); //TODO: write a better message
378 }
379 auto const begin_point_vertex_container = static_cast< const vertex_container* >( graphdom::graph<VertexType>::get_vertex_container( first_endpoint ) );
380 auto const end_point_vertex_container = static_cast< const vertex_container* >( graphdom::graph<VertexType>::get_vertex_container( second_endpoint ) );
381 if ( begin_point_vertex_container == nullptr || end_point_vertex_container == nullptr ) {
382 throw std::runtime_error("Error"); //TODO: write a better message
383 }
384 const auto lower_bound = ( begin_point_vertex_container->adj ).lower_bound( end_point_vertex_container );
385 if ( lower_bound == ( begin_point_vertex_container->adj ).cend() ) {
386 const auto first_insertion_itr = ( begin_point_vertex_container->adj ).emplace_hint( lower_bound, new edge_endpoint( end_point_vertex_container , std::move(edge_label) ) );
387 if ( begin_point_vertex_container != end_point_vertex_container ) { //The edge could be a loop
388 ( end_point_vertex_container->adj ).emplace( new edge_endpoint( begin_point_vertex_container, static_cast< const edge_endpoint* >( *first_insertion_itr )->edge_label_ptr ) );
389 }
390 }
391 else {
392 if ( ( ( begin_point_vertex_container->adj ).key_comp() )( end_point_vertex_container, *lower_bound ) ) {
393 const auto first_insertion_itr = ( begin_point_vertex_container->adj ).emplace_hint( lower_bound, new edge_endpoint( end_point_vertex_container , std::move(edge_label) ) );
394 if ( begin_point_vertex_container != end_point_vertex_container ) { //The edge could be a loop
395 ( end_point_vertex_container->adj ).emplace( new edge_endpoint( begin_point_vertex_container, static_cast< const edge_endpoint* >( *first_insertion_itr )->edge_label_ptr ) );
396 }
397 }
398 }
399 /*
400 std::unique_ptr< edge_endpoint > edge_endpoint_to_insert_in_begin_point_adj( new edge_endpoint( end_point_vertex_container , std::move(edge_label_to_insert) ) );
401 const auto inner_insertion_result_in_begin_point_adj = ( begin_point_vertex_container->adj ).insert( edge_endpoint_to_insert_in_begin_point_adj.get() );
402 if ( inner_insertion_result_in_begin_point_adj.second ) {
403 edge_endpoint_to_insert_in_begin_point_adj.release();
404 if ( begin_point_vertex_container != end_point_vertex_container ) { //The edge could be a loop
405 std::unique_ptr< edge_endpoint > edge_endpoint_to_insert_in_end_point_adj(
406 new edge_endpoint(
407 begin_point_vertex_container ,
408 ( static_cast< edge_endpoint* >( *( inner_insertion_result_in_begin_point_adj.first ) ) )->edge_label_ptr
409 )
410 );
411 const auto inner_insertion_result_in_end_point_adj = ( ( end_point_vertex_container->adj ).insert( edge_endpoint_to_insert_in_end_point_adj.get() ) ).second;
412 if ( inner_insertion_result_in_end_point_adj ) {
413 edge_endpoint_to_insert_in_end_point_adj.release();
414 }
415 else {
416 safe_edge_endpoint_deallocation( *( inner_insertion_result_in_begin_point_adj.first ) );
417 ( begin_point_vertex_container->adj ).erase( inner_insertion_result_in_begin_point_adj.first );
418 }
419 }
420 }
421 */
422}
423
424template<typename VertexType, typename VertexLabelType, typename EdgeLabelType, typename Compare, typename VertexLabellerType, typename EdgeLabellerType>
427 typename graphdom::graph<VertexType>::template edge_endpoint<VertexContainerPointerType>* ee_ptr) {
428 delete static_cast<edge_endpoint*>(ee_ptr);
429}
430
431#endif //GRAPHDOM_FULL_LABELED_SET_UGRAPH_IMPL_H
Definition full_labeled_set_ugraph.h:37
std::size_t order() const override
Returns the order of *this, i.e. the number of vertices inside the graph.
Definition full_labeled_set_ugraph.h:82
void insert_edge(const typename graph< VertexType >::vertex_const_handle &first_endpoint, const typename graph< VertexType >::vertex_const_handle &second_endpoint, const EdgeLabelType &edge_label) override
Definition full_labeled_set_ugraph.h:330
const VertexLabelType & get_vertex_label(const typename graph< VertexType >::vertex_const_handle &vertex) const override
Definition full_labeled_set_ugraph.h:87
void erase_vertex(const typename graphdom::graph< VertexType >::vertex_const_handle &) override
Removes the vertex identified by vertex.
Definition full_labeled_set_ugraph.h:115
const EdgeLabelType & get_edge_label(const typename graph< VertexType >::adj_list_const_iterator &) const override
Definition full_labeled_set_ugraph.h:97
graphdom::graph< VertexType >::adj_list_iterator erase_edge(const typename graph< VertexType >::adj_list_const_iterator &) override
Definition full_labeled_set_ugraph.h:156
std::pair< typename graph< VertexType >::vertex_handle, bool > insert_vertex(const VertexType &v_core, const VertexLabelType &vertex_label) override
Definition full_labeled_set_ugraph.h:190
Every valid instance of this class can be used to identify a specific vertex of a graph and to access...
Definition vertex_const_handle.h:35
Every graph created using this library is an instance of a concrete class publicly derived,...
Definition graph.h:43
Every set graph created using this library is an instance of a concrete class publicly derived,...
Definition set_graph.h:18
@ undirected
This enum value means undirected edge.
Definition graph.h:22