9#ifndef INCLUDED_BSLFMT_FORMAT_IMP
10#define INCLUDED_BSLFMT_FORMAT_IMP
145#include <bslscm_version.h>
189#if BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
195# define COMPILING_BSLFMT_FORMAT_IMP_H
197# undef COMPILING_BSLFMT_FORMAT_IMP_H
202#if defined(BSLS_COMPILERFEATURES_SUPPORT_ALIAS_TEMPLATES) && \
203 defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
204# define BSLFMT_FORMAT_STRING_PARAMETER bslfmt::format_string<t_ARGS...>
205# define BSLFMT_FORMAT_WSTRING_PARAMETER bslfmt::wformat_string<t_ARGS...>
209# define BSLFMT_FORMAT_STRING_PARAMETER bslfmt::format_string
210# define BSLFMT_FORMAT_WSTRING_PARAMETER bslfmt::wformat_string
228template <
class t_ITERATOR,
class t_VALUE_TYPE,
class t_DIFF_TYPE>
232 typedef typename bsl::iterator_traits<t_ITERATOR>::difference_type DT;
235 t_ITERATOR d_iterator;
284 t_DIFF_TYPE
count()
const;
296#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_FORMAT)
301using std::format_to_n_result;
309template <
class t_OUT>
314 typename bsl::iterator_traits<t_OUT>::difference_type
327template <
class t_OUT,
class t_CHAR>
365 void operator()(
unsigned long long value)
const;
390template <
class t_CHAR>
398 template <
class t_OUT>
399 static t_OUT processImp(
424 template <
class t_OUT,
class t_CONTEXT>
425 static t_OUT
process(t_OUT out,
441template <
class t_OUT>
450template <
class t_OUT>
502#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
508template <
class t_OUT,
class... t_ARGS>
515 const t_ARGS&... args);
522template <
class t_OUT,
class... t_ARGS>
529 const t_ARGS&... args);
536template <
class... t_ARGS>
540 const t_ARGS&... args);
547template <
class... t_ARGS>
551 const t_ARGS&... args);
556template <
class... t_ARGS>
559 const t_ARGS&... args);
564template <
class... t_ARGS>
567 const t_ARGS&... args);
573template <
class... t_ARGS>
577 const t_ARGS&... args);
583template <
class... t_ARGS>
587 const t_ARGS&... args);
592template <
class... t_ARGS>
595 const t_ARGS&... args);
600template <
class... t_ARGS>
603 const t_ARGS&... args);
614template <
class t_OUT,
class... t_ARGS>
618 typename bsl::iterator_traits<t_OUT>::difference_type maxNumChars,
620 const t_ARGS&... args);
631template <
class t_OUT,
class... t_ARGS>
635 typename bsl::iterator_traits<t_OUT>::difference_type maxNumChars,
637 const t_ARGS&... args);
651template <
class t_ITERATOR,
class t_VALUE_TYPE,
class t_DIFF_TYPE>
654: d_iterator(iterator)
661template <
class t_ITERATOR,
class t_VALUE_TYPE,
class t_DIFF_TYPE>
669template <
class t_ITERATOR,
class t_VALUE_TYPE,
class t_DIFF_TYPE>
673 if (d_count++ < d_limit) {
682template <
class t_ITERATOR,
class t_VALUE_TYPE,
class t_DIFF_TYPE>
691template <
class t_ITERATOR,
class t_VALUE_TYPE,
class t_DIFF_TYPE>
699template <
class t_ITERATOR,
class t_VALUE_TYPE,
class t_DIFF_TYPE>
702 t_DIFF_TYPE>::underlying()
const
713template <
class t_OUT,
class t_CHAR>
717: d_parseContext_p(&pc)
718, d_formatContext_p(&fc)
724template <
class t_OUT,
class t_CHAR>
728 "This call should be impossible - arg uninitialized");
730 format_error(
"This call should be impossible - arg uninitialized"));
733template <
class t_OUT,
class t_CHAR>
737 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
739 *d_formatContext_p));
742template <
class t_OUT,
class t_CHAR>
746 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
748 *d_formatContext_p));
751template <
class t_OUT,
class t_CHAR>
755 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
757 *d_formatContext_p));
760template <
class t_OUT,
class t_CHAR>
764 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
766 *d_formatContext_p));
769template <
class t_OUT,
class t_CHAR>
771 unsigned long long value)
const
774 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
776 *d_formatContext_p));
779template <
class t_OUT,
class t_CHAR>
783 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
785 *d_formatContext_p));
788template <
class t_OUT,
class t_CHAR>
792 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
794 *d_formatContext_p));
797template <
class t_OUT,
class t_CHAR>
801 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
803 *d_formatContext_p));
806template <
class t_OUT,
class t_CHAR>
810 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
812 *d_formatContext_p));
815template <
class t_OUT,
class t_CHAR>
819 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
821 *d_formatContext_p));
824template <
class t_OUT,
class t_CHAR>
828 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
830 *d_formatContext_p));
833template <
class t_OUT,
class t_CHAR>
838 d_parseContext_p->advance_to(f.parse(*d_parseContext_p));
840 *d_formatContext_p));
843template <
class t_OUT,
class t_CHAR>
846 h.format(*d_parseContext_p, *d_formatContext_p);
853template <
class t_CHAR>
854template <
class t_OUT>
870 while (it != pc.end()) {
873 if (it == pc.end()) {
876 else if (*it ==
'{') {
886 if (*it >=
'0' && *it <=
'9') {
889 while (it != pc.end() && *it >=
'0' && *it <=
'9') {
890 id = 10 *
id + (*it -
'0');
896 if (it == pc.end()) {
900 if (
id ==
size_t(-1)) {
901 id = pc.next_arg_id();
912 else if (*it !=
'}') {
913 BSLS_THROW(format_error(
"Separator ':' missing"));
919 if (it != pc.end()) {
921 BSLS_THROW(format_error(
"parsing terminated before }"));
928 else if (*it ==
'}') {
931 if (it == pc.end() || *it !=
'}') {
932 BSLS_THROW(format_error(
"} must be escaped"));
952template <
class t_CHAR>
960 processImp(out, fmtStr, args);
964template <
class t_CHAR>
965template <
class t_OUT,
class t_CONTEXT>
973 processImp(wrappedOutRef, fmtStr, args);
979template <
class t_OUT>
986template <
class t_OUT>
996 vformat_to(bsl::back_inserter(*out), fmtStr, args);
1002 vformat_to(bsl::back_inserter(*out), fmtStr, args);
1041#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
1042template <
class t_OUT,
class... t_ARGS>
1048 const t_ARGS&... args)
1053template <
class t_OUT,
class... t_ARGS>
1059 const t_ARGS&... args)
1064template <
class... t_ARGS>
1067 const t_ARGS&... args)
1074template <
class... t_ARGS>
1077 const t_ARGS&... args)
1084template <
class... t_ARGS>
1092template <
class... t_ARGS>
1094 const t_ARGS&... args)
1101template <
class... t_ARGS>
1104 const t_ARGS&... args)
1111template <
class... t_ARGS>
1114 const t_ARGS&... args)
1121template <
class... t_ARGS>
1123 const t_ARGS&... args)
1128 TruncatingIterator it(0, 0);
1129 TruncatingIterator end =
format_to(it, fmtStr, args...);
1133template <
class... t_ARGS>
1135 const t_ARGS&... args)
1140 TruncatingIterator it(0, 0);
1141 TruncatingIterator end =
format_to(it, fmtStr, args...);
1146template <
class t_OUT,
class... t_ARGS>
1147format_to_n_result<t_OUT>
1149 typename bsl::iterator_traits<t_OUT>::difference_type maxNumChars,
1151 const t_ARGS&... args)
1153 if (maxNumChars < 0)
1158 typename bsl::iterator_traits<t_OUT>::value_type,
1159 typename bsl::iterator_traits<t_OUT>::difference_type>
1162 TruncatingIterator it(out, maxNumChars);
1164 TruncatingIterator end =
format_to(it, fmtStr, args...);
1167 result.
out = end.underlying();
1168 result.
size = end.count();
1172template <
class t_OUT,
class... t_ARGS>
1173format_to_n_result<t_OUT>
1175 typename bsl::iterator_traits<t_OUT>::difference_type maxNumChars,
1177 const t_ARGS&... args)
1179 if (maxNumChars < 0)
1184 typename bsl::iterator_traits<t_OUT>::value_type,
1185 typename bsl::iterator_traits<t_OUT>::difference_type>
1188 TruncatingIterator it(out, maxNumChars);
1190 TruncatingIterator end =
format_to(it, fmtStr, args...);
1193 result.
out = end.underlying();
1194 result.
size = end.count();
1203#undef BSLFMT_FORMAT_STRING_PARAMETER
1204#undef BSLFMT_FORMAT_WSTRING_PARAMETER
Definition bslma_bslallocator.h:588
Definition bslstl_stringview.h:471
const_iterator iterator
Definition bslstl_stringview.h:482
Definition bslstl_string.h:1252
static basic_format_context< t_OUT, t_CHAR > construct(t_OUT out, const basic_format_args< basic_format_context< t_OUT, t_CHAR > > &args)
Definition bslfmt_format_context.h:527
Definition bslfmt_format_context.h:232
Definition bslfmt_format_context.h:262
Definition bslfmt_format_context.h:316
Definition bslfmt_formatparsecontext.h:86
#define BSLS_ASSERT_OPT_UNREACHABLE(X)
Definition bsls_assert.h:2065
#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_DELETED
Definition bsls_keyword.h:651
basic_string< wchar_t > wstring
Definition bslstl_string.h:845
basic_string< char > string
Definition bslstl_string.h:844
BSLS_KEYWORD_CONSTEXPR bsl::add_const< TYPE >::type & as_const(TYPE &t) BSLS_KEYWORD_NOEXCEPT
Return a reference offering non-modifiable access to the specified t.
Definition bslstl_utility.h:129
Definition bslfmt_enablestreamedformatter.h:130
bsl::string vformat(bsl::string_view fmt, format_args args)
Definition bslfmt_format_imp.h:1006
format_to_n_result< t_OUT > format_to_n(t_OUT out, typename bsl::iterator_traits< t_OUT >::difference_type maxNumChars, BSLFMT_FORMAT_STRING_PARAMETER fmtStr, const t_ARGS &... args)
Definition bslfmt_format_imp.h:1148
bsl::invoke_result< t_VISITOR &, bsl::monostate & >::type visit_format_arg(t_VISITOR &visitor, basic_format_arg< t_CONTEXT > arg)
Definition bslfmt_format_arg.h:907
bsl::enable_if<!bsl::is_same< typenamebsl::decay< t_OUT >::type, bsl::string * >::value, t_OUT >::type format_to(t_OUT out, BSLFMT_FORMAT_STRING_PARAMETER fmtStr, const t_ARGS &... args)
Definition bslfmt_format_imp.h:1046
std::size_t formatted_size(BSLFMT_FORMAT_STRING_PARAMETER fmtStr, const t_ARGS &... args)
Definition bslfmt_format_imp.h:1122
Format_ArgsStore< format_context, t_ARGS... > make_format_args(t_ARGS &... fmt_args)
Definition bslfmt_format_args.h:461
bsl::string format(BSLFMT_FORMAT_STRING_PARAMETER fmtStr, const t_ARGS &... args)
Definition bslfmt_format_imp.h:1085
t_OUT vformat_to(t_OUT out, bsl::string_view fmtStr, format_args args)
Definition bslfmt_format_imp.h:981
Format_ArgsStore< wformat_context, t_ARGS... > make_wformat_args(t_ARGS &... fmt_args)
Definition bslfmt_format_args.h:469
Definition bslmf_enableif.h:530
Definition bslmf_issame.h:146
Definition bslstl_monostate.h:77