@@ -89,6 +89,17 @@ namespace tao
8989 return ( !in.empty () ) && match_impl ( in, consumer );
9090 }
9191
92+ template < typename Result, typename Number, typename Read, typename Input >
93+ static Result read_number ( Input& in )
94+ {
95+ if ( in.size ( sizeof ( Number ) ) > sizeof ( Number ) ) {
96+ const Result result = static_cast < Result >( static_cast < Number >( json::internal::be_to_h< Read >( in.current () + 1 ) ) );
97+ in.bump_in_this_line ( 1 + sizeof ( Number ) );
98+ return result;
99+ }
100+ throw json_pegtl::parse_error ( " unexpected end of ubjson input" , in );
101+ }
102+
92103 template < typename Input, typename Consumer >
93104 static bool match_impl ( Input& in, Consumer& consumer )
94105 {
@@ -109,25 +120,25 @@ namespace tao
109120 in.bump_in_this_line ();
110121 return true ;
111122 case ' i' :
112- consumer.number ( read_number< std::int64_t , std::int8_t >( in ) );
123+ consumer.number ( read_number< std::int64_t , std::int8_t , std:: uint8_t >( in ) );
113124 return true ;
114125 case ' U' :
115- consumer.number ( read_number< std::uint64_t , std::uint8_t >( in ) );
126+ consumer.number ( read_number< std::uint64_t , std::uint8_t , std:: uint8_t >( in ) );
116127 return true ;
117128 case ' I' :
118- consumer.number ( read_number< std::int64_t , std::int16_t >( in ) );
129+ consumer.number ( read_number< std::int64_t , std::int16_t , std:: uint16_t >( in ) );
119130 return true ;
120131 case ' l' :
121- consumer.number ( read_number< std::int64_t , std::int32_t >( in ) );
132+ consumer.number ( read_number< std::int64_t , std::int32_t , std:: uint32_t >( in ) );
122133 return true ;
123134 case ' L' :
124- consumer.number ( read_number< std::int64_t , std::int64_t >( in ) );
135+ consumer.number ( read_number< std::int64_t , std::int64_t , std:: uint64_t >( in ) );
125136 return true ;
126137 case ' d' :
127- consumer.number ( read_number< double , float >( in ) );
138+ consumer.number ( read_number< double , float , float >( in ) );
128139 return true ;
129140 case ' D' :
130- consumer.number ( read_number< double , double >( in ) );
141+ consumer.number ( read_number< double , double , double >( in ) );
131142 return true ;
132143 case ' H' :
133144 return match_high_precision ( in, consumer );
@@ -159,19 +170,19 @@ namespace tao
159170 }
160171 switch ( in.peek_char () ) {
161172 case ' i' :
162- return read_number< std::int64_t , std::int8_t >( in );
173+ return read_number< std::int64_t , std::int8_t , std:: uint8_t >( in );
163174 case ' U' :
164- return read_number< std::int64_t , std::uint8_t >( in );
175+ return read_number< std::int64_t , std::uint8_t , std:: uint8_t >( in );
165176 case ' I' :
166- return read_number< std::int64_t , std::int16_t >( in );
177+ return read_number< std::int64_t , std::int16_t , std:: uint16_t >( in );
167178 case ' l' :
168- return read_number< std::int64_t , std::int32_t >( in );
179+ return read_number< std::int64_t , std::int32_t , std:: uint32_t >( in );
169180 case ' L' :
170- return read_number< std::int64_t , std::int64_t >( in );
181+ return read_number< std::int64_t , std::int64_t , std:: uint64_t >( in );
171182 case ' d' :
172- return read_number< std::int64_t , float >( in );
183+ return read_number< std::int64_t , float , float >( in );
173184 case ' D' :
174- return read_number< std::int64_t , double >( in );
185+ return read_number< std::int64_t , double , double >( in );
175186 }
176187 throw json_pegtl::parse_error ( " unexpected ubjson high precision number size marker" , in );
177188 }
@@ -191,17 +202,6 @@ namespace tao
191202 return true ;
192203 }
193204
194- template < typename Result, typename Number, typename Input >
195- static Result read_number ( Input& in )
196- {
197- if ( in.size ( sizeof ( Number ) ) > sizeof ( Number ) ) {
198- const Result result = static_cast < Result >( json::internal::be_to_h< Number >( in.current () + 1 ) );
199- in.bump_in_this_line ( 1 + sizeof ( Number ) );
200- return result;
201- }
202- throw json_pegtl::parse_error ( " unexpected end of ubjson input" , in );
203- }
204-
205205 template < typename Result, typename Input >
206206 static Result read_container ( Input& in, const std::size_t size )
207207 {
@@ -223,11 +223,11 @@ namespace tao
223223 }
224224 switch ( in.peek_byte () ) {
225225 case 0xd9 :
226- return read_container< tao::string_view >( in, read_number< std::size_t , std::uint8_t >( in ) );
226+ return read_container< tao::string_view >( in, read_number< std::size_t , std::uint8_t , std:: uint8_t >( in ) );
227227 case 0xda :
228- return read_container< tao::string_view >( in, read_number< std::size_t , std::uint16_t >( in ) );
228+ return read_container< tao::string_view >( in, read_number< std::size_t , std::uint16_t , std:: uint16_t >( in ) );
229229 case 0xdb :
230- return read_container< tao::string_view >( in, read_number< std::size_t , std::uint32_t >( in ) );
230+ return read_container< tao::string_view >( in, read_number< std::size_t , std::uint32_t , std:: uint32_t >( in ) );
231231 }
232232 throw json_pegtl::parse_error ( " unexpected key type" , in );
233233 }
0 commit comments