9 #ifndef EAGINE_BASE64_HPP
10 #define EAGINE_BASE64_HPP
19 static constexpr
auto make_base64_encode_transform() {
20 return [](
byte b) -> always_valid<char> {
21 const auto i = int(b);
23 return {char(
'A' + i)};
26 return {char(
'a' + i - 26)};
29 return {char(
'0' + i - 52)};
41 static constexpr
auto make_base64_decode_transform() {
42 return [](
char c) -> optionally_valid<byte> {
43 if((c >=
'A') && (c <=
'Z')) {
44 return {
byte(c -
'A'),
true};
46 if((c >=
'a') && (c <=
'z')) {
47 return {
byte(c -
'a' + 26),
true};
49 if((c >=
'0') && (c <=
'9')) {
50 return {
byte(c -
'0' + 52),
true};
53 return {
byte(62),
true};
56 return {
byte(63),
true};
62 static inline auto base64_encoded_length(
span_size_t orig_size) noexcept {
63 return dissolved_bits_length(orig_size, 6);
66 static inline auto base64_decoded_length(
span_size_t orig_size) noexcept {
67 return concentrated_bits_length(orig_size, 6);
70 template <
typename Ps,
typename Ss,
typename Pd,
typename Sd>
71 static inline auto base64_encode(
72 memory::basic_span<const byte, Ps, Ss> src,
73 memory::basic_span<char, Pd, Sd> dst) -> memory::basic_span<char, Pd, Sd> {
78 make_span_getter(i, src),
79 make_span_putter(o, dst, make_base64_encode_transform()),
86 template <
typename P,
typename S,
typename Dst>
88 base64_encode(memory::basic_span<const byte, P, S> src, Dst& dst)
89 -> optional_reference_wrapper<Dst> {
90 using Ds =
typename Dst::size_type;
91 dst.resize(Ds(base64_encoded_length(src.size())));
96 make_span_getter(i, src),
97 make_span_putter(o, dst, make_base64_encode_transform()),
105 template <
typename Ps,
typename Ss,
typename Pd,
typename Sd>
106 static inline auto base64_decode(
107 memory::basic_span<const char, Ps, Ss> src,
108 memory::basic_span<byte, Pd, Sd> dst) -> memory::basic_span<byte, Pd, Sd> {
112 if(do_concentrate_bits(
113 make_span_getter(i, src, make_base64_decode_transform()),
114 make_span_putter(o, dst),
121 template <
typename P,
typename S,
typename Dst>
123 base64_decode(memory::basic_span<const char, P, S> src, Dst& dst)
124 -> optional_reference_wrapper<Dst> {
125 using Ds =
typename Dst::size_type;
126 dst.resize(Ds(base64_decoded_length(src.size())));
130 if(do_concentrate_bits(
131 make_span_getter(i, src, make_base64_decode_transform()),
132 make_span_putter(o, dst),
141 #endif // EAGINE_BASE64_HPP