9#ifndef INCLUDED_BSLFMT_FORMATTERSTRING
10#define INCLUDED_BSLFMT_FORMATTERSTRING
106#include <bslscm_version.h>
145 int d_numSourceBytes;
151 unsigned long int d_firstCodePointValue;
154 int d_firstCodePointWidth;
221template <
class t_CHAR,
class t_CHAR_TRAITS = bsl::
char_traits<t_CHAR> >
228 Specification d_spec;
240 static void findPrecisionLimitedString(
241 size_t *charactersUsed,
244 int maxTotalDisplayWidth);
253 template <
class t_FORMAT_CONTEXT>
254 typename t_FORMAT_CONTEXT::iterator
formatImpl(
256 t_FORMAT_CONTEXT& formatContext)
const;
264 template <
class t_PARSE_CONTEXT>
266 t_PARSE_CONTEXT& parseContext);
281template <
class t_CHAR>
283: BloombergLP::bslfmt::FormatterString_Imp<t_CHAR> {
293 template <
class t_FORMAT_CONTEXT>
294 typename t_FORMAT_CONTEXT::iterator format(
296 t_FORMAT_CONTEXT& formatContext)
const;
306template <
class t_CHAR>
308: BloombergLP::bslfmt::FormatterString_Imp<t_CHAR> {
318 template <
class t_FORMAT_CONTEXT>
319 typename t_FORMAT_CONTEXT::iterator
format(
321 t_FORMAT_CONTEXT& formatContext)
const;
331template <
class t_CHAR,
size_t t_SIZE>
333: BloombergLP::bslfmt::FormatterString_Imp<t_CHAR> {
343 template <
class t_FORMAT_CONTEXT>
344 typename t_FORMAT_CONTEXT::iterator format(
346 t_FORMAT_CONTEXT& formatContext)
const;
356template <
class t_CHAR,
class t_CHAR_TRAITS,
class t_ALLOCATOR>
358: BloombergLP::bslfmt::FormatterString_Imp<t_CHAR, t_CHAR_TRAITS> {
368 template <
class t_FORMAT_CONTEXT>
369 typename t_FORMAT_CONTEXT::iterator
370 format(
const std::basic_string<t_CHAR, t_CHAR_TRAITS, t_ALLOCATOR>& value,
371 t_FORMAT_CONTEXT& formatContext)
const;
381template <
class t_CHAR,
class t_CHAR_TRAITS,
class t_ALLOCATOR>
383: BloombergLP::bslfmt::FormatterString_Imp<t_CHAR, t_CHAR_TRAITS> {
398 template <
class t_FORMAT_CONTEXT>
399 typename t_FORMAT_CONTEXT::iterator
401 t_FORMAT_CONTEXT& formatContext)
const;
404#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
413template <
class t_CHAR,
class t_CHAR_TRAITS>
415: BloombergLP::bslfmt::FormatterString_Imp<t_CHAR, t_CHAR_TRAITS> {
425 template <
class t_FORMAT_CONTEXT>
426 typename t_FORMAT_CONTEXT::iterator format(
427 std::basic_string_view<t_CHAR, t_CHAR_TRAITS> value,
428 t_FORMAT_CONTEXT& formatContext)
const;
432#ifndef BSLSTL_STRING_VIEW_IS_ALIASED
441template <
class t_CHAR,
class t_CHAR_TRAITS>
443: BloombergLP::bslfmt::FormatterString_Imp<t_CHAR, t_CHAR_TRAITS> {
459 template <
class t_FORMAT_CONTEXT>
460 typename t_FORMAT_CONTEXT::iterator format(
462 t_FORMAT_CONTEXT& formatContext)
const;
474template <
class t_CHAR>
476: BloombergLP::bslfmt::FormatterString_Imp<t_CHAR> {
493 template <
class t_FORMAT_CONTEXT>
494 typename t_FORMAT_CONTEXT::iterator format(
495 BloombergLP::bslstl::StringRefImp<t_CHAR> value,
496 t_FORMAT_CONTEXT& formatContext)
const;
524 d_numSourceBytes = 0;
526 d_firstCodePointValue = 0;
527 d_firstCodePointWidth = 0;
540 return d_numSourceBytes;
546 return d_numCodePoints;
552 return d_firstCodePointValue;
558 return d_firstCodePointWidth;
565template <
class t_CHAR,
class t_CHAR_TRAITS>
567 size_t *charactersUsed,
570 int maxTotalDisplayWidth)
575 const t_CHAR *current = inputString.
data();
576 size_t bytesLeft = inputString.
size() *
sizeof(t_CHAR);
578 while (bytesLeft > 0) {
581 switch (
sizeof(t_CHAR)) {
592 BSLS_THROW(bsl::format_error(
"Invalid character width"));
596 BSLS_THROW(bsl::format_error(
"Invalid unicode stream"));
612template <
class t_CHAR,
class t_CHAR_TRAITS>
613template <
class t_FORMAT_CONTEXT>
614typename t_FORMAT_CONTEXT::iterator
617 t_FORMAT_CONTEXT& formatContext)
const
622 Specification finalSpec(d_spec);
624 finalSpec.postprocess(formatContext);
628 NumericValue finalWidth(finalSpec.postprocessedWidth());
630 NumericValue finalPrecision(finalSpec.postprocessedPrecision());
632 int maxDisplayWidth = 0;
633 switch (finalPrecision.category()) {
634 case NumericValue::e_DEFAULT: {
635 maxDisplayWidth = std::numeric_limits<int>::max();
637 case NumericValue::e_VALUE: {
638 maxDisplayWidth = finalPrecision.value();
641 BSLS_THROW(bsl::format_error(
"Invalid precision specifier"));
645 int displayWidthUsedByInputString = std::numeric_limits<int>::min();
646 size_t charactersOfInputUsed = value.
size();
650 if ((maxDisplayWidth <
static_cast<int>(value.
size()) * 2) ||
651 (finalWidth.category() != NumericValue::e_DEFAULT)) {
652 findPrecisionLimitedString(&charactersOfInputUsed,
653 &displayWidthUsedByInputString,
657 displayWidthUsedByInputString = bsl::max(0, displayWidthUsedByInputString);
659 BSLS_ASSERT(NumericValue::e_DEFAULT == finalWidth.category() ||
660 NumericValue::e_VALUE == finalWidth.category());
662 std::ptrdiff_t leftPadFillerCopies = 0;
663 std::ptrdiff_t rightPadFillerCopies = 0;
670 &rightPadFillerCopies,
672 displayWidthUsedByInputString,
674 Specification::e_ALIGN_LEFT);
676 typename t_FORMAT_CONTEXT::iterator outIterator = formatContext.out();
678 const StringView pad(finalSpec.filler(), finalSpec.numFillerCharacters());
679 outIterator =
PadUtil::pad(outIterator, leftPadFillerCopies, pad);
681 outIterator = bsl::copy(value.
begin(),
682 value.
begin() + charactersOfInputUsed,
685 outIterator =
PadUtil::pad(outIterator, rightPadFillerCopies, pad);
691template <
class t_CHAR,
class t_CHAR_TRAITS>
692template <
class t_PARSE_CONTEXT>
695 t_PARSE_CONTEXT& parseContext)
697 d_spec.parse(&parseContext, Specification::e_CATEGORY_STRING);
699 if (d_spec.sign() != Specification::e_SIGN_DEFAULT)
701 "Formatting sign specifier not valid for string types"));
703 if (d_spec.alternativeFlag())
705 "Formatting # specifier not valid for string types"));
707 if (d_spec.zeroPaddingFlag())
709 "Formatting 0 specifier not valid for string types"));
711 if (d_spec.localeSpecificFlag())
712 BSLS_THROW(bsl::format_error(
"Formatting L specifier not supported"));
714 if (d_spec.formatType() == Specification::e_STRING_ESCAPED)
715 BSLS_THROW(bsl::format_error(
"String escaping not supported"));
717 return parseContext.begin();
731template <
class t_CHAR>
732template <
class t_FORMAT_CONTEXT>
735 t_FORMAT_CONTEXT& formatContext)
const
738 return BloombergLP::bslfmt::FormatterString_Imp<t_CHAR>::formatImpl(
748template <
class t_CHAR>
749template <
class t_FORMAT_CONTEXT>
752 t_FORMAT_CONTEXT& formatContext)
const
755 return BloombergLP::bslfmt::FormatterString_Imp<t_CHAR>::formatImpl(
765template <
class t_CHAR,
size_t t_SIZE>
766template <
class t_FORMAT_CONTEXT>
769 t_FORMAT_CONTEXT& formatContext)
const
772 return BloombergLP::bslfmt::FormatterString_Imp<t_CHAR>::formatImpl(
782template <
class t_CHAR,
class t_CHAR_TRAITS,
class t_ALLOCATOR>
783template <
class t_FORMAT_CONTEXT>
784typename t_FORMAT_CONTEXT::iterator
786 format(
const std::basic_string<t_CHAR, t_CHAR_TRAITS, t_ALLOCATOR>& value,
787 t_FORMAT_CONTEXT& formatContext)
const
790 return BloombergLP::bslfmt::FormatterString_Imp<t_CHAR, t_CHAR_TRAITS>::
791 formatImpl(view, formatContext);
799template <
class t_CHAR,
class t_CHAR_TRAITS,
class t_ALLOCATOR>
800template <
class t_FORMAT_CONTEXT>
801typename t_FORMAT_CONTEXT::iterator
804 t_FORMAT_CONTEXT& formatContext)
const
806 return BloombergLP::bslfmt::FormatterString_Imp<t_CHAR, t_CHAR_TRAITS>::
807 formatImpl(value, formatContext);
810#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGE_FORMAT
813template <
class t_CHAR,
class t_CHAR_TRAITS,
class t_ALLOCATOR>
815constexpr std::range_format
816 std::format_kind<bsl::basic_string<t_CHAR, t_CHAR_TRAITS, t_ALLOCATOR> > =
817 std::range_format::disabled;
822#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
829template <
class t_CHAR,
class t_CHAR_TRAITS>
830template <
class t_FORMAT_CONTEXT>
831typename t_FORMAT_CONTEXT::iterator formatter<
832 std::basic_string_view<t_CHAR, t_CHAR_TRAITS>,
833 t_CHAR>::format(std::basic_string_view<t_CHAR, t_CHAR_TRAITS> value,
834 t_FORMAT_CONTEXT& formatContext)
const
837 return BloombergLP::bslfmt::FormatterString_Imp<t_CHAR, t_CHAR_TRAITS>::
838 formatImpl(view, formatContext);
843#ifndef BSLSTL_STRING_VIEW_IS_ALIASED
850template <
class t_CHAR,
class t_CHAR_TRAITS>
851template <
class t_FORMAT_CONTEXT>
852typename t_FORMAT_CONTEXT::iterator
855 t_FORMAT_CONTEXT& formatContext)
const
857 return BloombergLP::bslfmt::FormatterString_Imp<t_CHAR, t_CHAR_TRAITS>::
858 formatImpl(value, formatContext);
861#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGE_FORMAT
864template <
class t_CHAR,
class t_CHAR_TRAITS>
866constexpr std::range_format
867 std::format_kind<bsl::basic_string_view<t_CHAR, t_CHAR_TRAITS> > =
868 std::range_format::disabled;
880template <
class t_CHAR>
881template <
class t_FORMAT_CONTEXT>
882typename t_FORMAT_CONTEXT::iterator
884 BloombergLP::bslstl::StringRefImp<t_CHAR> value,
885 t_FORMAT_CONTEXT& formatContext)
const
888 return BloombergLP::bslfmt::FormatterString_Imp<t_CHAR>::formatImpl(
895#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGE_FORMAT
896template <
class t_CHAR>
898constexpr std::range_format
899 std::format_kind<BloombergLP::bslstl::StringRefImp<t_CHAR> > =
900 std::range_format::disabled;
Definition bslstl_stringview.h:471
BSLS_KEYWORD_CONSTEXPR const_pointer data() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1988
BSLS_KEYWORD_CONSTEXPR size_type size() const BSLS_KEYWORD_NOEXCEPT
Return the length of this view.
Definition bslstl_stringview.h:1904
BSLS_KEYWORD_CONSTEXPR const_iterator begin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1830
Definition bslstl_string.h:1252
UtfEncoding
Definition bslfmt_unicodecodepoint.h:79
@ e_UTF16
Definition bslfmt_unicodecodepoint.h:79
@ e_UTF8
Definition bslfmt_unicodecodepoint.h:79
@ e_UTF32
Definition bslfmt_unicodecodepoint.h:79
Definition bslstl_stringref.h:374
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#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 bdlat_valuetypefunctions.h:939
Definition bslfmt_enablestreamedformatter.h:130
Definition bdldfp_decimal.h:5549
Definition bslfmt_padutil.h:151
static void computePadding(std::ptrdiff_t *leftPadding, std::ptrdiff_t *rightPadding, const NumericValue &widthValue, std::ptrdiff_t contentWidth, Alignment alignment, Alignment defaultAlign=Enums::e_ALIGN_LEFT)
Definition bslfmt_padutil.h:352
static t_ITERATOR pad(t_ITERATOR out, std::ptrdiff_t padWidth, const bsl::string_view &filler)
Definition bslfmt_padutil.h:401