28#ifndef ETL_BASE64_ENCODER_INCLUDED
29#define ETL_BASE64_ENCODER_INCLUDED
40#include "static_assert.h"
51#define ETL_IS_8_BIT_INTEGRAL(Type) \
52 (etl::is_integral<typename etl::remove_cv<Type>::type>::value && (etl::integral_limits<typename etl::remove_cv<Type>::type>::bits == 8U))
54#define ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(Type) \
55 (etl::is_integral< typename etl::iterator_traits< typename etl::remove_cv<Type>::type>::value_type>::value \
56 && (etl::integral_limits< typename etl::iterator_traits< typename etl::remove_cv<Type>::type>::value_type>::bits == 8U))
76 ETL_STATIC_ASSERT(ETL_IS_8_BIT_INTEGRAL(T),
"Input type must be an 8 bit integral");
78 push_to_input_buffer(value);
80 if (input_buffer_is_full())
85 if (callback.is_valid())
87 if (output_buffer_is_full())
90 reset_output_buffer();
101 template <
typename TInputIterator>
102 ETL_CONSTEXPR14
bool encode(TInputIterator input_begin,
size_t input_length)
104 ETL_STATIC_ASSERT(ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(TInputIterator),
"Input type must be an 8 bit integral");
106 while (input_length-- != 0)
108 if (!
encode(*input_begin++))
120 template <
typename TInputIterator>
121 ETL_CONSTEXPR14
bool encode(TInputIterator input_begin, TInputIterator input_end)
123 ETL_STATIC_ASSERT(ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(TInputIterator),
"Input type must be an 8 bit integral");
125 while (input_begin != input_end)
127 if (!
encode(*input_begin++))
139 template <
typename TInputIterator>
140 ETL_CONSTEXPR14
bool encode_final(TInputIterator input_begin,
size_t input_length)
142 return encode(input_begin, input_length) &&
flush();
148 template <
typename TInputIterator>
149 ETL_CONSTEXPR14
bool encode_final(TInputIterator input_begin, TInputIterator input_end)
162 reset_input_buffer();
166 if (callback.is_valid())
175 callback(span_type());
177 reset_output_buffer();
189 reset_input_buffer();
190 reset_output_buffer();
196 ETL_NODISCARD ETL_CONSTEXPR14
const char*
begin()
const
198 return p_output_buffer;
205 ETL_NODISCARD ETL_CONSTEXPR14
const char*
end()
const
207 return p_output_buffer + output_buffer_length;
213 ETL_NODISCARD ETL_CONSTEXPR14
const char*
cbegin()
const
215 return p_output_buffer;
222 ETL_NODISCARD ETL_CONSTEXPR14
const char*
cend()
const
224 return p_output_buffer + output_buffer_length;
232 ETL_NODISCARD ETL_CONSTEXPR14
size_t size()
const
234 return output_buffer_length;
240 ETL_NODISCARD ETL_CONSTEXPR14
size_t max_size()
const
242 return output_buffer_max_size;
250 ETL_NODISCARD ETL_CONSTEXPR14 span_type
span()
const
258 ETL_NODISCARD ETL_CONSTEXPR14
bool overflow()
const
266 ETL_NODISCARD ETL_CONSTEXPR14
bool error()
const
276 ETL_CONSTEXPR14
ibase64_encoder(
const char* encoder_table_,
bool use_padding_,
char* p_output_buffer_,
size_t ouput_buffer_max_size_,
277 callback_type callback_)
278 : base64(encoder_table_, use_padding_)
280 , input_buffer_length(0)
281 , p_output_buffer(p_output_buffer_)
282 , output_buffer_length(0)
283 , output_buffer_max_size(ouput_buffer_max_size_)
284 , callback(callback_)
294 switch (input_buffer_length)
299 uint32_t octets = input_buffer[0];
300 octets = octets << 4;
304 push_to_output_buffer(encoder_table[(octets >> 6) & 0x3F]);
305 push_to_output_buffer(encoder_table[(octets >> 0) & 0x3F]);
309 push_to_output_buffer(
'=');
310 push_to_output_buffer(
'=');
318 uint32_t octets = (
static_cast<uint32_t
>(input_buffer[0]) << 8) | input_buffer[1];
323 push_to_output_buffer(encoder_table[(octets >> 12) & 0x3F]);
324 push_to_output_buffer(encoder_table[(octets >> 6) & 0x3F]);
325 push_to_output_buffer(encoder_table[(octets >> 0) & 0x3F]);
329 push_to_output_buffer(
'=');
337 uint32_t octets = (
static_cast<uint32_t
>(input_buffer[0]) << 16) | (
static_cast<uint32_t
>(input_buffer[1]) << 8) | input_buffer[2];
340 push_to_output_buffer(encoder_table[(octets >> 18) & 0x3F]);
341 push_to_output_buffer(encoder_table[(octets >> 12) & 0x3F]);
342 push_to_output_buffer(encoder_table[(octets >> 6) & 0x3F]);
343 push_to_output_buffer(encoder_table[(octets >> 0) & 0x3F]);
363 ETL_CONSTEXPR14
size_t encoded_size(
size_t input_length,
bool use_padding)
365 size_t required_output_length = 0;
367 if (input_length == 0U)
374 required_output_length = (input_length * 4U) / 3U;
376 while ((required_output_length % 4U) != 0)
378 ++required_output_length;
383 required_output_length = input_length + (((input_length - 1U) / 3U) + 1U);
386 while (required_output_length % 4)
388 ++required_output_length;
391 return required_output_length;
399 ETL_CONSTEXPR14
void push_to_output_buffer(
char c)
401 if (output_buffer_length < output_buffer_max_size)
403 p_output_buffer[output_buffer_length++] = c;
414 ETL_CONSTEXPR14
bool output_buffer_is_full()
const
416 return output_buffer_length == output_buffer_max_size;
422 ETL_CONSTEXPR14
bool output_buffer_is_empty()
const
424 return output_buffer_length == 0;
430 ETL_CONSTEXPR14
void reset_output_buffer()
432 output_buffer_length = 0;
438 template <
typename T>
439 ETL_CONSTEXPR14
void push_to_input_buffer(T value)
441 input_buffer[input_buffer_length++] =
static_cast<uint8_t
>(value);
447 ETL_CONSTEXPR14
bool input_buffer_is_full()
const
449 return input_buffer_length == 3U;
455 ETL_CONSTEXPR14
void reset_input_buffer()
457 input_buffer_length = 0;
460 uint8_t input_buffer[3];
461 size_t input_buffer_length;
463 char* p_output_buffer;
464 size_t output_buffer_length;
465 const size_t output_buffer_max_size;
467 callback_type callback;
475 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
480 ETL_STATIC_ASSERT((Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
481 ETL_STATIC_ASSERT(((Buffer_Size % etl::base64::Min_Encode_Buffer_Size) == 0),
482 "Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
515 char output_buffer[Buffer_Size];
521 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
526 ETL_STATIC_ASSERT((Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
527 ETL_STATIC_ASSERT(((Buffer_Size % etl::base64::Min_Encode_Buffer_Size) == 0),
528 "Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
561 char output_buffer[Buffer_Size];
567 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
572 ETL_STATIC_ASSERT((Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
573 ETL_STATIC_ASSERT(((Buffer_Size % etl::base64::Min_Encode_Buffer_Size) == 0),
574 "Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
607 char output_buffer[Buffer_Size];
613 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
618 ETL_STATIC_ASSERT((Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
619 ETL_STATIC_ASSERT(((Buffer_Size % etl::base64::Min_Encode_Buffer_Size) == 0),
620 "Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
653 char output_buffer[Buffer_Size];
659 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
664 ETL_STATIC_ASSERT((Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
665 ETL_STATIC_ASSERT(((Buffer_Size % etl::base64::Min_Encode_Buffer_Size) == 0),
666 "Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
699 char output_buffer[Buffer_Size];
705 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
710 ETL_STATIC_ASSERT((Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
711 ETL_STATIC_ASSERT(((Buffer_Size % etl::base64::Min_Encode_Buffer_Size) == 0),
712 "Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
745 char output_buffer[Buffer_Size];
749#undef ETL_IS_TYPE_8_BIT_INTEGRAL
750#undef ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL
buffer overflow exception.
Definition base64.h:73
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_encoder.h:507
ETL_CONSTEXPR14 base64_rfc2152_encoder()
Base64 RFC-2152 constructor.
Definition base64_encoder.h:487
ETL_CONSTEXPR14 base64_rfc2152_encoder(callback_type callback_)
Base64 RFC-2152 constructor.
Definition base64_encoder.h:496
ETL_CONSTEXPR14 base64_rfc3501_encoder()
Base64 RFC-3501 constructor.
Definition base64_encoder.h:533
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_encoder.h:553
ETL_CONSTEXPR14 base64_rfc3501_encoder(callback_type callback_)
Base64 RFC-3501 constructor.
Definition base64_encoder.h:542
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_encoder.h:599
ETL_CONSTEXPR14 base64_rfc4648_encoder(callback_type callback_)
Base64 RFC-4648 constructor.
Definition base64_encoder.h:588
ETL_CONSTEXPR14 base64_rfc4648_encoder()
Base64 RFC-4648 constructor.
Definition base64_encoder.h:579
ETL_CONSTEXPR14 base64_rfc4648_padding_encoder()
Base64 RFC-4648-Padding constructor.
Definition base64_encoder.h:625
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_encoder.h:645
ETL_CONSTEXPR14 base64_rfc4648_padding_encoder(callback_type callback_)
Base64 RFC-4648-Padding constructor.
Definition base64_encoder.h:634
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_encoder.h:691
ETL_CONSTEXPR14 base64_rfc4648_url_encoder()
Base64 RFC-4648-URL constructor.
Definition base64_encoder.h:671
ETL_CONSTEXPR14 base64_rfc4648_url_encoder(callback_type callback_)
Base64 RFC-4648-URL constructor.
Definition base64_encoder.h:680
ETL_CONSTEXPR14 base64_rfc4648_url_padding_encoder()
Base64 RFC-4648-URL constructor.
Definition base64_encoder.h:717
ETL_CONSTEXPR14 base64_rfc4648_url_padding_encoder(callback_type callback_)
Base64 RFC-4648-URL constructor.
Definition base64_encoder.h:726
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_encoder.h:737
Common Base64 definitions.
Definition base64.h:112
Declaration.
Definition delegate_cpp03.h:191
ETL_NODISCARD ETL_CONSTEXPR14 span_type span() const
Definition base64_encoder.h:250
ETL_NODISCARD ETL_CONSTEXPR14 const char * cend() const
Definition base64_encoder.h:222
ETL_CONSTEXPR14 bool encode(TInputIterator input_begin, size_t input_length)
Encode to Base64.
Definition base64_encoder.h:102
ETL_NODISCARD ETL_CONSTEXPR14 size_t size() const
Definition base64_encoder.h:232
ETL_CONSTEXPR14 bool encode_block()
Encode one block of data.
Definition base64_encoder.h:292
ETL_CONSTEXPR14 void restart()
Reset the encoder.
Definition base64_encoder.h:187
ETL_NODISCARD ETL_CONSTEXPR14 bool overflow() const
Returns true if the output buffer has overflowed.
Definition base64_encoder.h:258
ETL_CONSTEXPR14 bool encode(T value)
Encode to Base64.
Definition base64_encoder.h:74
ETL_NODISCARD ETL_CONSTEXPR14 size_t max_size() const
Returns the maximum size of the output buffer.
Definition base64_encoder.h:240
ETL_NODISCARD ETL_CONSTEXPR14 const char * end() const
Definition base64_encoder.h:205
ETL_NODISCARD ETL_CONSTEXPR14 bool error() const
Returns true if an error was detected.
Definition base64_encoder.h:266
ETL_CONSTEXPR14 bool encode(TInputIterator input_begin, TInputIterator input_end)
Encode to Base64.
Definition base64_encoder.h:121
ETL_CONSTEXPR14 ibase64_encoder(const char *encoder_table_, bool use_padding_, char *p_output_buffer_, size_t ouput_buffer_max_size_, callback_type callback_)
Constructor.
Definition base64_encoder.h:276
ETL_CONSTEXPR14 bool flush()
Flush any remaining data to the output.
Definition base64_encoder.h:157
ETL_NODISCARD ETL_CONSTEXPR14 const char * begin() const
Returns the beginning of the output buffer.
Definition base64_encoder.h:196
ETL_CONSTEXPR14 bool encode_final(TInputIterator input_begin, TInputIterator input_end)
Encode to Base64.
Definition base64_encoder.h:149
ETL_CONSTEXPR14 bool encode_final(TInputIterator input_begin, size_t input_length)
Encode to Base64.
Definition base64_encoder.h:140
ETL_NODISCARD ETL_CONSTEXPR14 const char * cbegin() const
Returns the beginning of the output buffer.
Definition base64_encoder.h:213
static ETL_NODISCARD ETL_CONSTEXPR14 size_t encoded_size(size_t input_length, bool use_padding)
Calculates the minimum buffer size required to encode to Base64.
Definition base64_encoder.h:363
Span - Fixed Extent.
Definition span.h:208
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
bitset_ext
Definition absolute.h:40