@@ -33,6 +33,17 @@ namespace tao
3333 return ( !in.empty () ) && match_impl ( in, consumer );
3434 }
3535
36+ template < typename Result, typename Number, typename Read, typename Input >
37+ static Result read_number ( Input& in )
38+ {
39+ if ( in.size ( sizeof ( Number ) ) > sizeof ( Number ) ) {
40+ const Result result = static_cast < Result >( static_cast < Number >( json::internal::be_to_h< Read >( in.current () + 1 ) ) );
41+ in.bump_in_this_line ( 1 + sizeof ( Number ) );
42+ return result;
43+ }
44+ throw json_pegtl::parse_error ( " unexpected end of msgpack input" , in );
45+ }
46+
3647 template < typename Input, typename Consumer >
3748 static bool match_impl ( Input& in, Consumer& consumer )
3849 {
@@ -73,52 +84,52 @@ namespace tao
7384 in.bump_in_this_line ();
7485 return true ;
7586 case 0xc4 :
76- consumer.binary ( read_container< tao::byte_view >( in, read_number< std::size_t , std::uint8_t >( in ) ) );
87+ consumer.binary ( read_container< tao::byte_view >( in, read_number< std::size_t , std::uint8_t , std:: uint8_t >( in ) ) );
7788 return true ;
7889 case 0xc5 :
79- consumer.binary ( read_container< tao::byte_view >( in, read_number< std::size_t , std::uint16_t >( in ) ) );
90+ consumer.binary ( read_container< tao::byte_view >( in, read_number< std::size_t , std::uint16_t , std:: uint16_t >( in ) ) );
8091 return true ;
8192 case 0xc6 :
82- consumer.binary ( read_container< tao::byte_view >( in, read_number< std::size_t , std::uint32_t >( in ) ) );
93+ consumer.binary ( read_container< tao::byte_view >( in, read_number< std::size_t , std::uint32_t , std:: uint32_t >( in ) ) );
8394 return true ;
8495 case 0xc7 :
85- discard ( in, read_number< std::size_t , std::uint8_t >( in ) + 1 );
96+ discard ( in, read_number< std::size_t , std::uint8_t , std:: uint8_t >( in ) + 1 );
8697 return true ;
8798 case 0xc8 :
88- discard ( in, read_number< std::size_t , std::uint16_t >( in ) + 1 );
99+ discard ( in, read_number< std::size_t , std::uint16_t , std:: uint16_t >( in ) + 1 );
89100 return true ;
90101 case 0xc9 :
91- discard ( in, read_number< std::size_t , std::uint32_t >( in ) + 1 );
102+ discard ( in, read_number< std::size_t , std::uint32_t , std:: uint32_t >( in ) + 1 );
92103 return true ;
93104 case 0xca :
94- consumer.number ( read_number< double , float >( in ) );
105+ consumer.number ( read_number< double , float , float >( in ) );
95106 return true ;
96107 case 0xcb :
97- consumer.number ( read_number< double , double >( in ) );
108+ consumer.number ( read_number< double , double , double >( in ) );
98109 return true ;
99110 case 0xcc :
100- consumer.number ( read_number< std::uint64_t , std::uint8_t >( in ) );
111+ consumer.number ( read_number< std::uint64_t , std::uint8_t , std:: uint8_t >( in ) );
101112 return true ;
102113 case 0xcd :
103- consumer.number ( read_number< std::uint64_t , std::uint16_t >( in ) );
114+ consumer.number ( read_number< std::uint64_t , std::uint16_t , std:: uint16_t >( in ) );
104115 return true ;
105116 case 0xce :
106- consumer.number ( read_number< std::uint64_t , std::uint32_t >( in ) );
117+ consumer.number ( read_number< std::uint64_t , std::uint32_t , std:: uint32_t >( in ) );
107118 return true ;
108119 case 0xcf :
109- consumer.number ( read_number< std::uint64_t , std::uint64_t >( in ) );
120+ consumer.number ( read_number< std::uint64_t , std::uint64_t , std:: uint64_t >( in ) );
110121 return true ;
111122 case 0xd0 :
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 0xd1 :
115- consumer.number ( read_number< std::int64_t , std::int16_t >( in ) );
126+ consumer.number ( read_number< std::int64_t , std::int16_t , std:: uint16_t >( in ) );
116127 return true ;
117128 case 0xd2 :
118- consumer.number ( read_number< std::int64_t , std::int32_t >( in ) );
129+ consumer.number ( read_number< std::int64_t , std::int32_t , std:: uint32_t >( in ) );
119130 return true ;
120131 case 0xd3 :
121- consumer.number ( read_number< std::int64_t , std::int64_t >( in ) );
132+ consumer.number ( read_number< std::int64_t , std::int64_t , std:: uint64_t >( in ) );
122133 return true ;
123134 case 0xd4 :
124135 discard ( in, 3 );
@@ -136,22 +147,22 @@ namespace tao
136147 discard ( in, 18 );
137148 return true ;
138149 case 0xd9 :
139- consumer.string ( read_container< tao::string_view >( in, read_number< std::size_t , std::uint8_t >( in ) ) );
150+ consumer.string ( read_container< tao::string_view >( in, read_number< std::size_t , std::uint8_t , std:: uint8_t >( in ) ) );
140151 return true ;
141152 case 0xda :
142- consumer.string ( read_container< tao::string_view >( in, read_number< std::size_t , std::uint16_t >( in ) ) );
153+ consumer.string ( read_container< tao::string_view >( in, read_number< std::size_t , std::uint16_t , std:: uint16_t >( in ) ) );
143154 return true ;
144155 case 0xdb :
145- consumer.string ( read_container< tao::string_view >( in, read_number< std::size_t , std::uint32_t >( in ) ) );
156+ consumer.string ( read_container< tao::string_view >( in, read_number< std::size_t , std::uint32_t , std:: uint32_t >( in ) ) );
146157 return true ;
147158 case 0xdc :
148- return match_array ( in, consumer, read_number< std::size_t , std::uint16_t >( in ) );
159+ return match_array ( in, consumer, read_number< std::size_t , std::uint16_t , std:: uint16_t >( in ) );
149160 case 0xdd :
150- return match_array ( in, consumer, read_number< std::size_t , std::uint32_t >( in ) );
161+ return match_array ( in, consumer, read_number< std::size_t , std::uint32_t , std:: uint32_t >( in ) );
151162 case 0xde :
152- return match_object ( in, consumer, read_number< std::size_t , std::uint16_t >( in ) );
163+ return match_object ( in, consumer, read_number< std::size_t , std::uint16_t , std:: uint16_t >( in ) );
153164 case 0xdf :
154- return match_object ( in, consumer, read_number< std::size_t , std::uint32_t >( in ) );
165+ return match_object ( in, consumer, read_number< std::size_t , std::uint32_t , std:: uint32_t >( in ) );
155166 }
156167 // LCOV_EXCL_START
157168 assert ( false );
@@ -168,17 +179,6 @@ namespace tao
168179 in.bump_in_this_line ( count );
169180 }
170181
171- template < typename Result, typename Number, typename Input >
172- static Result read_number ( Input& in )
173- {
174- if ( in.size ( sizeof ( Number ) ) > sizeof ( Number ) ) {
175- const Result result = json::internal::be_to_h< Number >( in.current () + 1 );
176- in.bump_in_this_line ( 1 + sizeof ( Number ) );
177- return result;
178- }
179- throw json_pegtl::parse_error ( " unexpected end of msgpack input" , in );
180- }
181-
182182 template < typename Result, typename Input >
183183 static Result read_container ( Input& in, const std::size_t size )
184184 {
@@ -199,17 +199,17 @@ namespace tao
199199 throw json_pegtl::parse_error ( " unexpected end of input" , in );
200200 }
201201 const auto b = in.peek_byte ();
202- if ( ( 0xa0 <= b ) && ( b <= 0xbf ) ) {
202+ if ( ( 0xa0 <= b ) && ( b <= 0xbf ) ) {
203203 in.bump_in_this_line ();
204204 return read_container< tao::string_view >( in, b - 0xa0 );
205205 }
206206 switch ( b ) {
207207 case 0xd9 :
208- return read_container< tao::string_view >( in, read_number< std::size_t , std::uint8_t >( in ) );
208+ return read_container< tao::string_view >( in, read_number< std::size_t , std::uint8_t , std:: uint8_t >( in ) );
209209 case 0xda :
210- return read_container< tao::string_view >( in, read_number< std::size_t , std::uint16_t >( in ) );
210+ return read_container< tao::string_view >( in, read_number< std::size_t , std::uint16_t , std:: uint16_t >( in ) );
211211 case 0xdb :
212- return read_container< tao::string_view >( in, read_number< std::size_t , std::uint32_t >( in ) );
212+ return read_container< tao::string_view >( in, read_number< std::size_t , std::uint32_t , std:: uint32_t >( in ) );
213213 }
214214 throw json_pegtl::parse_error ( " unexpected key type" , in );
215215 }
0 commit comments