28#ifndef ETL_BASE64_ENCODER_INCLUDED
29#define ETL_BASE64_ENCODER_INCLUDED
32#include "static_assert.h"
51#define ETL_IS_8_BIT_INTEGRAL(Type) (etl::is_integral<typename etl::remove_cv<Type>::type>::value && \
52 (etl::integral_limits<typename etl::remove_cv<Type>::type>::bits == 8U))
54#define ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(Type) (etl::is_integral<typename etl::iterator_traits<typename etl::remove_cv<Type>::type>::value_type>::value && \
55 (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())
87 if (output_buffer_is_full())
90 reset_output_buffer();
101 template <
typename TInputIterator>
105 ETL_STATIC_ASSERT(ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(
TInputIterator),
"Input type must be an 8 bit integral");
121 template <
typename TInputIterator>
125 ETL_STATIC_ASSERT(ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(
TInputIterator),
"Input type must be an 8 bit integral");
141 template <
typename TInputIterator>
151 template <
typename TInputIterator>
167 reset_input_buffer();
182 reset_output_buffer();
195 reset_input_buffer();
196 reset_output_buffer();
206 return p_output_buffer;
216 return p_output_buffer + output_buffer_length;
226 return p_output_buffer;
236 return p_output_buffer + output_buffer_length;
247 return output_buffer_length;
257 return output_buffer_max_size;
304 , input_buffer_length(0)
306 , output_buffer_length(0)
319 switch (input_buffer_length)
328 push_to_output_buffer(encoder_table[(
octets >> 6) & 0x3F]);
329 push_to_output_buffer(encoder_table[(
octets >> 0) & 0x3F]);
333 push_to_output_buffer(
'=');
334 push_to_output_buffer(
'=');
346 push_to_output_buffer(encoder_table[(
octets >> 12) & 0x3F]);
347 push_to_output_buffer(encoder_table[(
octets >> 6) & 0x3F]);
348 push_to_output_buffer(encoder_table[(
octets >> 0) & 0x3F]);
352 push_to_output_buffer(
'=');
360 uint32_t octets = (input_buffer[0] << 16) | (input_buffer[1] << 8) | input_buffer[2];
363 push_to_output_buffer(encoder_table[(
octets >> 18) & 0x3F]);
364 push_to_output_buffer(encoder_table[(
octets >> 12) & 0x3F]);
365 push_to_output_buffer(encoder_table[(
octets >> 6) & 0x3F]);
366 push_to_output_buffer(encoder_table[(
octets >> 0) & 0x3F]);
424 void push_to_output_buffer(
char c)
426 if (output_buffer_length < output_buffer_max_size)
428 p_output_buffer[output_buffer_length++] =
c;
440 bool output_buffer_is_full()
const
442 return output_buffer_length == output_buffer_max_size;
449 bool output_buffer_is_empty()
const
451 return output_buffer_length == 0;
458 void reset_output_buffer()
460 output_buffer_length = 0;
466 template <
typename T>
468 void push_to_input_buffer(T value)
470 input_buffer[input_buffer_length++] =
static_cast<uint8_t
>(value);
477 bool input_buffer_is_full()
const
479 return input_buffer_length == 3U;
486 void reset_input_buffer()
488 input_buffer_length = 0;
491 uint8_t input_buffer[3];
492 size_t input_buffer_length;
494 char* p_output_buffer;
495 size_t output_buffer_length;
496 const size_t output_buffer_max_size;
498 callback_type callback;
506 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
511 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
512 ETL_STATIC_ASSERT(((
Buffer_Size % etl::base64::Min_Encode_Buffer_Size) == 0),
"Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
562 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
567 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
568 ETL_STATIC_ASSERT(((
Buffer_Size% etl::base64::Min_Encode_Buffer_Size) == 0),
"Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
618 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
623 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
624 ETL_STATIC_ASSERT(((
Buffer_Size % etl::base64::Min_Encode_Buffer_Size) == 0),
"Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
674 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
679 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
680 ETL_STATIC_ASSERT(((
Buffer_Size% etl::base64::Min_Encode_Buffer_Size) == 0),
"Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
730 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
735 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
736 ETL_STATIC_ASSERT(((
Buffer_Size % etl::base64::Min_Encode_Buffer_Size) == 0),
"Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
786 template <
size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
791 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Encode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Encode_Buffer_Size");
792 ETL_STATIC_ASSERT(((
Buffer_Size% etl::base64::Min_Encode_Buffer_Size) == 0),
"Buffer size must be a multiple of etl::base64::Min_Encode_Buffer_Size");
840#undef ETL_IS_TYPE_8_BIT_INTEGRAL
841#undef ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL
buffer overflow exception.
Definition base64.h:71
Base64 RFC-2152 Encoder.
Definition base64_encoder.h:508
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:548
ETL_CONSTEXPR14 base64_rfc2152_encoder()
Base64 RFC-2152 constructor.
Definition base64_encoder.h:518
ETL_CONSTEXPR14 base64_rfc2152_encoder(callback_type callback_)
Base64 RFC-2152 constructor.
Definition base64_encoder.h:532
Base64 RFC-3501 Encoder.
Definition base64_encoder.h:564
ETL_CONSTEXPR14 base64_rfc3501_encoder()
Base64 RFC-3501 constructor.
Definition base64_encoder.h:574
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:604
ETL_CONSTEXPR14 base64_rfc3501_encoder(callback_type callback_)
Base64 RFC-3501 constructor.
Definition base64_encoder.h:588
Base64 RFC-4648 Encoder.
Definition base64_encoder.h:620
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:660
ETL_CONSTEXPR14 base64_rfc4648_encoder(callback_type callback_)
Base64 RFC-4648 constructor.
Definition base64_encoder.h:644
ETL_CONSTEXPR14 base64_rfc4648_encoder()
Base64 RFC-4648 constructor.
Definition base64_encoder.h:630
Base64 RFC-4648-Padding Encoder.
Definition base64_encoder.h:676
ETL_CONSTEXPR14 base64_rfc4648_padding_encoder()
Base64 RFC-4648-Padding constructor.
Definition base64_encoder.h:686
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:716
ETL_CONSTEXPR14 base64_rfc4648_padding_encoder(callback_type callback_)
Base64 RFC-4648-Padding constructor.
Definition base64_encoder.h:700
Base64 RFC-4648-URL Encoder.
Definition base64_encoder.h:732
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:772
ETL_CONSTEXPR14 base64_rfc4648_url_encoder()
Base64 RFC-4648-URL constructor.
Definition base64_encoder.h:742
ETL_CONSTEXPR14 base64_rfc4648_url_encoder(callback_type callback_)
Base64 RFC-4648-URL constructor.
Definition base64_encoder.h:756
Base64 RFC-4648-URL_Padding Encoder.
Definition base64_encoder.h:788
ETL_CONSTEXPR14 base64_rfc4648_url_padding_encoder()
Base64 RFC-4648-URL constructor.
Definition base64_encoder.h:798
ETL_CONSTEXPR14 base64_rfc4648_url_padding_encoder(callback_type callback_)
Base64 RFC-4648-URL constructor.
Definition base64_encoder.h:812
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:828
Common Base64 definitions.
Definition base64.h:110
Declaration.
Definition delegate_cpp03.h:191
Base64 Encoder.
Definition base64_encoder.h:63
ETL_NODISCARD ETL_CONSTEXPR14 span_type span() const
Definition base64_encoder.h:266
ETL_NODISCARD ETL_CONSTEXPR14 const char * cend() const
This only returns a useful value if a callback has not been set or called.
Definition base64_encoder.h:234
ETL_CONSTEXPR14 bool encode(TInputIterator input_begin, size_t input_length)
Encode to Base64.
Definition base64_encoder.h:103
ETL_NODISCARD ETL_CONSTEXPR14 size_t size() const
Definition base64_encoder.h:245
ETL_CONSTEXPR14 bool encode_block()
Encode one block of data.
Definition base64_encoder.h:317
ETL_CONSTEXPR14 void restart()
Reset the encoder.
Definition base64_encoder.h:193
ETL_NODISCARD ETL_CONSTEXPR14 bool overflow() const
Returns true if the output buffer has overflowed.
Definition base64_encoder.h:276
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:255
ETL_NODISCARD ETL_CONSTEXPR14 const char * end() const
This only returns a useful value if a callback has not been set or called.
Definition base64_encoder.h:214
ETL_NODISCARD ETL_CONSTEXPR14 bool error() const
Returns true if an error was detected.
Definition base64_encoder.h:286
ETL_CONSTEXPR14 bool encode(TInputIterator input_begin, TInputIterator input_end)
Encode to Base64.
Definition base64_encoder.h:123
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:297
ETL_CONSTEXPR14 bool flush()
Flush any remaining data to the output.
Definition base64_encoder.h:162
ETL_NODISCARD ETL_CONSTEXPR14 const char * begin() const
Returns the beginning of the output buffer.
Definition base64_encoder.h:204
ETL_CONSTEXPR14 bool encode_final(TInputIterator input_begin, TInputIterator input_end)
Encode to Base64.
Definition base64_encoder.h:153
ETL_CONSTEXPR14 bool encode_final(TInputIterator input_begin, size_t input_length)
Encode to Base64.
Definition base64_encoder.h:143
ETL_NODISCARD ETL_CONSTEXPR14 const char * cbegin() const
Returns the beginning of the output buffer.
Definition base64_encoder.h:224
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:387
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
bitset_ext
Definition absolute.h:38
pair holds two objects of arbitrary type
Definition utility.h:164