@@ -15,6 +15,20 @@ const IDENT_FIRST: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy
15
15
const IDENT_CHAR : & [ u8 ] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789" ;
16
16
const WHITE_SPACE : & [ u8 ] = b"\n \t \r " ;
17
17
18
+ #[ derive( Clone , Debug , PartialEq ) ]
19
+ pub enum AnyNum {
20
+ F32 ( f32 ) ,
21
+ F64 ( f64 ) ,
22
+ I8 ( i8 ) ,
23
+ U8 ( u8 ) ,
24
+ I16 ( i16 ) ,
25
+ U16 ( u16 ) ,
26
+ I32 ( i32 ) ,
27
+ U32 ( u32 ) ,
28
+ I64 ( i64 ) ,
29
+ U64 ( u64 ) ,
30
+ }
31
+
18
32
#[ derive( Clone , Copy , Debug ) ]
19
33
pub struct Bytes < ' a > {
20
34
/// Bits set according to `Extension` enum.
@@ -70,6 +84,79 @@ impl<'a> Bytes<'a> {
70
84
Ok ( ( ) )
71
85
}
72
86
87
+ pub fn any_num ( & mut self ) -> Result < AnyNum > {
88
+ fn any_float ( f : f64 ) -> Result < AnyNum > {
89
+ if f == f as f32 as f64 {
90
+ Ok ( AnyNum :: F32 ( f as f32 ) )
91
+ } else {
92
+ Ok ( AnyNum :: F64 ( f) )
93
+ }
94
+ }
95
+
96
+ let bytes_backup = self . bytes ;
97
+
98
+ let first_byte = self . peek_or_eof ( ) ?;
99
+ let is_signed = first_byte == b'-' || first_byte == b'+' ;
100
+ let is_float = self . next_bytes_is_float ( ) ;
101
+
102
+ if is_float {
103
+ let f = self . float :: < f64 > ( ) ?;
104
+
105
+ any_float ( f)
106
+ } else {
107
+ let max_u8 = std:: u8:: MAX as u64 ;
108
+ let max_u16 = std:: u16:: MAX as u64 ;
109
+ let max_u32 = std:: u32:: MAX as u64 ;
110
+
111
+ let min_i8 = std:: i8:: MIN as i64 ;
112
+ let max_i8 = std:: i8:: MAX as i64 ;
113
+ let min_i16 = std:: i16:: MIN as i64 ;
114
+ let max_i16 = std:: i16:: MAX as i64 ;
115
+ let min_i32 = std:: i32:: MIN as i64 ;
116
+ let max_i32 = std:: i32:: MAX as i64 ;
117
+
118
+ if is_signed {
119
+ match self . signed_integer :: < i64 > ( ) {
120
+ Ok ( x) => {
121
+ if x >= min_i8 && x <= max_i8 {
122
+ Ok ( AnyNum :: I8 ( x as i8 ) )
123
+ } else if x >= min_i16 && x <= max_i16 {
124
+ Ok ( AnyNum :: I16 ( x as i16 ) )
125
+ } else if x >= min_i32 && x <= max_i32 {
126
+ Ok ( AnyNum :: I32 ( x as i32 ) )
127
+ } else {
128
+ Ok ( AnyNum :: I64 ( x) )
129
+ }
130
+ }
131
+ Err ( _) => {
132
+ self . bytes = bytes_backup;
133
+
134
+ any_float ( self . float :: < f64 > ( ) ?)
135
+ }
136
+ }
137
+ } else {
138
+ match self . unsigned_integer :: < u64 > ( ) {
139
+ Ok ( x) => {
140
+ if x <= max_u8 {
141
+ Ok ( AnyNum :: U8 ( x as u8 ) )
142
+ } else if x <= max_u16 {
143
+ Ok ( AnyNum :: U16 ( x as u16 ) )
144
+ } else if x <= max_u32 {
145
+ Ok ( AnyNum :: U32 ( x as u32 ) )
146
+ } else {
147
+ Ok ( AnyNum :: U64 ( x) )
148
+ }
149
+ }
150
+ Err ( _) => {
151
+ self . bytes = bytes_backup;
152
+
153
+ any_float ( self . float :: < f64 > ( ) ?)
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+
73
160
pub fn bool ( & mut self ) -> Result < bool > {
74
161
if self . consume ( "true" ) {
75
162
Ok ( true )
0 commit comments