13
13
//!
14
14
//! [`iter_unsigned`]: ParseOps::iter_unsigned
15
15
//! [`iter_signed`]: ParseOps::iter_signed
16
+ use crate :: util:: numeric:: * ;
16
17
use std:: marker:: PhantomData ;
17
- use std:: ops:: { Add , Mul , Neg } ;
18
18
use std:: str:: Bytes ;
19
19
20
20
pub trait ParseByte {
@@ -28,19 +28,6 @@ impl ParseByte for u8 {
28
28
}
29
29
}
30
30
31
- // Traits allow us to keep type safety, restricting the possiblities to only integer types.
32
- pub trait Unsigned : From < u8 > + Add < Output = Self > + Mul < Output = Self > { }
33
- impl Unsigned for u8 { }
34
- impl Unsigned for u16 { }
35
- impl Unsigned for u32 { }
36
- impl Unsigned for u64 { }
37
- impl Unsigned for usize { }
38
-
39
- pub trait Signed : From < u8 > + Add < Output = Self > + Mul < Output = Self > + Neg < Output = Self > { }
40
- impl Signed for i16 { }
41
- impl Signed for i32 { }
42
- impl Signed for i64 { }
43
-
44
31
pub struct ParseUnsigned < ' a , T > {
45
32
bytes : Bytes < ' a > ,
46
33
phantom : PhantomData < T > ,
@@ -52,37 +39,37 @@ pub struct ParseSigned<'a, T> {
52
39
}
53
40
54
41
pub trait ParseOps {
55
- fn unsigned < T : Unsigned > ( & self ) -> T ;
56
- fn signed < T : Signed > ( & self ) -> T ;
57
- fn iter_unsigned < T : Unsigned > ( & self ) -> ParseUnsigned < ' _ , T > ;
58
- fn iter_signed < T : Signed > ( & self ) -> ParseSigned < ' _ , T > ;
42
+ fn unsigned < T : Unsigned < T > > ( & self ) -> T ;
43
+ fn signed < T : Signed < T > > ( & self ) -> T ;
44
+ fn iter_unsigned < T : Unsigned < T > > ( & self ) -> ParseUnsigned < ' _ , T > ;
45
+ fn iter_signed < T : Signed < T > > ( & self ) -> ParseSigned < ' _ , T > ;
59
46
}
60
47
61
48
impl ParseOps for & str {
62
- fn unsigned < T : Unsigned > ( & self ) -> T {
49
+ fn unsigned < T : Unsigned < T > > ( & self ) -> T {
63
50
match try_unsigned ( & mut self . bytes ( ) ) {
64
51
Some ( t) => t,
65
52
None => panic ! ( "Unable to parse \" {self}\" " ) ,
66
53
}
67
54
}
68
55
69
- fn signed < T : Signed > ( & self ) -> T {
56
+ fn signed < T : Signed < T > > ( & self ) -> T {
70
57
match try_signed ( & mut self . bytes ( ) ) {
71
58
Some ( t) => t,
72
59
None => panic ! ( "Unable to parse \" {self}\" " ) ,
73
60
}
74
61
}
75
62
76
- fn iter_unsigned < T : Unsigned > ( & self ) -> ParseUnsigned < ' _ , T > {
63
+ fn iter_unsigned < T : Unsigned < T > > ( & self ) -> ParseUnsigned < ' _ , T > {
77
64
ParseUnsigned { bytes : self . bytes ( ) , phantom : PhantomData }
78
65
}
79
66
80
- fn iter_signed < T : Signed > ( & self ) -> ParseSigned < ' _ , T > {
67
+ fn iter_signed < T : Signed < T > > ( & self ) -> ParseSigned < ' _ , T > {
81
68
ParseSigned { bytes : self . bytes ( ) , phantom : PhantomData }
82
69
}
83
70
}
84
71
85
- impl < T : Unsigned > Iterator for ParseUnsigned < ' _ , T > {
72
+ impl < T : Unsigned < T > > Iterator for ParseUnsigned < ' _ , T > {
86
73
type Item = T ;
87
74
88
75
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
@@ -95,7 +82,7 @@ impl<T: Unsigned> Iterator for ParseUnsigned<'_, T> {
95
82
}
96
83
}
97
84
98
- impl < T : Signed > Iterator for ParseSigned < ' _ , T > {
85
+ impl < T : Signed < T > > Iterator for ParseSigned < ' _ , T > {
99
86
type Item = T ;
100
87
101
88
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
@@ -108,7 +95,7 @@ impl<T: Signed> Iterator for ParseSigned<'_, T> {
108
95
}
109
96
}
110
97
111
- fn try_unsigned < T : Unsigned > ( bytes : & mut Bytes < ' _ > ) -> Option < T > {
98
+ fn try_unsigned < T : Unsigned < T > > ( bytes : & mut Bytes < ' _ > ) -> Option < T > {
112
99
let mut n = loop {
113
100
let byte = bytes. next ( ) ?;
114
101
let digit = byte. to_decimal ( ) ;
@@ -123,20 +110,20 @@ fn try_unsigned<T: Unsigned>(bytes: &mut Bytes<'_>) -> Option<T> {
123
110
let digit = byte. to_decimal ( ) ;
124
111
125
112
if digit < 10 {
126
- n = T :: from ( 10 ) * n + T :: from ( digit) ;
113
+ n = T :: TEN * n + T :: from ( digit) ;
127
114
} else {
128
115
break Some ( n) ;
129
116
}
130
117
}
131
118
}
132
119
133
- fn try_signed < T : Signed > ( bytes : & mut Bytes < ' _ > ) -> Option < T > {
120
+ fn try_signed < T : Signed < T > > ( bytes : & mut Bytes < ' _ > ) -> Option < T > {
134
121
let ( mut n, negative) = loop {
135
122
let byte = bytes. next ( ) ?;
136
123
let digit = byte. to_decimal ( ) ;
137
124
138
125
if digit == 253 {
139
- break ( T :: from ( 0 ) , true ) ;
126
+ break ( T :: ZERO , true ) ;
140
127
}
141
128
if digit < 10 {
142
129
break ( T :: from ( digit) , false ) ;
@@ -150,7 +137,7 @@ fn try_signed<T: Signed>(bytes: &mut Bytes<'_>) -> Option<T> {
150
137
let digit = byte. to_decimal ( ) ;
151
138
152
139
if digit < 10 {
153
- n = T :: from ( 10 ) * n + T :: from ( digit) ;
140
+ n = T :: TEN * n + T :: from ( digit) ;
154
141
} else {
155
142
break Some ( if negative { -n } else { n } ) ;
156
143
}
0 commit comments