@@ -54,6 +54,7 @@ use crate::primitives::iter::{ByteIterExt, Fe32IterExt};
54
54
use crate :: primitives:: segwit;
55
55
use crate :: primitives:: segwit:: { InvalidWitnessVersionError , WitnessLengthError } ;
56
56
use crate :: primitives:: { Bech32 , Bech32m } ;
57
+ use crate :: BECH32_MAX_LENGTH ;
57
58
58
59
#[ rustfmt:: skip] // Keep public re-exports separate.
59
60
#[ doc( inline) ]
@@ -144,19 +145,30 @@ pub fn encode_lower_to_fmt_unchecked<W: fmt::Write>(
144
145
witness_version : Fe32 ,
145
146
witness_program : & [ u8 ] ,
146
147
) -> fmt:: Result {
148
+ let mut buf = [ 0u8 ; BECH32_MAX_LENGTH ] ;
149
+ let mut pos = 0 ;
150
+
147
151
let iter = witness_program. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
148
152
match witness_version {
149
153
VERSION_0 => {
150
- for c in iter. with_checksum :: < Bech32 > ( hrp) . with_witness_version ( VERSION_0 ) . chars ( ) {
151
- fmt. write_char ( c) ?;
152
- }
154
+ let chars = iter. with_checksum :: < Bech32 > ( hrp) . with_witness_version ( VERSION_0 ) . chars ( ) ;
155
+ buf. iter_mut ( ) . zip ( chars) . for_each ( |( b, c) | {
156
+ * b = c as u8 ;
157
+ pos += 1 ;
158
+ } ) ;
153
159
}
154
160
version => {
155
- for c in iter. with_checksum :: < Bech32m > ( hrp) . with_witness_version ( version) . chars ( ) {
156
- fmt. write_char ( c) ?;
157
- }
161
+ let chars = iter. with_checksum :: < Bech32m > ( hrp) . with_witness_version ( version) . chars ( ) ;
162
+ buf. iter_mut ( ) . zip ( chars) . for_each ( |( b, c) | {
163
+ * b = c as u8 ;
164
+ pos += 1 ;
165
+ } ) ;
158
166
}
159
167
}
168
+
169
+ let s = core:: str:: from_utf8 ( & buf[ ..pos] ) . expect ( "we only write ASCII" ) ;
170
+ fmt. write_str ( s) ?;
171
+
160
172
Ok ( ( ) )
161
173
}
162
174
@@ -173,20 +185,30 @@ pub fn encode_upper_to_fmt_unchecked<W: fmt::Write>(
173
185
witness_version : Fe32 ,
174
186
witness_program : & [ u8 ] ,
175
187
) -> fmt:: Result {
188
+ let mut buf = [ 0u8 ; BECH32_MAX_LENGTH ] ;
189
+ let mut pos = 0 ;
190
+
176
191
let iter = witness_program. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
177
192
match witness_version {
178
193
VERSION_0 => {
179
- for c in iter. with_checksum :: < Bech32 > ( hrp) . with_witness_version ( VERSION_0 ) . chars ( ) {
180
- fmt. write_char ( c. to_ascii_uppercase ( ) ) ?;
181
- }
194
+ let chars = iter. with_checksum :: < Bech32 > ( hrp) . with_witness_version ( VERSION_0 ) . chars ( ) ;
195
+ buf. iter_mut ( ) . zip ( chars) . for_each ( |( b, c) | {
196
+ * b = c. to_ascii_uppercase ( ) as u8 ;
197
+ pos += 1 ;
198
+ } ) ;
182
199
}
183
200
version => {
184
- for c in iter. with_checksum :: < Bech32m > ( hrp) . with_witness_version ( version) . chars ( ) {
185
- fmt. write_char ( c. to_ascii_uppercase ( ) ) ?;
186
- }
201
+ let chars = iter. with_checksum :: < Bech32m > ( hrp) . with_witness_version ( version) . chars ( ) ;
202
+ buf. iter_mut ( ) . zip ( chars) . for_each ( |( b, c) | {
203
+ * b = c. to_ascii_uppercase ( ) as u8 ;
204
+ pos += 1 ;
205
+ } ) ;
187
206
}
188
207
}
189
208
209
+ let s = core:: str:: from_utf8 ( & buf[ ..pos] ) . expect ( "we only write ASCII" ) ;
210
+ fmt. write_str ( s) ?;
211
+
190
212
Ok ( ( ) )
191
213
}
192
214
@@ -217,19 +239,29 @@ pub fn encode_lower_to_writer_unchecked<W: std::io::Write>(
217
239
witness_version : Fe32 ,
218
240
witness_program : & [ u8 ] ,
219
241
) -> std:: io:: Result < ( ) > {
242
+ let mut buf = [ 0u8 ; BECH32_MAX_LENGTH ] ;
243
+ let mut pos = 0 ;
244
+
220
245
let iter = witness_program. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
221
246
match witness_version {
222
247
VERSION_0 => {
223
- for c in iter. with_checksum :: < Bech32 > ( hrp) . with_witness_version ( VERSION_0 ) . chars ( ) {
224
- w. write_all ( & [ c as u8 ] ) ?;
225
- }
248
+ let chars = iter. with_checksum :: < Bech32 > ( hrp) . with_witness_version ( VERSION_0 ) . chars ( ) ;
249
+ buf. iter_mut ( ) . zip ( chars) . for_each ( |( b, c) | {
250
+ * b = c as u8 ;
251
+ pos += 1 ;
252
+ } ) ;
226
253
}
227
254
version => {
228
- for c in iter. with_checksum :: < Bech32m > ( hrp) . with_witness_version ( version) . chars ( ) {
229
- w. write_all ( & [ c as u8 ] ) ?;
230
- }
255
+ let chars = iter. with_checksum :: < Bech32m > ( hrp) . with_witness_version ( version) . chars ( ) ;
256
+ buf. iter_mut ( ) . zip ( chars) . for_each ( |( b, c) | {
257
+ * b = c as u8 ;
258
+ pos += 1 ;
259
+ } ) ;
231
260
}
232
261
}
262
+
263
+ w. write_all ( & buf[ ..pos] ) ?;
264
+
233
265
Ok ( ( ) )
234
266
}
235
267
@@ -247,20 +279,29 @@ pub fn encode_upper_to_writer_unchecked<W: std::io::Write>(
247
279
witness_version : Fe32 ,
248
280
witness_program : & [ u8 ] ,
249
281
) -> std:: io:: Result < ( ) > {
282
+ let mut buf = [ 0u8 ; BECH32_MAX_LENGTH ] ;
283
+ let mut pos = 0 ;
284
+
250
285
let iter = witness_program. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
251
286
match witness_version {
252
287
VERSION_0 => {
253
- for c in iter. with_checksum :: < Bech32 > ( hrp) . with_witness_version ( VERSION_0 ) . chars ( ) {
254
- w. write_all ( & [ c. to_ascii_uppercase ( ) as u8 ] ) ?;
255
- }
288
+ let chars = iter. with_checksum :: < Bech32 > ( hrp) . with_witness_version ( VERSION_0 ) . chars ( ) ;
289
+ buf. iter_mut ( ) . zip ( chars) . for_each ( |( b, c) | {
290
+ * b = c. to_ascii_uppercase ( ) as u8 ;
291
+ pos += 1 ;
292
+ } ) ;
256
293
}
257
294
version => {
258
- for c in iter. with_checksum :: < Bech32m > ( hrp) . with_witness_version ( version) . chars ( ) {
259
- w. write_all ( & [ c. to_ascii_uppercase ( ) as u8 ] ) ?;
260
- }
295
+ let chars = iter. with_checksum :: < Bech32m > ( hrp) . with_witness_version ( version) . chars ( ) ;
296
+ buf. iter_mut ( ) . zip ( chars) . for_each ( |( b, c) | {
297
+ * b = c. to_ascii_uppercase ( ) as u8 ;
298
+ pos += 1 ;
299
+ } ) ;
261
300
}
262
301
}
263
302
303
+ w. write_all ( & buf[ ..pos] ) ?;
304
+
264
305
Ok ( ( ) )
265
306
}
266
307
0 commit comments