@@ -31,10 +31,14 @@ assert_eq!(variant, Variant::Bech32);
31
31
32
32
#![ cfg_attr( all( not( feature = "std" ) , not( test) ) , no_std) ]
33
33
// Experimental features we need.
34
+ #![ cfg_attr( bench, feature( test) ) ]
34
35
#![ cfg_attr( docsrs, feature( doc_auto_cfg) ) ]
35
36
// Coding conventions
36
37
#![ deny( missing_docs) ]
37
38
39
+ #[ cfg( bench) ]
40
+ extern crate test;
41
+
38
42
#[ cfg( feature = "alloc" ) ]
39
43
extern crate alloc;
40
44
@@ -1399,4 +1403,99 @@ mod tests {
1399
1403
assert_eq ! ( & res, [ 0x00 , 0x01 , 0x02 ] . as_ref( ) ) ;
1400
1404
assert_eq ! ( variant, Variant :: Bech32 ) ;
1401
1405
}
1406
+
1407
+ #[ test]
1408
+ #[ cfg( feature = "alloc" ) ]
1409
+ fn decode_bitcoin_bech32_address ( ) {
1410
+ let addr = "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq" ;
1411
+ let ( hrp, _data, variant) = crate :: decode ( addr) . expect ( "address is well formed" ) ;
1412
+ assert_eq ! ( hrp, "bc" ) ;
1413
+ assert_eq ! ( variant, Variant :: Bech32 )
1414
+ }
1415
+
1416
+ #[ test]
1417
+ #[ cfg( feature = "alloc" ) ]
1418
+ fn decode_bitcoin_bech32m_address ( ) {
1419
+ let addr = "bc1p5d7rjq7g6rdk2yhzks9smlaqtedr4dekq08ge8ztwac72sfr9rusxg3297" ;
1420
+ let ( hrp, _data, variant) = crate :: decode ( addr) . expect ( "address is well formed" ) ;
1421
+ assert_eq ! ( hrp, "bc" ) ;
1422
+ assert_eq ! ( variant, Variant :: Bech32m )
1423
+ }
1424
+ }
1425
+
1426
+ #[ cfg( bench) ]
1427
+ mod benches {
1428
+ use test:: { black_box, Bencher } ;
1429
+
1430
+ #[ bench]
1431
+ fn bech32_parse_address ( bh : & mut Bencher ) {
1432
+ let addr = black_box ( "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq" ) ;
1433
+
1434
+ bh. iter ( || {
1435
+ let tuple = crate :: decode ( & addr) . expect ( "address is well formed" ) ;
1436
+ black_box ( & tuple) ;
1437
+ } )
1438
+ }
1439
+
1440
+ #[ bench]
1441
+ fn bech32m_parse_address ( bh : & mut Bencher ) {
1442
+ let addr = black_box ( "bc1p5d7rjq7g6rdk2yhzks9smlaqtedr4dekq08ge8ztwac72sfr9rusxg3297" ) ;
1443
+
1444
+ bh. iter ( || {
1445
+ let tuple = crate :: decode ( & addr) . expect ( "address is well formed" ) ;
1446
+ black_box ( & tuple) ;
1447
+ } )
1448
+ }
1449
+
1450
+ // Encode with allocation.
1451
+ #[ bench]
1452
+ fn encode_bech32_address ( bh : & mut Bencher ) {
1453
+ let addr = "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq" ;
1454
+ let ( hrp, data, variant) = crate :: decode ( & addr) . expect ( "address is well formed" ) ;
1455
+
1456
+ bh. iter ( || {
1457
+ let s = crate :: encode ( & hrp, & data, variant) . expect ( "failed to encode" ) ;
1458
+ black_box ( & s) ;
1459
+ } ) ;
1460
+ }
1461
+
1462
+ // Encode without allocation.
1463
+ #[ bench]
1464
+ fn encode_to_fmt_bech32_address ( bh : & mut Bencher ) {
1465
+ let addr = "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq" ;
1466
+ let ( hrp, data, variant) = crate :: decode ( & addr) . expect ( "address is well formed" ) ;
1467
+ let mut buf = String :: with_capacity ( 64 ) ;
1468
+
1469
+ bh. iter ( || {
1470
+ let res =
1471
+ crate :: encode_to_fmt ( & mut buf, & hrp, & data, variant) . expect ( "failed to encode" ) ;
1472
+ black_box ( & res) ;
1473
+ } ) ;
1474
+ }
1475
+
1476
+ // Encode with allocation.
1477
+ #[ bench]
1478
+ fn encode_bech32m_address ( bh : & mut Bencher ) {
1479
+ let addr = "bc1p5d7rjq7g6rdk2yhzks9smlaqtedr4dekq08ge8ztwac72sfr9rusxg3297" ;
1480
+ let ( hrp, data, variant) = crate :: decode ( & addr) . expect ( "address is well formed" ) ;
1481
+
1482
+ bh. iter ( || {
1483
+ let s = crate :: encode ( & hrp, & data, variant) . expect ( "failed to encode" ) ;
1484
+ black_box ( & s) ;
1485
+ } ) ;
1486
+ }
1487
+
1488
+ // Encode without allocation.
1489
+ #[ bench]
1490
+ fn encode_to_fmt_bech32m_address ( bh : & mut Bencher ) {
1491
+ let addr = "bc1p5d7rjq7g6rdk2yhzks9smlaqtedr4dekq08ge8ztwac72sfr9rusxg3297" ;
1492
+ let ( hrp, data, variant) = crate :: decode ( & addr) . expect ( "address is well formed" ) ;
1493
+ let mut buf = String :: with_capacity ( 64 ) ;
1494
+
1495
+ bh. iter ( || {
1496
+ let res =
1497
+ crate :: encode_to_fmt ( & mut buf, & hrp, & data, variant) . expect ( "failed to encode" ) ;
1498
+ black_box ( & res) ;
1499
+ } ) ;
1500
+ }
1402
1501
}
0 commit comments