src/edh/base64/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../util/alias/others/lib.hpp" | ||
| 4 | |||
| 5 | namespace tifa_libs { | ||
| 6 | |||
| 7 | class base64 { | ||
| 8 | // NOLINTNEXTLINE(modernize-avoid-c-arrays) | ||
| 9 | static CEXP chr base[66] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/."; | ||
| 10 | // clang-format off | ||
| 11 |
9/10✓ Branch 0 taken 1072916 times.
✓ Branch 1 taken 1527656 times.
✓ Branch 2 taken 1067820 times.
✓ Branch 3 taken 459836 times.
✓ Branch 4 taken 393172 times.
✓ Branch 5 taken 66664 times.
✓ Branch 6 taken 34528 times.
✓ Branch 7 taken 32136 times.
✓ Branch 8 taken 32136 times.
✗ Branch 9 not taken.
|
2600572 | static CEXP chr ibase(chr c) NE { if('a' <= c)return c - 0x47; else if('A' <= c)return c - 0x41; else if('0' <= c)return c + 0x04; else if('+' == c)return 0x3E; else if('/' == c)return 0x3F; return 0x40; } |
| 12 | // clang-format on | ||
| 13 | |||
| 14 | public: | ||
| 15 | static CEXP strn encode(spnz a) NE { | ||
| 16 | const usz x = max(a), N = a.size(), B = max(6_usz, (usz)std::bit_width(x)); | ||
| 17 | strn S((B * N + 11) / 6, 0); | ||
| 18 | S[0] = (chr)B; | ||
| 19 | flt_ (usz, i, 0, N) | ||
| 20 | flt_ (usz, j, 0, B) | ||
| 21 | if ((a[i] >> j) & 1) S[(i * B + j) / 6 + 1] |= 1 << ((i * B + j) % 6); | ||
| 22 | for (auto& c : S) c = base[(usz)c]; | ||
| 23 | return S; | ||
| 24 | } | ||
| 25 | 52 | static CEXP vecz decode(strn S) NE { | |
| 26 |
2/2✓ Branch 6 taken 2600572 times.
✓ Branch 7 taken 52 times.
|
2600624 | for (auto& c : S) c = ibase(c); |
| 27 | 52 | const usz B = (usz)S[0], M = S.size() - 1; | |
| 28 | 52 | vecz a(6 * M / B, 0); | |
| 29 |
2/2✓ Branch 0 taken 2600520 times.
✓ Branch 1 taken 52 times.
|
2600572 | flt_ (usz, i, 0, M) |
| 30 |
2/2✓ Branch 0 taken 15603120 times.
✓ Branch 1 taken 2600520 times.
|
18203640 | flt_ (usz, j, 0, 6) |
| 31 |
2/2✓ Branch 1 taken 7712952 times.
✓ Branch 2 taken 7890168 times.
|
15603120 | if ((S[i + 1] >> j) & 1) a[(i * 6 + j) / B] |= usz(1) << ((i * 6 + j) % B); |
| 32 | 52 | return a; | |
| 33 | } | ||
| 34 | }; | ||
| 35 | |||
| 36 | } // namespace tifa_libs | ||
| 37 |