summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNelson Vides <videsnelson@gmail.com>2021-03-29 21:40:14 +0200
committerNelson Vides <videsnelson@gmail.com>2021-04-07 11:20:14 +0200
commit01ac493ae0d14897108c3218bed2b85b5c630abf (patch)
treea24e1926f3a6be00446922292c9ace8406042955
parent015139c13d5ae28c73692a90675c5dc517e2952d (diff)
downloaderlang-01ac493ae0d14897108c3218bed2b85b5c630abf.tar.gz
Optimise decoding algorithm
-rw-r--r--lib/stdlib/src/binary.erl95
1 files changed, 69 insertions, 26 deletions
diff --git a/lib/stdlib/src/binary.erl b/lib/stdlib/src/binary.erl
index f73621371e..38581da8a5 100644
--- a/lib/stdlib/src/binary.erl
+++ b/lib/stdlib/src/binary.erl
@@ -407,37 +407,80 @@ hex(X) ->
16#4530, 16#4531, 16#4532, 16#4533, 16#4534, 16#4535, 16#4536, 16#4537, 16#4538, 16#4539, 16#4541, 16#4542, 16#4543, 16#4544, 16#4545, 16#4546,
16#4630, 16#4631, 16#4632, 16#4633, 16#4634, 16#4635, 16#4636, 16#4637, 16#4638, 16#4639, 16#4641, 16#4642, 16#4643, 16#4644, 16#4645, 16#4646}).
-
-spec decode_hex(Bin) -> Bin2 when
- Bin :: binary(),
+ Bin :: <<_:_*16>>,
Bin2 :: binary().
-decode_hex(Bin) when is_binary(Bin) ->
- decode_hex(Bin, <<>>);
+decode_hex(Bin) when byte_size(Bin) rem 2 =:= 0 ->
+ << <<(unhex(Int))>> || <<Int:16>> <= Bin >>;
decode_hex(Bin) ->
badarg_with_info([Bin]).
--spec decode_hex(Bin, Acc) -> Bin2 when
- Bin :: binary(),
- Acc :: binary(),
- Bin2 :: Acc.
-decode_hex(<<>>, Acc) ->
- Acc;
-decode_hex(<<A0:8, B0:8, Rest/binary>>, Acc) ->
- A = decode_hex_char(A0),
- B = decode_hex_char(B0),
- decode_hex(Rest, <<Acc/binary, A:4, B:4>>);
-decode_hex(Bin, _Acc) ->
- badarg_with_info([Bin]).
-
--spec decode_hex_char($A..$F | $a..$f | $0..$9) -> 0..15.
-decode_hex_char(Char) when Char >= $a, Char =< $f ->
- Char - $a + 10;
-decode_hex_char(Char) when Char >= $A, Char =< $F ->
- Char - $A + 10;
-decode_hex_char(Char) when Char >= $0, Char =< $9 ->
- Char - $0;
-decode_hex_char(Char) ->
- badarg_with_cause([<<Char>>], invalid_hex).
+unhex(12336) -> 0; unhex(12337) -> 1; unhex(12338) -> 2; unhex(12339) -> 3; unhex(12340) -> 4; unhex(12341) -> 5; unhex(12342) -> 6; unhex(12343) -> 7; unhex(12344) -> 8; unhex(12345) -> 9;
+unhex(12353) -> 10; unhex(12354) -> 11; unhex(12355) -> 12; unhex(12356) -> 13; unhex(12357) -> 14; unhex(12358) -> 15;
+unhex(12385) -> 10; unhex(12386) -> 11; unhex(12387) -> 12; unhex(12388) -> 13; unhex(12389) -> 14; unhex(12390) -> 15;
+unhex(12592) -> 16; unhex(12593) -> 17; unhex(12594) -> 18; unhex(12595) -> 19; unhex(12596) -> 20; unhex(12597) -> 21; unhex(12598) -> 22; unhex(12599) -> 23; unhex(12600) -> 24; unhex(12601) -> 25;
+unhex(12609) -> 26; unhex(12610) -> 27; unhex(12611) -> 28; unhex(12612) -> 29; unhex(12613) -> 30; unhex(12614) -> 31;
+unhex(12641) -> 26; unhex(12642) -> 27; unhex(12643) -> 28; unhex(12644) -> 29; unhex(12645) -> 30; unhex(12646) -> 31;
+unhex(12848) -> 32; unhex(12849) -> 33; unhex(12850) -> 34; unhex(12851) -> 35; unhex(12852) -> 36; unhex(12853) -> 37; unhex(12854) -> 38; unhex(12855) -> 39; unhex(12856) -> 40; unhex(12857) -> 41;
+unhex(12865) -> 42; unhex(12866) -> 43; unhex(12867) -> 44; unhex(12868) -> 45; unhex(12869) -> 46; unhex(12870) -> 47;
+unhex(12897) -> 42; unhex(12898) -> 43; unhex(12899) -> 44; unhex(12900) -> 45; unhex(12901) -> 46; unhex(12902) -> 47;
+unhex(13104) -> 48; unhex(13105) -> 49; unhex(13106) -> 50; unhex(13107) -> 51; unhex(13108) -> 52; unhex(13109) -> 53; unhex(13110) -> 54; unhex(13111) -> 55; unhex(13112) -> 56; unhex(13113) -> 57;
+unhex(13121) -> 58; unhex(13122) -> 59; unhex(13123) -> 60; unhex(13124) -> 61; unhex(13125) -> 62; unhex(13126) -> 63;
+unhex(13153) -> 58; unhex(13154) -> 59; unhex(13155) -> 60; unhex(13156) -> 61; unhex(13157) -> 62; unhex(13158) -> 63;
+unhex(13360) -> 64; unhex(13361) -> 65; unhex(13362) -> 66; unhex(13363) -> 67; unhex(13364) -> 68; unhex(13365) -> 69; unhex(13366) -> 70; unhex(13367) -> 71; unhex(13368) -> 72; unhex(13369) -> 73;
+unhex(13377) -> 74; unhex(13378) -> 75; unhex(13379) -> 76; unhex(13380) -> 77; unhex(13381) -> 78; unhex(13382) -> 79;
+unhex(13409) -> 74; unhex(13410) -> 75; unhex(13411) -> 76; unhex(13412) -> 77; unhex(13413) -> 78; unhex(13414) -> 79;
+unhex(13616) -> 80; unhex(13617) -> 81; unhex(13618) -> 82; unhex(13619) -> 83; unhex(13620) -> 84; unhex(13621) -> 85; unhex(13622) -> 86; unhex(13623) -> 87; unhex(13624) -> 88; unhex(13625) -> 89;
+unhex(13633) -> 90; unhex(13634) -> 91; unhex(13635) -> 92; unhex(13636) -> 93; unhex(13637) -> 94; unhex(13638) -> 95;
+unhex(13665) -> 90; unhex(13666) -> 91; unhex(13667) -> 92; unhex(13668) -> 93; unhex(13669) -> 94; unhex(13670) -> 95;
+unhex(13872) -> 96; unhex(13873) -> 97; unhex(13874) -> 98; unhex(13875) -> 99; unhex(13876) -> 100; unhex(13877) -> 101; unhex(13878) -> 102; unhex(13879) -> 103; unhex(13880) -> 104; unhex(13881) -> 105;
+unhex(13889) -> 106; unhex(13890) -> 107; unhex(13891) -> 108; unhex(13892) -> 109; unhex(13893) -> 110; unhex(13894) -> 111;
+unhex(13921) -> 106; unhex(13922) -> 107; unhex(13923) -> 108; unhex(13924) -> 109; unhex(13925) -> 110; unhex(13926) -> 111;
+unhex(14128) -> 112; unhex(14129) -> 113; unhex(14130) -> 114; unhex(14131) -> 115; unhex(14132) -> 116; unhex(14133) -> 117; unhex(14134) -> 118; unhex(14135) -> 119; unhex(14136) -> 120; unhex(14137) -> 121;
+unhex(14145) -> 122; unhex(14146) -> 123; unhex(14147) -> 124; unhex(14148) -> 125; unhex(14149) -> 126; unhex(14150) -> 127;
+unhex(14177) -> 122; unhex(14178) -> 123; unhex(14179) -> 124; unhex(14180) -> 125; unhex(14181) -> 126; unhex(14182) -> 127;
+unhex(14384) -> 128; unhex(14385) -> 129; unhex(14386) -> 130; unhex(14387) -> 131; unhex(14388) -> 132; unhex(14389) -> 133; unhex(14390) -> 134; unhex(14391) -> 135; unhex(14392) -> 136; unhex(14393) -> 137;
+unhex(14401) -> 138; unhex(14402) -> 139; unhex(14403) -> 140; unhex(14404) -> 141; unhex(14405) -> 142; unhex(14406) -> 143;
+unhex(14433) -> 138; unhex(14434) -> 139; unhex(14435) -> 140; unhex(14436) -> 141; unhex(14437) -> 142; unhex(14438) -> 143;
+unhex(14640) -> 144; unhex(14641) -> 145; unhex(14642) -> 146; unhex(14643) -> 147; unhex(14644) -> 148; unhex(14645) -> 149; unhex(14646) -> 150; unhex(14647) -> 151; unhex(14648) -> 152; unhex(14649) -> 153;
+unhex(14657) -> 154; unhex(14658) -> 155; unhex(14659) -> 156; unhex(14660) -> 157; unhex(14661) -> 158; unhex(14662) -> 159;
+unhex(14689) -> 154; unhex(14690) -> 155; unhex(14691) -> 156; unhex(14692) -> 157; unhex(14693) -> 158; unhex(14694) -> 159;
+unhex(16688) -> 160; unhex(16689) -> 161; unhex(16690) -> 162; unhex(16691) -> 163; unhex(16692) -> 164; unhex(16693) -> 165; unhex(16694) -> 166; unhex(16695) -> 167; unhex(16696) -> 168; unhex(16697) -> 169;
+unhex(16705) -> 170; unhex(16706) -> 171; unhex(16707) -> 172; unhex(16708) -> 173; unhex(16709) -> 174; unhex(16710) -> 175;
+unhex(16737) -> 170; unhex(16738) -> 171; unhex(16739) -> 172; unhex(16740) -> 173; unhex(16741) -> 174; unhex(16742) -> 175;
+unhex(16944) -> 176; unhex(16945) -> 177; unhex(16946) -> 178; unhex(16947) -> 179; unhex(16948) -> 180; unhex(16949) -> 181; unhex(16950) -> 182; unhex(16951) -> 183; unhex(16952) -> 184; unhex(16953) -> 185;
+unhex(16961) -> 186; unhex(16962) -> 187; unhex(16963) -> 188; unhex(16964) -> 189; unhex(16965) -> 190; unhex(16966) -> 191;
+unhex(16993) -> 186; unhex(16994) -> 187; unhex(16995) -> 188; unhex(16996) -> 189; unhex(16997) -> 190; unhex(16998) -> 191;
+unhex(17200) -> 192; unhex(17201) -> 193; unhex(17202) -> 194; unhex(17203) -> 195; unhex(17204) -> 196; unhex(17205) -> 197; unhex(17206) -> 198; unhex(17207) -> 199; unhex(17208) -> 200; unhex(17209) -> 201;
+unhex(17217) -> 202; unhex(17218) -> 203; unhex(17219) -> 204; unhex(17220) -> 205; unhex(17221) -> 206; unhex(17222) -> 207;
+unhex(17249) -> 202; unhex(17250) -> 203; unhex(17251) -> 204; unhex(17252) -> 205; unhex(17253) -> 206; unhex(17254) -> 207;
+unhex(17456) -> 208; unhex(17457) -> 209; unhex(17458) -> 210; unhex(17459) -> 211; unhex(17460) -> 212; unhex(17461) -> 213; unhex(17462) -> 214; unhex(17463) -> 215; unhex(17464) -> 216; unhex(17465) -> 217;
+unhex(17473) -> 218; unhex(17474) -> 219; unhex(17475) -> 220; unhex(17476) -> 221; unhex(17477) -> 222; unhex(17478) -> 223;
+unhex(17505) -> 218; unhex(17506) -> 219; unhex(17507) -> 220; unhex(17508) -> 221; unhex(17509) -> 222; unhex(17510) -> 223;
+unhex(17712) -> 224; unhex(17713) -> 225; unhex(17714) -> 226; unhex(17715) -> 227; unhex(17716) -> 228; unhex(17717) -> 229; unhex(17718) -> 230; unhex(17719) -> 231; unhex(17720) -> 232; unhex(17721) -> 233;
+unhex(17729) -> 234; unhex(17730) -> 235; unhex(17731) -> 236; unhex(17732) -> 237; unhex(17733) -> 238; unhex(17734) -> 239;
+unhex(17761) -> 234; unhex(17762) -> 235; unhex(17763) -> 236; unhex(17764) -> 237; unhex(17765) -> 238; unhex(17766) -> 239;
+unhex(17968) -> 240; unhex(17969) -> 241; unhex(17970) -> 242; unhex(17971) -> 243; unhex(17972) -> 244; unhex(17973) -> 245; unhex(17974) -> 246; unhex(17975) -> 247; unhex(17976) -> 248; unhex(17977) -> 249;
+unhex(17985) -> 250; unhex(17986) -> 251; unhex(17987) -> 252; unhex(17988) -> 253; unhex(17989) -> 254; unhex(17990) -> 255;
+unhex(18017) -> 250; unhex(18018) -> 251; unhex(18019) -> 252; unhex(18020) -> 253; unhex(18021) -> 254; unhex(18022) -> 255;
+unhex(24880) -> 160; unhex(24881) -> 161; unhex(24882) -> 162; unhex(24883) -> 163; unhex(24884) -> 164; unhex(24885) -> 165; unhex(24886) -> 166; unhex(24887) -> 167; unhex(24888) -> 168; unhex(24889) -> 169;
+unhex(24897) -> 170; unhex(24898) -> 171; unhex(24899) -> 172; unhex(24900) -> 173; unhex(24901) -> 174; unhex(24902) -> 175;
+unhex(24929) -> 170; unhex(24930) -> 171; unhex(24931) -> 172; unhex(24932) -> 173; unhex(24933) -> 174; unhex(24934) -> 175;
+unhex(25136) -> 176; unhex(25137) -> 177; unhex(25138) -> 178; unhex(25139) -> 179; unhex(25140) -> 180; unhex(25141) -> 181; unhex(25142) -> 182; unhex(25143) -> 183; unhex(25144) -> 184; unhex(25145) -> 185;
+unhex(25153) -> 186; unhex(25154) -> 187; unhex(25155) -> 188; unhex(25156) -> 189; unhex(25157) -> 190; unhex(25158) -> 191;
+unhex(25185) -> 186; unhex(25186) -> 187; unhex(25187) -> 188; unhex(25188) -> 189; unhex(25189) -> 190; unhex(25190) -> 191;
+unhex(25392) -> 192; unhex(25393) -> 193; unhex(25394) -> 194; unhex(25395) -> 195; unhex(25396) -> 196; unhex(25397) -> 197; unhex(25398) -> 198; unhex(25399) -> 199; unhex(25400) -> 200; unhex(25401) -> 201;
+unhex(25409) -> 202; unhex(25410) -> 203; unhex(25411) -> 204; unhex(25412) -> 205; unhex(25413) -> 206; unhex(25414) -> 207;
+unhex(25441) -> 202; unhex(25442) -> 203; unhex(25443) -> 204; unhex(25444) -> 205; unhex(25445) -> 206; unhex(25446) -> 207;
+unhex(25648) -> 208; unhex(25649) -> 209; unhex(25650) -> 210; unhex(25651) -> 211; unhex(25652) -> 212; unhex(25653) -> 213; unhex(25654) -> 214; unhex(25655) -> 215; unhex(25656) -> 216; unhex(25657) -> 217;
+unhex(25665) -> 218; unhex(25666) -> 219; unhex(25667) -> 220; unhex(25668) -> 221; unhex(25669) -> 222; unhex(25670) -> 223;
+unhex(25697) -> 218; unhex(25698) -> 219; unhex(25699) -> 220; unhex(25700) -> 221; unhex(25701) -> 222; unhex(25702) -> 223;
+unhex(25904) -> 224; unhex(25905) -> 225; unhex(25906) -> 226; unhex(25907) -> 227; unhex(25908) -> 228; unhex(25909) -> 229; unhex(25910) -> 230; unhex(25911) -> 231; unhex(25912) -> 232; unhex(25913) -> 233;
+unhex(25921) -> 234; unhex(25922) -> 235; unhex(25923) -> 236; unhex(25924) -> 237; unhex(25925) -> 238; unhex(25926) -> 239;
+unhex(25953) -> 234; unhex(25954) -> 235; unhex(25955) -> 236; unhex(25956) -> 237; unhex(25957) -> 238; unhex(25958) -> 239;
+unhex(26160) -> 240; unhex(26161) -> 241; unhex(26162) -> 242; unhex(26163) -> 243; unhex(26164) -> 244; unhex(26165) -> 245; unhex(26166) -> 246; unhex(26167) -> 247; unhex(26168) -> 248; unhex(26169) -> 249;
+unhex(26177) -> 250; unhex(26178) -> 251; unhex(26179) -> 252; unhex(26180) -> 253; unhex(26181) -> 254; unhex(26182) -> 255;
+unhex(26209) -> 250; unhex(26210) -> 251; unhex(26211) -> 252; unhex(26212) -> 253; unhex(26213) -> 254; unhex(26214) -> 255.
badarg_with_cause(Args, Cause) ->
erlang:error(badarg, Args, [{error_info, #{module => erl_stdlib_errors,