Embedded Template Library 1.0
Loading...
Searching...
No Matches
base64_encoder.h
1//*************************************************************************
3//*************************************************************************///\file
4
5/******************************************************************************
6The MIT License(MIT)
7Embedded Template Library.
8https://github.com/ETLCPP/etl
9https://www.etlcpp.com
10Copyright(c) 2024 John Wellbelove
11Permission is hereby granted, free of charge, to any person obtaining a copy
12of this software and associated documentation files(the "Software"), to deal
13in the Software without restriction, including without limitation the rights
14to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
15copies of the Software, and to permit persons to whom the Software is
16furnished to do so, subject to the following conditions :
17The above copyright notice and this permission notice shall be included in all
18copies or substantial portions of the Software.
19THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
22AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25SOFTWARE.
26******************************************************************************/
27
28#ifndef ETL_BASE64_ENCODER_INCLUDED
29#define ETL_BASE64_ENCODER_INCLUDED
30
31#include "platform.h"
32#include "algorithm.h"
33#include "binary.h"
34#include "delegate.h"
35#include "enum_type.h"
36#include "error_handler.h"
37#include "integral_limits.h"
38#include "iterator.h"
39#include "span.h"
40#include "static_assert.h"
41#include "type_traits.h"
42
43#include "base64.h"
44
45#include <stdint.h>
46
47#if ETL_USING_STL
48 #include <iterator>
49#endif
50
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))
53
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))
57
58namespace etl
59{
60 //*************************************************************************
62 //*************************************************************************
63 class ibase64_encoder : public base64
64 {
65 public:
66
67 typedef etl::span<const char> span_type;
68 typedef etl::delegate<void(const span_type&)> callback_type;
69
70 //*************************************************************************
72 //*************************************************************************
73 template <typename T>
74 ETL_CONSTEXPR14 bool encode(T value)
75 {
76 ETL_STATIC_ASSERT(ETL_IS_8_BIT_INTEGRAL(T), "Input type must be an 8 bit integral");
77
78 push_to_input_buffer(value);
79
80 if (input_buffer_is_full())
81 {
83 reset_input_buffer();
84
85 if (callback.is_valid())
86 {
87 if (output_buffer_is_full())
88 {
89 callback(span());
90 reset_output_buffer();
91 }
92 }
93 }
94
95 return !error();
96 }
97
98 //*************************************************************************
100 //*************************************************************************
101 template <typename TInputIterator>
102 ETL_CONSTEXPR14 bool encode(TInputIterator input_begin, size_t input_length)
103 {
104 ETL_STATIC_ASSERT(ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(TInputIterator), "Input type must be an 8 bit integral");
105
106 while (input_length-- != 0)
107 {
108 if (!encode(*input_begin++))
109 {
110 return false;
111 }
112 }
113
114 return true;
115 }
116
117 //*************************************************************************
119 //*************************************************************************
120 template <typename TInputIterator>
121 ETL_CONSTEXPR14 bool encode(TInputIterator input_begin, TInputIterator input_end)
122 {
123 ETL_STATIC_ASSERT(ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(TInputIterator), "Input type must be an 8 bit integral");
124
125 while (input_begin != input_end)
126 {
127 if (!encode(*input_begin++))
128 {
129 return false;
130 }
131 }
132
133 return true;
134 }
135
136 //*************************************************************************
138 //*************************************************************************
139 template <typename TInputIterator>
140 ETL_CONSTEXPR14 bool encode_final(TInputIterator input_begin, size_t input_length)
141 {
142 return encode(input_begin, input_length) && flush();
143 }
144
145 //*************************************************************************
147 //*************************************************************************
148 template <typename TInputIterator>
149 ETL_CONSTEXPR14 bool encode_final(TInputIterator input_begin, TInputIterator input_end)
150 {
151 return encode(input_begin, input_end) && flush();
152 }
153
154 //*************************************************************************
156 //*************************************************************************
157 ETL_CONSTEXPR14 bool flush()
158 {
159 // Encode any remaining input data.
160 bool success = encode_block();
161
162 reset_input_buffer();
163
164 if (success)
165 {
166 if (callback.is_valid())
167 {
168 // Send any remaining data.
169 if (size() != 0)
170 {
171 callback(span());
172 }
173
174 // Indicate this was the final block.
175 callback(span_type());
176
177 reset_output_buffer();
178 }
179 }
180
181 return success;
182 }
183
184 //*************************************************************************
186 //*************************************************************************
187 ETL_CONSTEXPR14 void restart()
188 {
189 reset_input_buffer();
190 reset_output_buffer();
191 }
192
193 //*************************************************************************
195 //*************************************************************************
196 ETL_NODISCARD ETL_CONSTEXPR14 const char* begin() const
197 {
198 return p_output_buffer;
199 }
200
201 //*************************************************************************
204 //*************************************************************************
205 ETL_NODISCARD ETL_CONSTEXPR14 const char* end() const
206 {
207 return p_output_buffer + output_buffer_length;
208 }
209
210 //*************************************************************************
212 //*************************************************************************
213 ETL_NODISCARD ETL_CONSTEXPR14 const char* cbegin() const
214 {
215 return p_output_buffer;
216 }
217
218 //*************************************************************************
221 //*************************************************************************
222 ETL_NODISCARD ETL_CONSTEXPR14 const char* cend() const
223 {
224 return p_output_buffer + output_buffer_length;
225 }
226
227 //*************************************************************************
231 //*************************************************************************
232 ETL_NODISCARD ETL_CONSTEXPR14 size_t size() const
233 {
234 return output_buffer_length;
235 }
236
237 //*************************************************************************
239 //*************************************************************************
240 ETL_NODISCARD ETL_CONSTEXPR14 size_t max_size() const
241 {
242 return output_buffer_max_size;
243 }
244
245 //*************************************************************************
249 //*************************************************************************
250 ETL_NODISCARD ETL_CONSTEXPR14 span_type span() const
251 {
252 return span_type(begin(), end());
253 }
254
255 //*************************************************************************
257 //*************************************************************************
258 ETL_NODISCARD ETL_CONSTEXPR14 bool overflow() const
259 {
260 return overflowed;
261 }
262
263 //*************************************************************************
265 //*************************************************************************
266 ETL_NODISCARD ETL_CONSTEXPR14 bool error() const
267 {
268 return overflow();
269 }
270
271 protected:
272
273 //*************************************************************************
275 //*************************************************************************
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_)
279 , input_buffer()
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_)
285 , overflowed(false)
286 {
287 }
288
289 //*************************************************************************
291 //*************************************************************************
292 ETL_CONSTEXPR14 bool encode_block()
293 {
294 switch (input_buffer_length)
295 {
296 // Only triggered on call to flush().
297 case 1:
298 {
299 uint32_t octets = input_buffer[0];
300 octets = octets << 4; // Adjust one octet (8 bits) for two sextets
301 // worth of data (12 bits)
302
303 // Write out two sextets + optional padding.
304 push_to_output_buffer(encoder_table[(octets >> 6) & 0x3F]);
305 push_to_output_buffer(encoder_table[(octets >> 0) & 0x3F]);
306
307 if (use_padding)
308 {
309 push_to_output_buffer('=');
310 push_to_output_buffer('=');
311 }
312 break;
313 }
314
315 // Only triggered on call to flush().
316 case 2:
317 {
318 uint32_t octets = (static_cast<uint32_t>(input_buffer[0]) << 8) | input_buffer[1];
319 octets <<= 2; // Adjust two octets (16 bits) for three sextets worth
320 // of data (18 bits)
321
322 // Write out three sextets + optional padding.
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]);
326
327 if (use_padding)
328 {
329 push_to_output_buffer('=');
330 }
331 break;
332 }
333
334 // Only triggered on call to encode().
335 case 3:
336 {
337 uint32_t octets = (static_cast<uint32_t>(input_buffer[0]) << 16) | (static_cast<uint32_t>(input_buffer[1]) << 8) | input_buffer[2];
338
339 // Write out four sextets
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]);
344 break;
345 }
346
347 default:
348 {
349 break;
350 }
351 }
352
353 ETL_ASSERT(!overflowed, ETL_ERROR(etl::base64_overflow));
354
355 return !overflowed;
356 }
357
358 //*************************************************************************
360 //*************************************************************************
361 ETL_NODISCARD
362 static
363 ETL_CONSTEXPR14 size_t encoded_size(size_t input_length, bool use_padding)
364 {
365 size_t required_output_length = 0;
366
367 if (input_length == 0U)
368 {
369 return 0U;
370 }
371
372 if (use_padding)
373 {
374 required_output_length = (input_length * 4U) / 3U;
375
376 while ((required_output_length % 4U) != 0)
377 {
378 ++required_output_length;
379 }
380 }
381 else
382 {
383 required_output_length = input_length + (((input_length - 1U) / 3U) + 1U);
384 }
385
386 while (required_output_length % 4)
387 {
388 ++required_output_length;
389 }
390
391 return required_output_length;
392 }
393
394 private:
395
396 //*************************************************************************
397 // Push to the output buffer.
398 //*************************************************************************
399 ETL_CONSTEXPR14 void push_to_output_buffer(char c)
400 {
401 if (output_buffer_length < output_buffer_max_size)
402 {
403 p_output_buffer[output_buffer_length++] = c;
404 }
405 else
406 {
407 overflowed = true;
408 }
409 }
410
411 //*************************************************************************
412 //
413 //*************************************************************************
414 ETL_CONSTEXPR14 bool output_buffer_is_full() const
415 {
416 return output_buffer_length == output_buffer_max_size;
417 }
418
419 //*************************************************************************
420 //
421 //*************************************************************************
422 ETL_CONSTEXPR14 bool output_buffer_is_empty() const
423 {
424 return output_buffer_length == 0;
425 }
426
427 //*************************************************************************
428 //
429 //*************************************************************************
430 ETL_CONSTEXPR14 void reset_output_buffer()
431 {
432 output_buffer_length = 0;
433 }
434
435 //*************************************************************************
436 // Push to the input buffer.
437 //*************************************************************************
438 template <typename T>
439 ETL_CONSTEXPR14 void push_to_input_buffer(T value)
440 {
441 input_buffer[input_buffer_length++] = static_cast<uint8_t>(value);
442 }
443
444 //*************************************************************************
445 //
446 //*************************************************************************
447 ETL_CONSTEXPR14 bool input_buffer_is_full() const
448 {
449 return input_buffer_length == 3U;
450 }
451
452 //*************************************************************************
453 //
454 //*************************************************************************
455 ETL_CONSTEXPR14 void reset_input_buffer()
456 {
457 input_buffer_length = 0;
458 }
459
460 uint8_t input_buffer[3];
461 size_t input_buffer_length;
462
463 char* p_output_buffer;
464 size_t output_buffer_length;
465 const size_t output_buffer_max_size;
466
467 callback_type callback;
468
469 bool overflowed;
470 };
471
472 //*************************************************************************
474 //*************************************************************************
475 template <size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
477 {
478 public:
479
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");
483
484 //*************************************************************************
486 //*************************************************************************
487 ETL_CONSTEXPR14 base64_rfc2152_encoder()
488 : ibase64_encoder(etl::base64::character_set_1(), etl::base64::Padding::No_Padding, output_buffer, Buffer_Size, callback_type())
489 , output_buffer()
490 {
491 }
492
493 //*************************************************************************
495 //*************************************************************************
496 ETL_CONSTEXPR14 base64_rfc2152_encoder(callback_type callback_)
497 : ibase64_encoder(etl::base64::character_set_1(), etl::base64::Padding::No_Padding, output_buffer, Buffer_Size, callback_)
498 , output_buffer()
499 {
500 }
501
502 //*************************************************************************
504 //*************************************************************************
505 ETL_NODISCARD
506 static
507 ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
508 {
509 return ibase64_encoder::encoded_size(input_length, etl::base64::Padding::No_Padding);
510 }
511
512 private:
513
515 char output_buffer[Buffer_Size];
516 };
517
518 //*************************************************************************
520 //*************************************************************************
521 template <size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
523 {
524 public:
525
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");
529
530 //*************************************************************************
532 //*************************************************************************
533 ETL_CONSTEXPR14 base64_rfc3501_encoder()
534 : ibase64_encoder(etl::base64::character_set_3(), etl::base64::Padding::No_Padding, output_buffer, Buffer_Size, callback_type())
535 , output_buffer()
536 {
537 }
538
539 //*************************************************************************
541 //*************************************************************************
542 ETL_CONSTEXPR14 base64_rfc3501_encoder(callback_type callback_)
543 : ibase64_encoder(etl::base64::character_set_3(), etl::base64::Padding::No_Padding, output_buffer, Buffer_Size, callback_)
544 , output_buffer()
545 {
546 }
547
548 //*************************************************************************
550 //*************************************************************************
551 ETL_NODISCARD
552 static
553 ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
554 {
555 return ibase64_encoder::encoded_size(input_length, etl::base64::Padding::No_Padding);
556 }
557
558 private:
559
561 char output_buffer[Buffer_Size];
562 };
563
564 //*************************************************************************
566 //*************************************************************************
567 template <size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
569 {
570 public:
571
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");
575
576 //*************************************************************************
578 //*************************************************************************
579 ETL_CONSTEXPR14 base64_rfc4648_encoder()
580 : ibase64_encoder(etl::base64::character_set_1(), etl::base64::Padding::No_Padding, output_buffer, Buffer_Size, callback_type())
581 , output_buffer()
582 {
583 }
584
585 //*************************************************************************
587 //*************************************************************************
588 ETL_CONSTEXPR14 base64_rfc4648_encoder(callback_type callback_)
589 : ibase64_encoder(etl::base64::character_set_1(), etl::base64::Padding::No_Padding, output_buffer, Buffer_Size, callback_)
590 , output_buffer()
591 {
592 }
593
594 //*************************************************************************
596 //*************************************************************************
597 ETL_NODISCARD
598 static
599 ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
600 {
601 return ibase64_encoder::encoded_size(input_length, etl::base64::Padding::No_Padding);
602 }
603
604 private:
605
607 char output_buffer[Buffer_Size];
608 };
609
610 //*************************************************************************
612 //*************************************************************************
613 template <size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
615 {
616 public:
617
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");
621
622 //*************************************************************************
624 //*************************************************************************
626 : ibase64_encoder(etl::base64::character_set_1(), etl::base64::Padding::Use_Padding, output_buffer, Buffer_Size, callback_type())
627 , output_buffer()
628 {
629 }
630
631 //*************************************************************************
633 //*************************************************************************
634 ETL_CONSTEXPR14 base64_rfc4648_padding_encoder(callback_type callback_)
635 : ibase64_encoder(etl::base64::character_set_1(), etl::base64::Padding::Use_Padding, output_buffer, Buffer_Size, callback_)
636 , output_buffer()
637 {
638 }
639
640 //*************************************************************************
642 //*************************************************************************
643 ETL_NODISCARD
644 static
645 ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
646 {
647 return ibase64_encoder::encoded_size(input_length, etl::base64::Padding::Use_Padding);
648 }
649
650 private:
651
653 char output_buffer[Buffer_Size];
654 };
655
656 //*************************************************************************
658 //*************************************************************************
659 template <size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
661 {
662 public:
663
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");
667
668 //*************************************************************************
670 //*************************************************************************
672 : ibase64_encoder(etl::base64::character_set_2(), etl::base64::Padding::No_Padding, output_buffer, Buffer_Size, callback_type())
673 , output_buffer()
674 {
675 }
676
677 //*************************************************************************
679 //*************************************************************************
680 ETL_CONSTEXPR14 base64_rfc4648_url_encoder(callback_type callback_)
681 : ibase64_encoder(etl::base64::character_set_2(), etl::base64::Padding::No_Padding, output_buffer, Buffer_Size, callback_)
682 , output_buffer()
683 {
684 }
685
686 //*************************************************************************
688 //*************************************************************************
689 ETL_NODISCARD
690 static
691 ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
692 {
693 return ibase64_encoder::encoded_size(input_length, etl::base64::Padding::No_Padding);
694 }
695
696 private:
697
699 char output_buffer[Buffer_Size];
700 };
701
702 //*************************************************************************
704 //*************************************************************************
705 template <size_t Buffer_Size = etl::base64::Min_Encode_Buffer_Size>
707 {
708 public:
709
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");
713
714 //*************************************************************************
716 //*************************************************************************
718 : ibase64_encoder(etl::base64::character_set_2(), etl::base64::Padding::Use_Padding, output_buffer, Buffer_Size, callback_type())
719 , output_buffer()
720 {
721 }
722
723 //*************************************************************************
725 //*************************************************************************
726 ETL_CONSTEXPR14 base64_rfc4648_url_padding_encoder(callback_type callback_)
727 : ibase64_encoder(etl::base64::character_set_2(), etl::base64::Padding::Use_Padding, output_buffer, Buffer_Size, callback_)
728 , output_buffer()
729 {
730 }
731
732 //*************************************************************************
734 //*************************************************************************
735 ETL_NODISCARD
736 static
737 ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
738 {
739 return ibase64_encoder::encoded_size(input_length, etl::base64::Padding::Use_Padding);
740 }
741
742 private:
743
745 char output_buffer[Buffer_Size];
746 };
747} // namespace etl
748
749#undef ETL_IS_TYPE_8_BIT_INTEGRAL
750#undef ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL
751
752#endif
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
Definition base64.h:142