@@ -108,6 +108,7 @@ impl fmt::Debug for UnescapedRoute {
108108pub struct UnescapedRef < ' a > {
109109 pub inner : & ' a [ u8 ] ,
110110 escaped : & ' a [ usize ] ,
111+ // An offset applied to each escaped index.
111112 offset : isize ,
112113}
113114
@@ -116,9 +117,11 @@ impl<'a> UnescapedRef<'a> {
116117 pub fn to_owned ( self ) -> UnescapedRoute {
117118 let mut escaped = Vec :: new ( ) ;
118119 for & i in self . escaped {
119- let i = i. wrapping_add_signed ( -self . offset ) ;
120- if i < self . inner . len ( ) {
121- escaped. push ( i) ;
120+ let i = i. checked_add_signed ( self . offset ) ;
121+
122+ match i {
123+ Some ( i) if i < self . inner . len ( ) => escaped. push ( i) ,
124+ _ => { }
122125 }
123126 }
124127
@@ -130,15 +133,19 @@ impl<'a> UnescapedRef<'a> {
130133
131134 /// Returns true if the character at the given index was escaped.
132135 pub fn is_escaped ( & self , i : usize ) -> bool {
133- self . escaped . contains ( & ( i. wrapping_add_signed ( self . offset ) ) )
136+ if let Some ( i) = i. checked_add_signed ( -self . offset ) {
137+ return self . escaped . contains ( & i) ;
138+ }
139+
140+ false
134141 }
135142
136143 /// Slices the route with `start..`.
137144 pub fn slice_off ( & self , start : usize ) -> UnescapedRef < ' a > {
138145 UnescapedRef {
139146 inner : & self . inner [ start..] ,
140147 escaped : self . escaped ,
141- offset : self . offset + ( start as isize ) ,
148+ offset : self . offset - ( start as isize ) ,
142149 }
143150 }
144151
0 commit comments