1use std::collections::HashSet;
3use std::{cell::RefCell, cmp::PartialEq, fmt::Debug, hash::Hash, rc::Rc};
4
5use dot::GraphWalk;
6
7use super::graph_dcel::{Dart, Face, GraphDCEL, Vertex};
8
9macro_rules! impl_non_recursive_eq {
10 ($struct:ident) => {
11 impl PartialEq for $struct {
12 fn eq(&self, other: &Self) -> bool {
13 self.id == other.id
14 }
15 }
16 impl Eq for $struct {}
17 };
18}
19
20macro_rules! impl_non_recursive_debug {
21 ($struct:ident, $name:expr) => {
22 impl Debug for $struct {
23 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24 f.debug_struct($name).field("id", &self.id).finish()
25 }
26 }
27 };
28}
29
30macro_rules! impl_inner_debug {
31 ($struct:ident) => {
32 impl Debug for $struct {
33 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34 self.0.borrow().fmt(f)
35 }
36 }
37 };
38}
39
40macro_rules! impl_hash_and_eq {
41 ($struct:ident) => {
42 impl Hash for $struct {
43 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
44 self.0.borrow().id.hash(state)
45 }
46 }
47 impl PartialEq for $struct {
48 fn eq(&self, other: &Self) -> bool {
49 self.0.borrow().id == other.0.borrow().id
50 }
51 }
52 };
53}
54
55macro_rules! impl_ord {
56 ($struct:ident) => {
57 impl PartialOrd for $struct {
58 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
59 self.0.borrow().id.partial_cmp(&other.0.borrow().id)
60 }
61 }
62
63 impl Ord for $struct {
64 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
65 self.0.borrow().id.cmp(&other.0.borrow().id)
66 }
67 }
68 };
69}
70
71#[derive(Default)]
72struct LinkVertexStruct {
73 id: usize,
74 dart: Option<LinkDart>,
75}
76
77impl_non_recursive_eq!(LinkVertexStruct);
78impl Debug for LinkVertexStruct {
79 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
80 f.debug_struct("LinkVertex")
81 .field("id", &self.id)
82 .field("dart", &self.dart.as_ref().map(|dart| dart.0.borrow().id))
83 .finish()
84 }
85}
86
87#[derive(Clone, Default, Eq)]
89pub struct LinkVertex(Rc<RefCell<LinkVertexStruct>>);
90
91impl LinkVertex {
92 fn new(id: usize) -> LinkVertex {
93 LinkVertex(Rc::new(RefCell::new(LinkVertexStruct {
94 id,
95 ..Default::default()
96 })))
97 }
98
99 pub fn get_id(&self) -> usize {
101 return self.0.clone().borrow().id;
102 }
103}
104
105impl_inner_debug!(LinkVertex);
106impl_hash_and_eq!(LinkVertex);
107impl_ord!(LinkVertex);
108impl Vertex for LinkVertex {}
109
110#[derive(Default, Clone)]
111struct LinkDartStructure {
112 id: usize,
113 target: LinkVertex,
114 twin: Option<LinkDart>,
115 next: Option<LinkDart>,
116 prev: Option<LinkDart>,
117 face: Option<LinkFace>,
118}
119
120impl_non_recursive_eq!(LinkDartStructure);
121impl Debug for LinkDartStructure {
122 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
123 f.debug_struct("LinkDart")
124 .field("id", &self.id)
125 .field("target", &self.target.0.borrow().id)
126 .field(
127 "next_id",
128 &self.next.as_ref().map(|next| next.0.borrow().id),
129 )
130 .field(
131 "prev_id",
132 &self.prev.as_ref().map(|prev| prev.0.borrow().id),
133 )
134 .field(
135 "twin_id",
136 &self.twin.as_ref().map(|twin| twin.0.borrow().id),
137 )
138 .field(
139 "face_id",
140 &self.face.as_ref().map(|twin| twin.0.borrow().id),
141 )
142 .finish()
143 }
144}
145
146#[derive(Clone, Default, Eq)]
148pub struct LinkDart(Rc<RefCell<LinkDartStructure>>);
149
150impl_inner_debug!(LinkDart);
151impl_hash_and_eq!(LinkDart);
152impl_ord!(LinkDart);
153impl Dart for LinkDart {}
154
155impl LinkDart {
156 fn new(id: usize, target: LinkVertex) -> LinkDart {
157 LinkDart(Rc::new(RefCell::new(LinkDartStructure {
158 id,
159 target,
160 ..Default::default()
161 })))
162 }
163
164 pub fn get_id(&self) -> usize {
166 return self.0.clone().borrow().id;
167 }
168
169 pub fn change_face(
171 &mut self,
172 face: Option<LinkFace>,
173 prev: Option<LinkDart>,
174 next: Option<LinkDart>,
175 ) {
176 let mut dart = self.0.borrow_mut();
177 dart.face = face;
178 dart.prev = prev;
179 dart.next = next;
180 }
181}
182
183#[derive(Default)]
184struct LinkFaceStructure {
185 id: usize,
186 dart: LinkDart,
187}
188
189impl_non_recursive_eq!(LinkFaceStructure);
190impl_non_recursive_debug!(LinkFaceStructure, "LinkFace");
191
192#[derive(Clone, Default, Eq)]
194pub struct LinkFace(Rc<RefCell<LinkFaceStructure>>);
195
196impl_inner_debug!(LinkFace);
197impl_hash_and_eq!(LinkFace);
198impl_ord!(LinkFace);
199impl Face for LinkFace {}
200
201impl LinkFace {
202 fn new(id: usize, dart: LinkDart) -> LinkFace {
203 LinkFace(Rc::new(RefCell::new(LinkFaceStructure { id, dart })))
204 }
205
206 pub fn get_id(&self) -> usize {
208 return self.0.clone().borrow().id;
209 }
210}
211
212pub struct LinkGraph {
214 id_counter: usize,
215 vertexes: Vec<LinkVertex>,
216 darts: Vec<LinkDart>,
217 faces: Vec<LinkFace>,
218 #[cfg(feature = "debug_link_graph_panic_on_double_edges")]
219 created_darts: HashSet<(usize, usize)>,
220}
221
222pub struct LinkGraphIter<T: Clone> {
224 counter: usize,
225 inner: Vec<T>,
226}
227
228impl<T: Clone> LinkGraphIter<T> {
229 fn new(inner: Vec<T>) -> LinkGraphIter<T> {
230 LinkGraphIter { counter: 0, inner }
231 }
232}
233
234impl<T: Clone> Iterator for LinkGraphIter<T> {
235 type Item = T;
236
237 fn next(&mut self) -> Option<Self::Item> {
238 let i = self.counter;
239 self.counter += 1;
240 self.inner.get(i).cloned()
241 }
242}
243
244impl
245 GraphDCEL<
246 LinkVertex,
247 LinkDart,
248 LinkFace,
249 LinkGraphIter<LinkVertex>,
250 LinkGraphIter<LinkDart>,
251 LinkGraphIter<LinkFace>,
252 > for LinkGraph
253{
254 fn get_vertexes(&self) -> LinkGraphIter<LinkVertex> {
255 LinkGraphIter::new(self.vertexes.clone())
256 }
257 fn get_darts(&self) -> LinkGraphIter<LinkDart> {
258 LinkGraphIter::new(self.darts.clone())
259 }
260 fn get_faces(&self) -> LinkGraphIter<LinkFace> {
261 LinkGraphIter::new(self.faces.clone())
262 }
263
264 fn vertex_count(&self) -> usize {
265 self.vertexes.len()
266 }
267
268 fn dart_count(&self) -> usize {
269 self.darts.len()
270 }
271
272 fn edge_count(&self) -> usize {
273 self.dart_count() / 2
274 }
275
276 fn face_count(&self) -> usize {
277 self.faces.len()
278 }
279
280 fn face_vertex_count(&self, face: &LinkFace) -> usize {
281 let mut count = 1;
282 let dart = self.dart_face(face);
283 let mut current_dart = dart.clone();
284
285 loop {
286 current_dart = self.next(¤t_dart);
287
288 if current_dart == dart {
289 break count;
290 }
291
292 count += 1;
293 }
294 }
295
296 fn neighbors_count(&self, vertex: &LinkVertex) -> usize {
297 self.neighbors(vertex).len()
298 }
299
300 fn neighbors(&self, vertex: &LinkVertex) -> Vec<LinkVertex> {
301 let mut current_dart = self.dart_vertex(vertex);
302 let first_dart = current_dart.clone();
303 let mut current_neighbor = self.dart_target(¤t_dart);
304 let mut result = vec![];
305 loop {
306 result.push(current_neighbor);
307 let twin_dart = self.twin(¤t_dart);
308 current_dart = self.next(&twin_dart);
309 if current_dart == first_dart {
310 break;
311 }
312 current_neighbor = self.dart_target(¤t_dart);
313 }
314 result
315 }
316
317 fn get_dart(&self, vertex: &LinkVertex, target: &LinkVertex) -> Option<LinkDart> {
318 let first_dart = self.dart_vertex(vertex);
319 let mut dart = first_dart.clone();
320
321 loop {
322 if &self.target(&dart.clone()) == target {
323 break Some(dart);
324 }
325
326 dart = self.next(&self.twin(&dart));
327 if dart.clone() == first_dart.clone() {
328 break None;
329 }
330 }
331 }
332
333 fn dart_vertex(&self, vertex: &LinkVertex) -> LinkDart {
334 vertex.0.borrow().dart.clone().unwrap()
335 }
336
337 fn dart_face(&self, face: &LinkFace) -> LinkDart {
338 face.0.borrow().dart.clone()
339 }
340
341 fn twin(&self, dart: &LinkDart) -> LinkDart {
342 dart.0.borrow().twin.clone().unwrap()
343 }
344
345 fn dart_target(&self, dart: &LinkDart) -> LinkVertex {
346 dart.0.borrow().target.clone()
347 }
348
349 fn face(&self, dart: &LinkDart) -> LinkFace {
350 dart.0.borrow().face.clone().unwrap()
351 }
352
353 fn next(&self, current: &LinkDart) -> LinkDart {
354 current.0.borrow().next.clone().unwrap()
355 }
356
357 fn prev(&self, current: &LinkDart) -> LinkDart {
358 current.0.borrow().prev.clone().unwrap()
359 }
360
361 fn add_vertex(&mut self) -> LinkVertex {
362 self.new_vertex()
363 }
364
365 fn add_dart(
366 &mut self,
367 from: LinkVertex,
368 to: LinkVertex,
369 prev: Option<LinkDart>,
370 next: Option<LinkDart>,
371 twin: Option<LinkDart>,
372 face: Option<LinkFace>,
373 ) -> LinkDart {
374 self.new_dart(from, to, prev, next, twin, face)
375 }
376
377 fn add_face(&mut self, dart: LinkDart) -> LinkFace {
378 self.new_face(dart)
379 }
380
381 fn set_face(&self, dart: &LinkDart, face: LinkFace) {
382 dart.0.borrow_mut().face = Some(face);
383 }
384
385 fn vertex_by_id(&self, id: usize) -> Option<LinkVertex> {
386 self.vertexes.iter().find(|v| v.get_id() == id).cloned()
387 }
388}
389
390impl LinkGraph {
391 pub fn new() -> LinkGraph {
393 LinkGraph {
394 id_counter: 0,
395 vertexes: Vec::new(),
396 darts: Vec::new(),
397 faces: Vec::new(),
398 #[cfg(feature = "debug_link_graph_panic_on_double_edges")]
399 created_darts: HashSet::new(),
400 }
401 }
402 fn next_id(&mut self) -> usize {
403 let id = self.id_counter;
404 self.id_counter += 1;
405 id
406 }
407
408 pub fn new_vertex(&mut self) -> LinkVertex {
410 let lv = LinkVertex::new(self.next_id());
411 self.vertexes.push(lv.clone());
412 lv
413 }
414
415 pub fn new_dart(
417 &mut self,
418 from: LinkVertex,
419 to: LinkVertex,
420 prev: Option<LinkDart>,
421 next: Option<LinkDart>,
422 twin: Option<LinkDart>,
423 face: Option<LinkFace>,
424 ) -> LinkDart {
425 let ld = LinkDart::new(self.next_id(), to);
426
427 let prev_dart = match prev {
428 Some(prev_dart) => prev_dart,
429 None => next
430 .clone()
431 .and_then(|next| next.0.borrow().prev.clone())
432 .unwrap_or_else(|| ld.clone()),
433 };
434 let next_dart = match next {
435 Some(next_dart) => next_dart,
436 None => prev_dart
437 .0
438 .borrow()
439 .next
440 .clone()
441 .unwrap_or_else(|| ld.clone()),
442 };
443
444 next_dart.0.borrow_mut().prev = Some(ld.clone());
445 ld.0.borrow_mut().next = Some(next_dart);
446 prev_dart.0.borrow_mut().next = Some(ld.clone());
447 ld.0.borrow_mut().prev = Some(prev_dart);
448
449 match twin {
450 Some(twin_dart) => {
451 twin_dart.0.borrow_mut().twin = Some(ld.clone());
452 ld.0.borrow_mut().twin = Some(twin_dart);
453 }
454 None => {}
455 };
456 match face {
457 Some(link_face) => {
458 ld.0.borrow_mut().face = Some(link_face);
459 }
460 None => {}
461 }
462 self.darts.push(ld.clone());
463 from.0.borrow_mut().dart = Some(ld.clone());
464 ld
465 }
466
467 pub fn new_face(&mut self, dart: LinkDart) -> LinkFace {
469 let lv = LinkFace::new(self.next_id(), dart.clone());
470 self.faces.push(lv.clone());
471 dart.0.borrow_mut().face = Some(lv.clone());
472 lv
473 }
474
475 pub fn new_edge(
477 &mut self,
478 from: LinkVertex,
479 to: LinkVertex,
480 prev: Option<LinkDart>,
481 next: Option<LinkDart>,
482 face: Option<LinkFace>,
483 twin_face: Option<LinkFace>,
484 ) -> (LinkDart, LinkDart) {
485 #[cfg(feature = "debug_link_graph_panic_on_double_edges")]
486 {
487 let edge_pair = (
488 from.get_id().min(to.get_id()),
489 from.get_id().max(to.get_id()),
490 );
491 if self.created_darts.contains(&edge_pair) {
492 panic!(
493 "dart from {} to {} already exists",
494 from.get_id(),
495 to.get_id()
496 );
497 }
498 self.created_darts.insert(edge_pair);
499 }
500 let dart = self.new_dart(
501 from.clone(),
502 to.clone(),
503 prev.clone(),
504 next.clone(),
505 None,
506 face,
507 );
508 let twin = self.new_dart(
509 to,
510 from,
511 next.and_then(|n| n.0.borrow().twin.clone()),
512 prev.and_then(|n| n.0.borrow().twin.clone()),
513 Some(dart.clone()),
514 twin_face,
515 );
516 (dart, twin)
517 }
518
519 fn remove_dart(
520 &mut self,
521 from: &LinkVertex,
522 dart: LinkDart,
523 twin_data: LinkDartStructure,
524 ) -> LinkDart {
525 let mut dart_ref = dart.0.borrow_mut();
526 let next = dart_ref.next.take();
527 let prev = dart_ref.prev.take();
528 dart_ref.face.take();
529 drop(dart_ref);
530
531 let twin_next = twin_data.next.clone();
532 let twin_prev = twin_data.prev;
533
534 if let Some(next) = next.clone() {
535 next.0.borrow_mut().prev = twin_prev;
536 }
537 if let Some(prev) = prev {
538 prev.0.borrow_mut().next = twin_next;
539 }
540
541 if let Some(dart_pos) = self.darts.iter().position(|d| &dart == d) {
542 self.darts.remove(dart_pos);
543 }
544 from.0.borrow_mut().dart = if self.target(&next.clone().unwrap()) == *from {
545 Some(self.twin(&next.unwrap()))
546 } else {
547 next
548 };
549 dart
550 }
551
552 pub fn remove_edge(&mut self, from: &LinkVertex, dart: LinkDart) -> (LinkDart, LinkDart) {
554 let (twin, next) = {
555 let dart_ref = dart.0.borrow();
556 let twin = dart_ref.twin.clone();
557 let next = dart_ref.next.clone();
558 drop(dart_ref);
559 (twin, next)
560 };
561 let dart_data = {
562 let dart_borrow = dart.0.borrow();
563 let dart_data = dart_borrow.clone();
564 drop(dart_borrow);
565 dart_data
566 };
567 let (twin, twin_data) = if let Some(twin) = twin {
568 let twin_from = self.target(&dart);
569 let twin_data = twin.0.borrow().clone();
570 (self.remove_dart(&twin_from, twin, dart_data), twin_data)
571 } else {
572 (dart.clone(), dart.0.borrow().clone())
573 };
574 #[cfg(feature = "debug_link_graph_panic_on_double_edges")]
575 {
576 let to = twin_data.target.clone();
577 let insert_touple = (
578 from.get_id().min(to.get_id()),
579 from.get_id().max(to.get_id()),
580 );
581 self.created_darts.remove(&insert_touple);
582 }
583 let res = (self.remove_dart(from, dart, twin_data), twin);
584 if let Some(next) = next {
585 self.auto_face_dart(next);
586 }
587 res
588 }
589
590 fn validate_darts(&self) {
591 for dart in self.get_darts() {
592 let dart_inner = dart.0.borrow();
593 let next = dart_inner.next.as_ref().expect("next required");
594 self.get_darts()
595 .position(|global_dart| &global_dart == next)
596 .expect("next not found in darts");
597 let prev = dart_inner.prev.as_ref().expect("prev required");
598 self.get_darts()
599 .position(|global_dart| &global_dart == prev)
600 .expect("prev not found in darts");
601 let twin = dart_inner.twin.as_ref().expect("twin required");
602 self.get_darts()
603 .position(|global_dart| &global_dart == twin)
604 .expect("twin not found in darts");
605 dart_inner.face.as_ref().expect("face required");
606 }
607 }
608
609 fn validate_vertexes(&self) {
610 for vertex in self.get_vertexes() {
611 let vertex_inner = vertex.0.borrow();
612 let dart = vertex_inner.dart.as_ref().expect("dart required");
613 self.get_darts()
614 .position(|global_dart| &global_dart == dart)
615 .expect("dart not found in darts");
616 }
617 }
618
619 fn validate_circle<W: Fn(&LinkDart) -> LinkDart>(&self, description: &str, walk_fn: W) {
620 let max = self.edge_count() + 1;
621 for dart in &self.darts {
622 let mut current_dart = dart.clone();
623 let mut i = 0;
624 while {
625 if i > max {
626 panic!("{} does not form circle", description)
627 }
628 i += 1;
629 let last_dart = current_dart.clone();
630 current_dart = walk_fn(¤t_dart);
631 self.darts
632 .iter()
633 .position(|d| d == ¤t_dart)
634 .unwrap_or_else(|| {
635 panic!(
636 "reference to removed dart {} found on {} from {}",
637 current_dart.get_id(),
638 description,
639 last_dart.get_id()
640 )
641 });
642 dart != ¤t_dart
643 } {}
644 }
645 }
646
647 fn validate_next_circle(&self) {
648 self.validate_circle("next", |dart| {
649 dart.0.borrow().next.clone().expect("dart has no next")
650 });
651 }
652
653 fn validate_prev_circle(&self) {
654 self.validate_circle("prev", |dart| {
655 dart.0.borrow().prev.clone().expect("dart has no prev")
656 });
657 }
658
659 fn validate_twin(&self) {
660 for dart in &self.darts {
661 let twin = self.twin(dart);
662 let back = self.twin(&twin);
663 if dart != &back {
664 panic!("twin link non symmetric");
665 }
666 }
667 }
668
669 pub fn validate(&self) {
671 self.validate_darts();
672 self.validate_vertexes();
673 self.validate_prev_circle();
674 self.validate_next_circle();
675 self.validate_twin();
676 }
677
678 fn auto_face_dart(&mut self, dart: LinkDart) -> HashSet<LinkDart> {
679 let mut current_dart = dart.clone();
680 let face = self.new_face(current_dart.clone());
681 let mut visited = HashSet::new();
682 while {
683 current_dart = self.next(¤t_dart);
684 current_dart.0.borrow_mut().face = Some(face.clone());
685 visited.insert(current_dart.clone());
686 current_dart != dart
687 } {}
688 visited
689 }
690
691 pub fn auto_face(&mut self) {
693 let mut todo_darts = self.get_darts().collect::<HashSet<_>>();
694 while !todo_darts.is_empty() {
695 let next_dart = todo_darts.iter().next().unwrap().clone();
696 todo_darts.remove(&next_dart);
697 let darts = self.auto_face_dart(next_dart);
698 for dart in darts {
699 todo_darts.remove(&dart);
700 }
701 }
702 }
703}
704
705impl Default for LinkGraph {
706 fn default() -> Self {
707 LinkGraph::new()
708 }
709}
710
711impl Drop for LinkGraph {
712 fn drop(&mut self) {
713 for vertex in &self.vertexes {
714 vertex.0.borrow_mut().dart.take();
715 }
716 for dart in &self.darts {
717 let mut dart_ref = dart.0.borrow_mut();
718 dart_ref.twin.take();
719 dart_ref.next.take();
720 dart_ref.prev.take();
721 dart_ref.face.take();
722 }
723 }
724}
725
726pub mod example;
727
728#[cfg(test)]
729mod tests {
730 use dot::GraphWalk;
731 use std::{cmp::Ordering, collections::HashSet};
732
733 use crate::data_structure::link_graph::example::three_ring_graph;
734 use crate::data_structure::{graph_dcel::GraphDCEL, link_graph::LinkGraph};
735
736 fn example_graph() -> LinkGraph {
737 let mut lg = LinkGraph::new();
738 let lv1 = lg.new_vertex();
739 assert_eq!(lv1.get_id(), 0);
740 let lv2 = lg.new_vertex();
741 assert_eq!(lv2.get_id(), 1);
742 let lv3 = lg.new_vertex();
743 assert_eq!(lv3.get_id(), 2);
744 let ld1 = lg.new_dart(lv1.clone(), lv2.clone(), None, None, None, None);
745 assert_eq!(ld1.get_id(), 3);
746 let lf = lg.new_face(ld1.clone());
747 assert_eq!(lf.get_id(), 4);
748 let ld2 = lg.new_dart(
749 lv2.clone(),
750 lv3.clone(),
751 Some(ld1.clone()),
752 None,
753 None,
754 Some(lf.clone()),
755 );
756 let ld3 = lg.new_dart(
757 lv3.clone(),
758 lv1.clone(),
759 Some(ld2.clone()),
760 Some(ld1.clone()),
761 None,
762 Some(lf),
763 );
764 let lt1 = lg.new_dart(lv2.clone(), lv1.clone(), None, None, Some(ld1), None);
765 let lof = lg.new_face(lt1.clone());
766 let lt2 = lg.new_dart(
767 lv3.clone(),
768 lv2,
769 None,
770 Some(lt1.clone()),
771 Some(ld2),
772 Some(lof.clone()),
773 );
774 let _lt3 = lg.new_dart(lv1, lv3, Some(lt1), Some(lt2), Some(ld3), Some(lof));
775 lg.validate();
776 lg
777 }
778
779 #[test]
780 fn test() {
781 let graph = example_graph();
782 let vertex = graph.vertexes.first().unwrap().clone();
783 let dart = graph.dart_vertex(&vertex);
784 let dart_2 = graph.next(&dart);
785 let dart_3 = graph.next(&dart_2);
786 let dart_4 = graph.next(&dart_3);
787 assert_eq!(dart, dart_4);
788 let twin_dart = graph.twin(&dart);
789 let twin_back_dart = graph.twin(&twin_dart);
790 assert_eq!(twin_back_dart, dart);
791 let twin_2_dart = graph.next(&twin_dart);
792 let twin_dart_3 = graph.twin(&dart_3);
793 assert_eq!(twin_2_dart, twin_dart_3);
794 let face = graph.face(&dart);
795 graph.dart_face(&face);
796 let prev_dart = graph.prev(&dart);
797 assert_eq!(prev_dart, dart_3);
798 let target_vertex = graph.dart_target(&twin_dart);
799 assert_eq!(target_vertex, vertex);
800 format!("{:?}", vertex);
801 format!("{:?}", dart);
802 format!("{:?}", face);
803 }
804
805 #[test]
806 fn iter_test() {
807 let graph = example_graph();
808
809 assert_eq!(graph.get_vertexes().count(), 3);
810 assert_eq!(graph.get_darts().count(), 6);
811 assert_eq!(graph.get_faces().count(), 2);
812 }
813
814 #[test]
815 fn hash_test() {
816 let graph = example_graph();
817 let mut vs = HashSet::new();
818 let mut vi = graph.get_vertexes();
819 vs.insert(vi.next().unwrap());
820 vs.insert(vi.next().unwrap());
821 assert_eq!(vs.len(), 2);
822 let mut ds = HashSet::new();
823 let mut di = graph.get_vertexes();
824 ds.insert(di.next().unwrap());
825 ds.insert(di.next().unwrap());
826 assert_eq!(ds.len(), 2);
827 let mut fs = HashSet::new();
828 let mut fi = graph.get_vertexes();
829 fs.insert(fi.next().unwrap());
830 fs.insert(fi.next().unwrap());
831 assert_eq!(fs.len(), 2);
832 }
833
834 #[test]
835 fn eq_test() {
836 let graph = example_graph();
837 let mut vi = graph.get_vertexes();
838 let v1 = vi.next().unwrap();
839 let v2 = vi.next().unwrap();
840 assert_eq!(v1, v1);
841 assert_ne!(v1, v2);
842 let mut di = graph.get_vertexes();
843 let d1 = di.next().unwrap();
844 let d2 = di.next().unwrap();
845 assert_eq!(d1, d1);
846 assert_ne!(d1, d2);
847 let mut fi = graph.get_vertexes();
848 let f1 = fi.next().unwrap();
849 let f2 = fi.next().unwrap();
850 assert_eq!(f1, f1);
851 assert_ne!(f1, f2);
852 }
853
854 #[test]
855 fn cmp_test() {
856 let graph = example_graph();
857 let mut vi = graph.get_vertexes();
858 let v1 = vi.next().unwrap();
859 let v2 = vi.next().unwrap();
860 assert_eq!(v1.partial_cmp(&v2), Some(Ordering::Less));
861 assert_eq!(v2.partial_cmp(&v1), Some(Ordering::Greater));
862 assert_eq!(v1.cmp(&v2), Ordering::Less);
863 assert_eq!(v2.cmp(&v1), Ordering::Greater);
864 let mut di = graph.get_vertexes();
865 let d1 = di.next().unwrap();
866 let d2 = di.next().unwrap();
867 assert_eq!(d1.partial_cmp(&d2), Some(Ordering::Less));
868 assert_eq!(d2.partial_cmp(&d1), Some(Ordering::Greater));
869 assert_eq!(d1.cmp(&d2), Ordering::Less);
870 assert_eq!(d2.cmp(&d1), Ordering::Greater);
871 let mut fi = graph.get_vertexes();
872 let f1 = fi.next().unwrap();
873 let f2 = fi.next().unwrap();
874 assert_eq!(f1.partial_cmp(&f2), Some(Ordering::Less));
875 assert_eq!(f2.partial_cmp(&f1), Some(Ordering::Greater));
876 assert_eq!(f1.cmp(&f2), Ordering::Less);
877 assert_eq!(f2.cmp(&f1), Ordering::Greater);
878 }
879
880 #[test]
881 fn neighbors_single_edge() {
882 let mut lg = LinkGraph::new();
883 let lv1 = lg.new_vertex();
884 let lv2 = lg.new_vertex();
885
886 let ld1 = lg.new_dart(lv1.clone(), lv2.clone(), None, None, None, None);
887 let lf = lg.new_face(ld1.clone());
888 lg.new_dart(
889 lv2.clone(),
890 lv1.clone(),
891 Some(ld1.clone()),
892 Some(ld1.clone()),
893 Some(ld1),
894 Some(lf),
895 );
896
897 assert_eq!(lg.neighbors(&lv1), vec![lv2.clone()]);
898 assert_eq!(lg.neighbors(&lv2), vec![lv1]);
899 }
900
901 #[test]
902 fn neighbors_triangle() {
903 let mut lg = LinkGraph::new();
904 let lv0 = lg.new_vertex();
905 let lv1 = lg.new_vertex();
906 let lv2 = lg.new_vertex();
907
908 let ld0 = lg.new_dart(lv0.clone(), lv1.clone(), None, None, None, None);
909 let lf = lg.new_face(ld0.clone());
910 let ld1 = lg.new_dart(
911 lv1.clone(),
912 lv2.clone(),
913 Some(ld0.clone()),
914 None,
915 None,
916 Some(lf.clone()),
917 );
918 let ld2 = lg.new_dart(
919 lv2.clone(),
920 lv0.clone(),
921 Some(ld1.clone()),
922 Some(ld0.clone()),
923 None,
924 Some(lf),
925 );
926
927 let lt0 = lg.new_dart(lv1.clone(), lv0.clone(), None, None, Some(ld0), None);
928 let lof = lg.new_face(lt0.clone());
929 let lt2 = lg.new_dart(
930 lv0.clone(),
931 lv2.clone(),
932 Some(lt0.clone()),
933 None,
934 Some(ld2),
935 Some(lof.clone()),
936 );
937 lg.new_dart(
938 lv2.clone(),
939 lv1.clone(),
940 Some(lt2),
941 Some(lt0),
942 Some(ld1),
943 Some(lof),
944 );
945
946 assert_eq!(lg.neighbors(&lv0), vec![lv2.clone(), lv1.clone()]);
947 assert_eq!(lg.neighbors(&lv1), vec![lv0.clone(), lv2.clone()]);
948 assert_eq!(lg.neighbors(&lv2), vec![lv1, lv0]);
949 }
950
951 #[test]
952 fn dart_count() {
953 let g = example_graph();
954
955 assert_eq!(g.dart_count(), 6)
956 }
957
958 #[test]
959 fn edge_count() {
960 let g = example_graph();
961
962 assert_eq!(g.edge_count(), 3);
963 }
964
965 #[test]
966 fn face_count() {
967 let g = example_graph();
968
969 assert_eq!(g.face_count(), 2);
970 }
971
972 #[test]
973 fn face_vertex_count() {
974 let g = example_graph();
975 let f = g.face(&g.get_darts().next().unwrap());
976
977 assert_eq!(g.face_vertex_count(&f), 3);
978 }
979
980 #[test]
981 fn neighbors_count() {
982 let g = example_graph();
983
984 assert_eq!(g.neighbors_count(&g.get_vertexes().next().unwrap()), 2);
985 }
986
987 #[test]
988 fn test_add_edge() {
989 let mut g = example_graph();
990 let first_vertex = g.vertexes[0].clone();
991 let dart = g.dart_vertex(&first_vertex);
992 let prev_dart = g.prev(&dart);
993 let new_vertex = g.new_vertex();
994 let (inner_dart, outer_dart) = g.new_edge(
995 first_vertex.clone(),
996 new_vertex.clone(),
997 Some(prev_dart),
998 Some(dart),
999 None,
1000 None,
1001 );
1002 g.new_face(inner_dart);
1003 g.new_face(outer_dart);
1004 g.validate();
1005 assert!(g.neighbors(&first_vertex).contains(&new_vertex));
1006 assert!(g.neighbors(&new_vertex).contains(&first_vertex));
1007 assert_eq!(g.edge_count(), 4)
1008 }
1009
1010 #[test]
1011 fn test_remove_edge() {
1012 let mut g = example_graph();
1013 let first_vertex = g.vertexes[0].clone();
1014 let dart = g.dart_vertex(&first_vertex);
1015 let target = g.target(&dart);
1016 g.remove_edge(&first_vertex, dart);
1017 g.validate();
1018 assert!(!g.neighbors(&first_vertex).contains(&target));
1019 assert_eq!(g.edge_count(), 2);
1020 }
1021
1022 #[test]
1023 fn test_remove_edge_from_complex_graph() {
1024 let (mut g, vertexes, darts) = three_ring_graph();
1025
1026 assert_eq!(g.edge_count(), 28);
1027 assert_eq!(g.prev(&darts[1]), darts[0].clone());
1028 assert_eq!(g.next(&darts[10]), darts[11].clone());
1029 assert_eq!(g.prev(&darts[9]), darts[11].clone());
1030 assert_eq!(g.next(&darts[2]), darts[0].clone());
1031 assert_ne!(darts[10].0.borrow().face, darts[1].0.borrow().face);
1032
1033 g.remove_edge(&vertexes[0], darts[0].clone());
1034 g.validate();
1035
1036 assert_eq!(g.edge_count(), 27);
1037 assert_eq!(g.prev(&darts[1]), darts[10].clone());
1038 assert_eq!(g.next(&darts[10]), darts[1].clone());
1039 assert_eq!(g.prev(&darts[9]), darts[2].clone());
1040 assert_eq!(g.next(&darts[2]), darts[9].clone());
1041 assert_eq!(darts[10].0.borrow().face, darts[1].0.borrow().face);
1042 }
1043
1044 #[cfg(feature = "debug_link_graph_panic_on_double_edges")]
1045 #[test]
1046 #[should_panic]
1047 fn test_add_already_existing_edge() {
1048 let mut g = LinkGraph::new();
1049 let first_vertex = g.new_vertex();
1050 let second_vertex = g.new_vertex();
1051 g.new_edge(
1052 first_vertex.clone(),
1053 second_vertex.clone(),
1054 None,
1055 None,
1056 None,
1057 None,
1058 );
1059 g.new_edge(first_vertex, second_vertex, None, None, None, None);
1060 }
1061}