@@ -6,24 +6,30 @@ use std::hash::Hash;
6
6
pub struct AStar < ' a , T > {
7
7
neighbours : & ' a dyn Fn ( T ) -> Vec < T > ,
8
8
distance : & ' a dyn Fn ( T , T ) -> usize ,
9
+ memory_size : usize ,
9
10
}
10
11
11
12
impl < ' a , T > AStar < ' a , T > {
12
- pub fn new ( neighbours : & ' a dyn Fn ( T ) -> Vec < T > , distance : & ' a dyn Fn ( T , T ) -> usize ) -> Self {
13
+ pub fn new (
14
+ neighbours : & ' a dyn Fn ( T ) -> Vec < T > ,
15
+ distance : & ' a dyn Fn ( T , T ) -> usize ,
16
+ memory_size : usize ,
17
+ ) -> Self {
13
18
Self {
14
19
neighbours,
15
20
distance,
21
+ memory_size,
16
22
}
17
23
}
18
24
19
25
pub fn path ( & self , start : T , end : T ) -> Option < Vec < T > >
20
26
where
21
27
T : Hash + Eq + PartialEq + Ord + Copy + Debug ,
22
28
{
23
- let mut open_set = BinaryHeap :: new ( ) ;
24
- let mut came_from: HashMap < T , T > = HashMap :: new ( ) ;
25
- let mut g_score: HashMap < T , usize > = HashMap :: new ( ) ;
26
- let mut f_score: HashMap < T , usize > = HashMap :: new ( ) ;
29
+ let mut open_set = BinaryHeap :: with_capacity ( self . memory_size ) ;
30
+ let mut came_from: HashMap < T , T > = HashMap :: with_capacity ( self . memory_size ) ;
31
+ let mut g_score: HashMap < T , usize > = HashMap :: with_capacity ( self . memory_size ) ;
32
+ let mut f_score: HashMap < T , usize > = HashMap :: with_capacity ( self . memory_size ) ;
27
33
28
34
let distance = ( self . distance ) ( start, end) ;
29
35
@@ -76,3 +82,29 @@ impl<'a, T> AStar<'a, T> {
76
82
path
77
83
}
78
84
}
85
+
86
+ pub struct AStarBuilder < ' a , T > {
87
+ neighbours : & ' a dyn Fn ( T ) -> Vec < T > ,
88
+ distance : & ' a dyn Fn ( T , T ) -> usize ,
89
+ memory_size : Option < usize > ,
90
+ }
91
+
92
+ impl < ' a , T > AStarBuilder < ' a , T > {
93
+ pub fn init ( neighbours : & ' a dyn Fn ( T ) -> Vec < T > , distance : & ' a dyn Fn ( T , T ) -> usize ) -> Self {
94
+ Self {
95
+ neighbours,
96
+ distance,
97
+ memory_size : None ,
98
+ }
99
+ }
100
+
101
+ pub fn memory_size ( mut self , memory_size : usize ) -> Self {
102
+ self . memory_size = Some ( memory_size) ;
103
+
104
+ self
105
+ }
106
+
107
+ pub fn build ( self ) -> AStar < ' a , T > {
108
+ AStar :: new ( self . neighbours , self . distance , self . memory_size . unwrap ( ) )
109
+ }
110
+ }
0 commit comments