File tree Expand file tree Collapse file tree 3 files changed +36
-21
lines changed Expand file tree Collapse file tree 3 files changed +36
-21
lines changed Original file line number Diff line number Diff line change @@ -168,28 +168,33 @@ impl<T> PathTree<T> {
168
168
}
169
169
170
170
pub fn insert ( & mut self , path : & str , value : T ) -> usize {
171
- if path. is_empty ( ) {
172
- return self . id ;
173
- }
174
-
175
171
let mut node = & mut self . node ;
176
- let pieces = Parser :: new ( path) . collect :: < Vec < _ > > ( ) ;
177
172
178
- for piece in & pieces {
179
- match piece {
180
- Piece :: String ( s) => {
181
- node = node. insert_bytes ( & s[ ..] ) ;
182
- }
183
- Piece :: Parameter ( _, k) => {
184
- node = node. insert_parameter ( * k) ;
173
+ let ( overwritten, pieces) = if path. is_empty ( ) {
174
+ ( false , Vec :: new ( ) )
175
+ } else {
176
+ let pieces = Parser :: new ( path) . collect :: < Vec < _ > > ( ) ;
177
+ for piece in & pieces {
178
+ match piece {
179
+ Piece :: String ( s) => {
180
+ node = node. insert_bytes ( & s[ ..] ) ;
181
+ }
182
+ Piece :: Parameter ( _, k) => {
183
+ node = node. insert_parameter ( * k) ;
184
+ }
185
185
}
186
186
}
187
- }
187
+ ( true , pieces)
188
+ } ;
188
189
189
- self . routes . push ( ( value, pieces) ) ;
190
190
if let Some ( id) = node. value {
191
+ self . routes [ id] . 0 = value;
192
+ if overwritten {
193
+ self . routes [ id] . 1 = pieces;
194
+ }
191
195
id
192
196
} else {
197
+ self . routes . push ( ( value, pieces) ) ;
193
198
let id = self . id ;
194
199
node. value = Some ( id) ;
195
200
self . id += 1 ;
Original file line number Diff line number Diff line change @@ -35,13 +35,13 @@ impl<T: fmt::Debug> Node<T> {
35
35
36
36
pub fn insert_bytes ( & mut self , mut bytes : & [ u8 ] ) -> & mut Self {
37
37
let diff = match & mut self . kind {
38
- NodeKind :: String ( p ) => {
39
- if p . is_empty ( ) {
40
- * p = bytes. to_vec ( ) ;
38
+ NodeKind :: String ( s ) => {
39
+ if s . is_empty ( ) {
40
+ * s = bytes. to_vec ( ) ;
41
41
return self ;
42
42
}
43
43
44
- let cursor = p
44
+ let cursor = s
45
45
. iter ( )
46
46
. zip ( bytes. iter ( ) )
47
47
. take_while ( |( a, b) | a == b)
@@ -51,10 +51,10 @@ impl<T: fmt::Debug> Node<T> {
51
51
true
52
52
} else {
53
53
// split node
54
- if cursor < p . len ( ) {
55
- let ( prefix, suffix) = p . split_at ( cursor) ;
54
+ if cursor < s . len ( ) {
55
+ let ( prefix, suffix) = s . split_at ( cursor) ;
56
56
let mut node = Node :: new ( NodeKind :: String ( prefix. to_vec ( ) ) , None ) ;
57
- * p = suffix. to_vec ( ) ;
57
+ * s = suffix. to_vec ( ) ;
58
58
:: std:: mem:: swap ( self , & mut node) ;
59
59
self . nodes0 . get_or_insert_with ( Vec :: new) . push ( node) ;
60
60
}
Original file line number Diff line number Diff line change @@ -1693,6 +1693,16 @@ fn basic() {
1693
1693
assert_eq ! ( r. value, & 0 ) ;
1694
1694
assert_eq ! ( r. params( ) , vec![ ] ) ;
1695
1695
1696
+ tree. insert ( "" , 14 ) ;
1697
+ let r = tree. find ( "/" ) . unwrap ( ) ;
1698
+ assert_eq ! ( r. value, & 14 ) ;
1699
+ assert_eq ! ( r. params( ) , vec![ ] ) ;
1700
+
1701
+ tree. insert ( "/" , 15 ) ;
1702
+ let r = tree. find ( "/" ) . unwrap ( ) ;
1703
+ assert_eq ! ( r. value, & 15 ) ;
1704
+ assert_eq ! ( r. params( ) , vec![ ] ) ;
1705
+
1696
1706
let r = tree. find ( "/login" ) . unwrap ( ) ;
1697
1707
assert_eq ! ( r. value, & 1 ) ;
1698
1708
assert_eq ! ( r. params( ) , vec![ ] ) ;
You can’t perform that action at this time.
0 commit comments