8#ifndef INCLUDED_BDLT_TIMEFORMATTER
9#define INCLUDED_BDLT_TIMEFORMATTER
69#include <bdlscm_version.h>
77#include <bsl_iosfwd.h>
78#include <bsl_optional.h>
79#include <bsl_string_view.h>
84class TimeFormatter_Cache;
93template <
class t_CHAR>
107 k_DEFAULT_PRECISION = 6,
108 k_DEFAULT_ISO8601_PRECISION = 3
114 unsigned d_numDefaultSecondSpecifiers;
115 unsigned d_numIso8601SecondSpecifiers;
127 template <
class t_ITERATOR>
128 static t_ITERATOR formatHours(t_ITERATOR out,
const FormatCache& value);
132 template <
class t_ITERATOR>
133 static t_ITERATOR formatMinutes(t_ITERATOR out,
const FormatCache& value);
141 template <
class t_ITERATOR>
142 t_ITERATOR formatSeconds(t_ITERATOR out,
149 template <
class t_ITERATOR>
150 t_ITERATOR formatTime(t_ITERATOR out,
156 int precision()
const;
160 int iso8601Precision()
const;
205 template <
class t_ITERATOR>
212 template <
class t_ITERATOR>
217 template <
class t_ITERATOR>
276template <
class t_CHAR>
277template <
class t_ITERATOR>
280 t_ITERATOR out,
const FormatCache& value)
282 return Util::writeZeroPaddedDigits(out, value.hour(), k_HOUR_WIDTH);
285template <
class t_CHAR>
286template <
class t_ITERATOR>
288t_ITERATOR TimeFormatter<t_CHAR>::formatMinutes(
289 t_ITERATOR out,
const FormatCache& value)
291 return Util::writeZeroPaddedDigits(out, value.minute(), k_MINUTE_WIDTH);
296template <
class t_CHAR>
297template <
class t_ITERATOR>
299t_ITERATOR TimeFormatter<t_CHAR>::formatSeconds(
300 t_ITERATOR out,
int precision,
const FormatCache& value)
const
302 out = Util::writeZeroPaddedDigits(out, value.second(), k_SECOND_WIDTH);
303 out = Util::writeSecondFraction(out,
307 value.microsecond());
311template <
class t_CHAR>
312template <
class t_ITERATOR>
314t_ITERATOR TimeFormatter<t_CHAR>::formatTime(t_ITERATOR out,
316 const FormatCache& value)
const
318 out = formatHours(out, value);
319 *out++ = t_CHAR(
':');
320 out = formatMinutes(out, value);
321 *out++ = t_CHAR(
':');
322 out = formatSeconds(out, precision, value);
327template <
class t_CHAR>
329int TimeFormatter<t_CHAR>::precision()
const
331 return d_precision.value_or(6);
334template <
class t_CHAR>
336int TimeFormatter<t_CHAR>::iso8601Precision()
const
338 return d_precision.value_or(3);
342template <
class t_CHAR>
346, d_numDefaultSecondSpecifiers(0)
347, d_numIso8601SecondSpecifiers(0)
353template <
class t_CHAR>
357 ++d_numDefaultSecondSpecifiers;
358 d_fixedWidth += k_HOUR_WIDTH + k_COLON_WIDTH + k_MINUTE_WIDTH +
359 k_COLON_WIDTH + k_SECOND_WIDTH;
362template <
class t_CHAR>
366 ++d_numIso8601SecondSpecifiers;
367 d_fixedWidth += k_HOUR_WIDTH + k_COLON_WIDTH + k_MINUTE_WIDTH +
368 k_COLON_WIDTH + k_SECOND_WIDTH;
371template <
class t_CHAR>
375 if (t_CHAR(
',') == specInOut->
front()) {
384template <
class t_CHAR>
390 switch(
static_cast<char>(specInOut->
front())) {
393 d_fixedWidth += k_HOUR_WIDTH;
396 d_fixedWidth += k_AMPM_WIDTH;
399 d_fixedWidth += k_MINUTE_WIDTH;
402 d_fixedWidth += k_SECOND_WIDTH;
403 ++d_numDefaultSecondSpecifiers;
406 d_fixedWidth += k_HOUR_WIDTH + k_COLON_WIDTH + k_MINUTE_WIDTH;
423template <
class t_CHAR>
435template <
class t_CHAR>
442template <
class t_CHAR>
443template <
class t_ITERATOR>
454 switch (
static_cast<char>(spec.
front())) {
456 *outIt = formatHours(*outIt, value);
461 int hh = value.
hour();
466 *outIt = Util::writeZeroPaddedDigits(*outIt, hh);
476 *outIt = formatMinutes(*outIt, value);
479 *outIt = formatSeconds(*outIt, precision(), value);
482 *outIt = formatDefault(*outIt, value);
485 *outIt = formatIso8601(*outIt, value);
492 *specInOut = spec.
substr(1);
497template <
class t_CHAR>
498template <
class t_ITERATOR>
503 return formatTime(out, precision(), value);
506template <
class t_CHAR>
507template <
class t_ITERATOR>
512 return formatTime(out, iso8601Precision(), value);
515template <
class t_CHAR>
519 int ret = d_fixedWidth;
522 if (0 < *d_precision) {
523 ret += (*d_precision + 1) * (d_numDefaultSecondSpecifiers +
524 d_numIso8601SecondSpecifiers);
528 ret += (k_DEFAULT_PRECISION + 1) * d_numDefaultSecondSpecifiers;
529 ret += (k_DEFAULT_ISO8601_PRECISION+1) * d_numIso8601SecondSpecifiers;
572 return d_millisecond;
578 return d_microsecond;
587template <
class t_CHAR>
590 typedef BloombergLP::bdlt::Time Time;
591 typedef BloombergLP::bdlt::TimeFormatter_Cache FormatCache;
592 typedef BloombergLP::bdlt::Formatter<
593 BloombergLP::bdlt::TimeFormatter, t_CHAR> Formatter;
596 Formatter d_formatter;
602 template <
class t_PARSE_CONTEXT>
604 t_PARSE_CONTEXT& context)
606 return d_formatter.parse(context);
614 template <
class t_FORMAT_CONTEXT>
615 typename t_FORMAT_CONTEXT::iterator
format(
617 t_FORMAT_CONTEXT& formatContext)
const
619 return d_formatter.format(FormatCache(value), formatContext);
Definition bdlt_time.h:195
void getTime(int *hour, int *minute=0, int *second=0, int *millisecond=0, int *microsecond=0) const
Definition bslstl_stringview.h:471
BSLS_KEYWORD_CONSTEXPR size_type length() const BSLS_KEYWORD_NOEXCEPT
Return the length of this view.
Definition bslstl_stringview.h:1913
BSLS_KEYWORD_CONSTEXPR const_pointer data() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1988
BSLS_KEYWORD_CONSTEXPR_CPP14 basic_string_view substr(size_type position=0, size_type numChars=npos) const
Definition bslstl_stringview.h:2027
BSLS_KEYWORD_CONSTEXPR_CPP14 const_reference front() const
Definition bslstl_stringview.h:1966
BSLS_KEYWORD_CONSTEXPR_CPP14 void remove_prefix(size_type numChars)
Definition bslstl_stringview.h:1800
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
Definition bslstl_optional.h:2043
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#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 bbldc_basicisma30360.h:112
Definition bdlat_valuetypefunctions.h:939