9#ifndef INCLUDED_BSLFMT_STANDARDFORMATSPECIFICATION
10#define INCLUDED_BSLFMT_STANDARDFORMATSPECIFICATION
56#include <bslscm_version.h>
76template <
class t_CHAR>
138 Parser d_basicParser;
181 template <
class t_PARSE_CONTEXT>
193 template <
typename t_FORMAT_CONTEXT>
287template <
class t_CHAR>
289void StandardFormatSpecification<t_CHAR>::parseType(
294 if (typeString.
empty()) {
296 case e_CATEGORY_UNASSIGNED: {
297 d_formatType = e_TYPE_UNASSIGNED;
298 BSLS_THROW(bsl::format_error(
"Unassigned category"));
300 case e_CATEGORY_STRING: {
301 d_formatType = e_STRING_DEFAULT;
303 case e_CATEGORY_INTEGRAL: {
304 d_formatType = e_INTEGRAL_DECIMAL;
306 case e_CATEGORY_CHARACTER: {
307 d_formatType = e_CHARACTER_CHARACTER;
309 case e_CATEGORY_BOOLEAN: {
310 d_formatType = e_BOOLEAN_STRING;
312 case e_CATEGORY_FLOATING: {
313 d_formatType = e_FLOATING_DEFAULT;
315 case e_CATEGORY_POINTER: {
316 d_formatType = e_POINTER_HEX;
319 d_formatType = e_TYPE_UNASSIGNED;
320 BSLS_THROW(bsl::format_error(
"Unexpected category"));
327 if (typeString.
size() > 1) {
328 d_formatType = e_TYPE_UNASSIGNED;
330 bsl::format_error(
"Standard types are single-character"));
333 t_CHAR frontChar = typeString.
front();
336 char typeChar = (frontChar >= 0 && frontChar <= 0x7f)
337 ?
static_cast<char>(frontChar)
338 :
static_cast<char>(0);
341 case e_CATEGORY_UNASSIGNED: {
342 d_formatType = e_TYPE_UNASSIGNED;
343 BSLS_THROW(bsl::format_error(
"Invalid unassigned category"));
345 case e_CATEGORY_STRING: {
348 d_formatType = e_STRING_DEFAULT;
351 d_formatType = e_STRING_ESCAPED;
354 d_formatType = e_TYPE_UNASSIGNED;
356 bsl::format_error(
"Invalid type for string"));
360 case e_CATEGORY_INTEGRAL: {
363 d_formatType = e_INTEGRAL_BINARY;
366 d_formatType = e_INTEGRAL_BINARY_UC;
369 d_formatType = e_INTEGRAL_CHARACTER;
372 d_formatType = e_INTEGRAL_DECIMAL;
375 d_formatType = e_INTEGRAL_OCTAL;
378 d_formatType = e_INTEGRAL_HEX;
381 d_formatType = e_INTEGRAL_HEX_UC;
384 d_formatType = e_TYPE_UNASSIGNED;
386 bsl::format_error(
"Invalid type for integers"));
390 case e_CATEGORY_CHARACTER: {
393 d_formatType = e_INTEGRAL_BINARY;
396 d_formatType = e_INTEGRAL_BINARY_UC;
399 d_formatType = e_CHARACTER_CHARACTER;
402 d_formatType = e_INTEGRAL_DECIMAL;
405 d_formatType = e_INTEGRAL_OCTAL;
408 d_formatType = e_INTEGRAL_HEX;
411 d_formatType = e_INTEGRAL_HEX_UC;
414 d_formatType = e_CHARACTER_ESCAPED;
417 d_formatType = e_TYPE_UNASSIGNED;
419 bsl::format_error(
"Invalid type for character types"));
423 case e_CATEGORY_BOOLEAN: {
426 d_formatType = e_INTEGRAL_BINARY;
429 d_formatType = e_INTEGRAL_BINARY_UC;
432 d_formatType = e_INTEGRAL_DECIMAL;
435 d_formatType = e_INTEGRAL_OCTAL;
438 d_formatType = e_BOOLEAN_STRING;
441 d_formatType = e_INTEGRAL_HEX;
444 d_formatType = e_INTEGRAL_HEX_UC;
447 d_formatType = e_TYPE_UNASSIGNED;
449 bsl::format_error(
"Invalid type for booleans"));
453 case e_CATEGORY_FLOATING: {
456 d_formatType = e_FLOATING_HEX;
459 d_formatType = e_FLOATING_HEX_UC;
462 d_formatType = e_FLOATING_SCIENTIFIC;
465 d_formatType = e_FLOATING_SCIENTIFIC_UC;
468 d_formatType = e_FLOATING_FIXED;
471 d_formatType = e_FLOATING_FIXED_UC;
474 d_formatType = e_FLOATING_GENERAL;
477 d_formatType = e_FLOATING_GENERAL_UC;
480 d_formatType = e_TYPE_UNASSIGNED;
482 bsl::format_error(
"Invalid type for floating points"));
486 case e_CATEGORY_POINTER: {
489 d_formatType = e_POINTER_HEX;
492 d_formatType = e_POINTER_HEX_UC;
495 d_formatType = e_TYPE_UNASSIGNED;
497 bsl::format_error(
"Invalid type for pointers"));
502 d_formatType = e_TYPE_UNASSIGNED;
504 bsl::format_error(
"Invalid type for default category"));
508 if (e_TYPE_UNASSIGNED == d_formatType) {
510 bsl::format_error(
"Failed to parse type (reason unknown)"));
516template <
class t_CHAR>
518bool StandardFormatSpecification<t_CHAR>::isIntegerPresentationType()
const
520 return e_INTEGRAL_BINARY == formatType() ||
521 e_INTEGRAL_BINARY_UC == formatType() ||
522 e_INTEGRAL_CHARACTER == formatType() ||
523 e_INTEGRAL_DECIMAL == formatType() ||
524 e_INTEGRAL_OCTAL == formatType() ||
525 e_INTEGRAL_HEX == formatType() ||
526 e_INTEGRAL_HEX_UC == formatType();
529template <
class t_CHAR>
531bool StandardFormatSpecification<t_CHAR>::isFloatingPresentationType()
const
533 return e_FLOATING_DEFAULT == formatType() ||
534 e_FLOATING_HEX == formatType() ||
535 e_FLOATING_HEX_UC == formatType() ||
536 e_FLOATING_SCIENTIFIC == formatType() ||
537 e_FLOATING_SCIENTIFIC_UC == formatType() ||
538 e_FLOATING_FIXED == formatType() ||
539 e_FLOATING_FIXED_UC == formatType() ||
540 e_FLOATING_GENERAL == formatType() ||
541 e_FLOATING_GENERAL_UC == formatType();
544template <
class t_CHAR>
546bool StandardFormatSpecification<t_CHAR>::isPointerPresentationType()
const
548 return e_POINTER_HEX == formatType() ||
549 e_POINTER_HEX_UC == formatType();
554template <
class t_CHAR>
555template <
class t_PARSE_CONTEXT>
557 t_PARSE_CONTEXT *context,
562 typename t_PARSE_CONTEXT::const_iterator>::value_type,
567 d_processingState = e_STATE_PARSED;
570 e_SECTIONS_FILL_ALIGN |
571 e_SECTIONS_SIGN_FLAG |
572 e_SECTIONS_ALTERNATE_FLAG |
573 e_SECTIONS_ZERO_PAD_FLAG |
575 e_SECTIONS_PRECISION |
576 e_SECTIONS_LOCALE_FLAG |
577 e_SECTIONS_REMAINING_SPEC);
579 d_basicParser.
parse(context, sect);
581 if (NumericValue::e_DEFAULT != d_basicParser.rawPrecision().category() &&
582 e_CATEGORY_STRING != category && e_CATEGORY_FLOATING != category) {
583 BSLS_THROW(bsl::format_error(
"Standard specification parse failure "
584 "(precision is used with inappropriate "
588 parseType(d_basicParser.remainingSpec(), category);
590 if (e_SIGN_DEFAULT != sign() || alternativeFlag()) {
591 if (!isIntegerPresentationType() && !isFloatingPresentationType()) {
592 BSLS_THROW(bsl::format_error(
"Hash / sign option requires an "
593 "arithmetic presentation type"));
597 if (zeroPaddingFlag()) {
598 if (!isIntegerPresentationType() && !isFloatingPresentationType() &&
599 !isPointerPresentationType()) {
600 BSLS_THROW(bsl::format_error(
"Zero option requires an "
601 "arithmetic presentation type"));
605 if (context->begin() == context->end() || *context->begin() ==
'}') {
609 BSLS_THROW(bsl::format_error(
"Standard specification parse failure "
610 "(invalid character)"));
613template <
class t_CHAR>
614template <
typename t_FORMAT_CONTEXT>
616 const t_FORMAT_CONTEXT& context)
618 if (d_processingState == e_STATE_UNPARSED)
620 "Format standard specification '.parse' not called"));
622 d_basicParser.postprocess(context);
624 switch (d_basicParser.postprocessedWidth().category()) {
628 if (d_basicParser.postprocessedWidth().value() <= 0)
630 bsl::format_error(
"Zero or negative width value"));
634 bsl::format_error(
"Failed to find valid width value"));
638 switch (d_basicParser.postprocessedPrecision().category()) {
642 if (d_basicParser.postprocessedPrecision().value() < 0)
644 bsl::format_error(
"Negative precision value"));
648 bsl::format_error(
"Failed to find valid precision value"));
652 d_processingState = e_STATE_POSTPROCESSED;
656template <
class t_CHAR>
666template <
class t_CHAR>
670 return d_basicParser.filler();
673template <
class t_CHAR>
677 return d_basicParser.numFillerCharacters();
680template <
class t_CHAR>
684 return d_basicParser.fillerCodePointDisplayWidth();
687template <
class t_CHAR>
693 return d_basicParser.alignment();
696template <
class t_CHAR>
702 return d_basicParser.sign();
705template <
class t_CHAR>
709 return d_basicParser.alternativeFlag();
712template <
class t_CHAR>
716 return d_basicParser.zeroPaddingFlag();
719template <
class t_CHAR>
724 return d_basicParser.postprocessedWidth();
727template <
class t_CHAR>
732 return d_basicParser.postprocessedPrecision();
735template <
class t_CHAR>
739 return d_basicParser.localeSpecificFlag();
742template <
class t_CHAR>
747 if (e_STATE_UNPARSED == d_processingState)
749 "Format standard specification '.parse' not called"));
754template <
class t_CHAR>
759 return d_processingState;
Definition bslstl_stringview.h:471
BSLS_KEYWORD_CONSTEXPR size_type size() const BSLS_KEYWORD_NOEXCEPT
Return the length of this view.
Definition bslstl_stringview.h:1904
BSLS_KEYWORD_CONSTEXPR_CPP14 const_reference front() const
Definition bslstl_stringview.h:1966
BSLS_KEYWORD_CONSTEXPR bool empty() const BSLS_KEYWORD_NOEXCEPT
Return true if this view has length 0, and false otherwise.
Definition bslstl_stringview.h:1931
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLS_THROW(X)
Definition bsls_exceptionutil.h:374
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_CONSTEXPR_CPP20
Definition bsls_keyword.h:645
Definition bslfmt_enablestreamedformatter.h:130
Definition bslmf_issame.h:146