diff options
| author | Igor Sadikov <sadikov.igor@uqam.ca> | 2023-08-28 20:30:49 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-08-29 16:00:31 -0400 |
| commit | 4635179857999a64ce8350c9b3cbe90cede9ea8c (patch) | |
| tree | 933e0470c05ffa496718509316b681fe61ce321f | |
| parent | 3b2b9fcbc5e162063febf989883f29e55cc64c65 (diff) | |
| download | zig-4635179857999a64ce8350c9b3cbe90cede9ea8c.tar.gz zig-4635179857999a64ce8350c9b3cbe90cede9ea8c.zip | |
Optimize std.base64.standard.Encoder.encode
| -rw-r--r-- | lib/std/base64.zig | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/lib/std/base64.zig b/lib/std/base64.zig index 16e6aa7e8e..35a82dde01 100644 --- a/lib/std/base64.zig +++ b/lib/std/base64.zig @@ -100,21 +100,24 @@ pub const Base64Encoder = struct { const out_len = encoder.calcSize(source.len); assert(dest.len >= out_len); - var acc: u12 = 0; - var acc_len: u4 = 0; + var idx: usize = 0; var out_idx: usize = 0; - for (source) |v| { - acc = (acc << 8) + v; - acc_len += 8; - while (acc_len >= 6) { - acc_len -= 6; - dest[out_idx] = encoder.alphabet_chars[@as(u6, @truncate((acc >> acc_len)))]; - out_idx += 1; - } + while (idx + 2 < source.len) : (idx += 3) { + dest[out_idx] = encoder.alphabet_chars[source[idx] >> 2]; + dest[out_idx + 1] = encoder.alphabet_chars[((source[idx] & 0x3) << 4) | (source[idx + 1] >> 4)]; + dest[out_idx + 2] = encoder.alphabet_chars[(source[idx + 1] & 0xf) << 2 | (source[idx + 2] >> 6)]; + dest[out_idx + 3] = encoder.alphabet_chars[source[idx + 2] & 0x3f]; + out_idx += 4; } - if (acc_len > 0) { - dest[out_idx] = encoder.alphabet_chars[@as(u6, @truncate((acc << 6 - acc_len)))]; - out_idx += 1; + if (idx + 1 < source.len) { + dest[out_idx] = encoder.alphabet_chars[source[idx] >> 2]; + dest[out_idx + 1] = encoder.alphabet_chars[((source[idx] & 0x3) << 4) | (source[idx + 1] >> 4)]; + dest[out_idx + 2] = encoder.alphabet_chars[(source[idx + 1] & 0xf) << 2]; + out_idx += 3; + } else if (idx < source.len) { + dest[out_idx] = encoder.alphabet_chars[source[idx] >> 2]; + dest[out_idx + 1] = encoder.alphabet_chars[(source[idx] & 0x3) << 4]; + out_idx += 2; } if (encoder.pad_char) |pad_char| { for (dest[out_idx..out_len]) |*pad| { |
