@@ -156,19 +156,30 @@ pub fn encode_lower_to_fmt_unchecked<W: fmt::Write>(
156
156
witness_version : Fe32 ,
157
157
witness_program : & [ u8 ] ,
158
158
) -> fmt:: Result {
159
+ let mut buf = [ 0u8 ; MAX_STRING_LENGTH ] ;
160
+ let mut pos = 0 ;
161
+
159
162
let iter = witness_program. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
160
163
match witness_version {
161
164
VERSION_0 => {
162
- for c in iter. with_checksum :: < Bech32 > ( & hrp) . with_witness_version ( VERSION_0 ) . chars ( ) {
163
- fmt. write_char ( c) ?;
164
- }
165
+ let bytes = iter. with_checksum :: < Bech32 > ( & hrp) . with_witness_version ( VERSION_0 ) . bytes ( ) ;
166
+ buf. iter_mut ( ) . zip ( bytes) . for_each ( |( dst, src) | {
167
+ * dst = src;
168
+ pos += 1 ;
169
+ } ) ;
165
170
}
166
171
version => {
167
- for c in iter. with_checksum :: < Bech32m > ( & hrp) . with_witness_version ( version) . chars ( ) {
168
- fmt. write_char ( c) ?;
169
- }
172
+ let bytes = iter. with_checksum :: < Bech32m > ( & hrp) . with_witness_version ( version) . bytes ( ) ;
173
+ buf. iter_mut ( ) . zip ( bytes) . for_each ( |( dst, src) | {
174
+ * dst = src;
175
+ pos += 1 ;
176
+ } ) ;
170
177
}
171
178
}
179
+
180
+ let s = core:: str:: from_utf8 ( & buf[ ..pos] ) . expect ( "we only write ASCII" ) ;
181
+ fmt. write_str ( s) ?;
182
+
172
183
Ok ( ( ) )
173
184
}
174
185
@@ -185,20 +196,30 @@ pub fn encode_upper_to_fmt_unchecked<W: fmt::Write>(
185
196
witness_version : Fe32 ,
186
197
witness_program : & [ u8 ] ,
187
198
) -> fmt:: Result {
199
+ let mut buf = [ 0u8 ; MAX_STRING_LENGTH ] ;
200
+ let mut pos = 0 ;
201
+
188
202
let iter = witness_program. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
189
203
match witness_version {
190
204
VERSION_0 => {
191
- for c in iter. with_checksum :: < Bech32 > ( & hrp) . with_witness_version ( VERSION_0 ) . chars ( ) {
192
- fmt. write_char ( c. to_ascii_uppercase ( ) ) ?;
193
- }
205
+ let bytes = iter. with_checksum :: < Bech32 > ( & hrp) . with_witness_version ( VERSION_0 ) . bytes ( ) ;
206
+ buf. iter_mut ( ) . zip ( bytes) . for_each ( |( dst, src) | {
207
+ * dst = src. to_ascii_uppercase ( ) ;
208
+ pos += 1 ;
209
+ } ) ;
194
210
}
195
211
version => {
196
- for c in iter. with_checksum :: < Bech32m > ( & hrp) . with_witness_version ( version) . chars ( ) {
197
- fmt. write_char ( c. to_ascii_uppercase ( ) ) ?;
198
- }
212
+ let bytes = iter. with_checksum :: < Bech32m > ( & hrp) . with_witness_version ( version) . bytes ( ) ;
213
+ buf. iter_mut ( ) . zip ( bytes) . for_each ( |( dst, src) | {
214
+ * dst = src. to_ascii_uppercase ( ) ;
215
+ pos += 1 ;
216
+ } ) ;
199
217
}
200
218
}
201
219
220
+ let s = core:: str:: from_utf8 ( & buf[ ..pos] ) . expect ( "we only write ASCII" ) ;
221
+ fmt. write_str ( s) ?;
222
+
202
223
Ok ( ( ) )
203
224
}
204
225
@@ -229,19 +250,29 @@ pub fn encode_lower_to_writer_unchecked<W: std::io::Write>(
229
250
witness_version : Fe32 ,
230
251
witness_program : & [ u8 ] ,
231
252
) -> std:: io:: Result < ( ) > {
253
+ let mut buf = [ 0u8 ; MAX_STRING_LENGTH ] ;
254
+ let mut pos = 0 ;
255
+
232
256
let iter = witness_program. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
233
257
match witness_version {
234
258
VERSION_0 => {
235
- for c in iter. with_checksum :: < Bech32 > ( & hrp) . with_witness_version ( VERSION_0 ) . chars ( ) {
236
- w. write_all ( & [ c. to_ascii_lowercase ( ) as u8 ] ) ?;
237
- }
259
+ let bytes = iter. with_checksum :: < Bech32 > ( & hrp) . with_witness_version ( VERSION_0 ) . bytes ( ) ;
260
+ buf. iter_mut ( ) . zip ( bytes) . for_each ( |( dst, src) | {
261
+ * dst = src;
262
+ pos += 1 ;
263
+ } ) ;
238
264
}
239
265
version => {
240
- for c in iter. with_checksum :: < Bech32m > ( & hrp) . with_witness_version ( version) . chars ( ) {
241
- w. write_all ( & [ c. to_ascii_lowercase ( ) as u8 ] ) ?;
242
- }
266
+ let bytes = iter. with_checksum :: < Bech32m > ( & hrp) . with_witness_version ( version) . bytes ( ) ;
267
+ buf. iter_mut ( ) . zip ( bytes) . for_each ( |( dst, src) | {
268
+ * dst = src;
269
+ pos += 1 ;
270
+ } ) ;
243
271
}
244
272
}
273
+
274
+ w. write_all ( & buf[ ..pos] ) ?;
275
+
245
276
Ok ( ( ) )
246
277
}
247
278
@@ -259,20 +290,29 @@ pub fn encode_upper_to_writer_unchecked<W: std::io::Write>(
259
290
witness_version : Fe32 ,
260
291
witness_program : & [ u8 ] ,
261
292
) -> std:: io:: Result < ( ) > {
293
+ let mut buf = [ 0u8 ; MAX_STRING_LENGTH ] ;
294
+ let mut pos = 0 ;
295
+
262
296
let iter = witness_program. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
263
297
match witness_version {
264
298
VERSION_0 => {
265
- for c in iter. with_checksum :: < Bech32 > ( & hrp) . with_witness_version ( VERSION_0 ) . chars ( ) {
266
- w. write_all ( & [ c. to_ascii_uppercase ( ) as u8 ] ) ?;
267
- }
299
+ let bytes = iter. with_checksum :: < Bech32 > ( & hrp) . with_witness_version ( VERSION_0 ) . bytes ( ) ;
300
+ buf. iter_mut ( ) . zip ( bytes) . for_each ( |( dst, src) | {
301
+ * dst = src. to_ascii_uppercase ( ) ;
302
+ pos += 1 ;
303
+ } ) ;
268
304
}
269
305
version => {
270
- for c in iter. with_checksum :: < Bech32m > ( & hrp) . with_witness_version ( version) . chars ( ) {
271
- w. write_all ( & [ c. to_ascii_uppercase ( ) as u8 ] ) ?;
272
- }
306
+ let bytes = iter. with_checksum :: < Bech32m > ( & hrp) . with_witness_version ( version) . bytes ( ) ;
307
+ buf. iter_mut ( ) . zip ( bytes) . for_each ( |( dst, src) | {
308
+ * dst = src. to_ascii_uppercase ( ) ;
309
+ pos += 1 ;
310
+ } ) ;
273
311
}
274
312
}
275
313
314
+ w. write_all ( & buf[ ..pos] ) ?;
315
+
276
316
Ok ( ( ) )
277
317
}
278
318
0 commit comments