8#ifndef INCLUDED_BSLFMT_FORMATTERBASE
9#define INCLUDED_BSLFMT_FORMATTERBASE
162#include <bslscm_version.h>
170#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_FORMAT
175 #include <string_view>
178#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_FORMAT
186template <
class t_TYPE>
187struct FormatterBase_IsStdBasicString {
188 static const bool value =
false;
191template <
class t_CHAR,
class t_TRAITS,
class t_ALLOCATOR>
192struct FormatterBase_IsStdBasicString<
193 std::basic_string<t_CHAR, t_TRAITS, t_ALLOCATOR> > {
194 static const bool value =
true;
201template <
class t_TYPE>
202struct FormatterBase_IsStdBasicStringView {
203 static const bool value =
false;
206template <
class t_CHAR,
class t_TRAITS>
207struct FormatterBase_IsStdBasicStringView<
208 std::basic_string_view<t_CHAR, t_TRAITS> > {
209 static const bool value =
true;
216template <
class t_TYPE>
217struct FormatterBase_IsStdChronoDuration {
218 static const bool value =
false;
221template <
class t_REP,
class t_PERIOD>
222struct FormatterBase_IsStdChronoDuration<
223 std::chrono::duration<t_REP, t_PERIOD> > {
224 static const bool value =
true;
227#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CALENDAR
232template <
class t_TYPE>
233struct FormatterBase_IsStdChronoSysTime {
234 static const bool value =
false;
237template <
class t_DURATION>
238struct FormatterBase_IsStdChronoSysTime<
239 std::chrono::sys_time<t_DURATION> > {
240 static const bool value =
true;
247template <
class t_TYPE>
248struct FormatterBase_IsStdChronoUtcTime {
249 static const bool value =
false;
252template <
class t_DURATION>
253struct FormatterBase_IsStdChronoUtcTime<
254 std::chrono::utc_time<t_DURATION> > {
255 static const bool value =
true;
262template <
class t_TYPE>
263struct FormatterBase_IsStdChronoTaiTime {
264 static const bool value =
false;
267template <
class t_DURATION>
268struct FormatterBase_IsStdChronoTaiTime<
269 std::chrono::tai_time<t_DURATION> > {
270 static const bool value =
true;
277template <
class t_TYPE>
278struct FormatterBase_IsStdChronoGpsTime {
279 static const bool value =
false;
282template <
class t_DURATION>
283struct FormatterBase_IsStdChronoGpsTime<
284 std::chrono::gps_time<t_DURATION> > {
285 static const bool value =
true;
292template <
class t_TYPE>
293struct FormatterBase_IsStdChronoFileTime {
294 static const bool value =
false;
297template <
class t_DURATION>
298struct FormatterBase_IsStdChronoFileTime<
299 std::chrono::file_time<t_DURATION> > {
300 static const bool value =
true;
307template <
class t_TYPE>
308struct FormatterBase_IsStdChronoLocalTime {
309 static const bool value =
false;
312template <
class t_DURATION>
313struct FormatterBase_IsStdChronoLocalTime<
314 std::chrono::local_time<t_DURATION> > {
315 static const bool value =
true;
322template <
class t_TYPE>
323struct FormatterBase_IsStdChronoHhMmSs {
324 static const bool value =
false;
327template <
class t_DURATION>
328struct FormatterBase_IsStdChronoHhMmSs<
329 std::chrono::hh_mm_ss<t_DURATION> > {
330 static const bool value =
true;
337template <
class t_TYPE>
338struct FormatterBase_IsStdChronoTimeType {
339 static const bool value =
340 FormatterBase_IsStdChronoSysTime<t_TYPE>::value ||
341 FormatterBase_IsStdChronoUtcTime<t_TYPE>::value ||
342 FormatterBase_IsStdChronoTaiTime<t_TYPE>::value ||
343 FormatterBase_IsStdChronoGpsTime<t_TYPE>::value ||
344 FormatterBase_IsStdChronoFileTime<t_TYPE>::value ||
345 FormatterBase_IsStdChronoLocalTime<t_TYPE>::value ||
346 FormatterBase_IsStdChronoHhMmSs<t_TYPE>::value;
354template <
class t_TYPE>
355struct FormatterBase_IsStdChronoPointInTimeType {
356 static const bool value =
357 std::is_same_v<t_TYPE, std::chrono::day> ||
358 std::is_same_v<t_TYPE, std::chrono::month> ||
359 std::is_same_v<t_TYPE, std::chrono::year> ||
360 std::is_same_v<t_TYPE, std::chrono::weekday> ||
361 std::is_same_v<t_TYPE, std::chrono::weekday_indexed> ||
362 std::is_same_v<t_TYPE, std::chrono::weekday_last> ||
363 std::is_same_v<t_TYPE, std::chrono::month_day> ||
364 std::is_same_v<t_TYPE, std::chrono::month_day_last> ||
365 std::is_same_v<t_TYPE, std::chrono::month_weekday> ||
366 std::is_same_v<t_TYPE, std::chrono::month_weekday_last> ||
367 std::is_same_v<t_TYPE, std::chrono::year_month> ||
368 std::is_same_v<t_TYPE, std::chrono::year_month_day> ||
369 std::is_same_v<t_TYPE, std::chrono::year_month_day_last> ||
370 std::is_same_v<t_TYPE, std::chrono::year_month_weekday> ||
371 std::is_same_v<t_TYPE, std::chrono::year_month_weekday_last>;
378template <
class t_TYPE>
379struct FormatterBase_IsStdChronoZonedTime {
380 static const bool value =
false;
383#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_TIMEZONE
384template <
class t_DURATION,
class t_TIME_ZONE_PTR>
385struct FormatterBase_IsStdChronoZonedTime<
386 std::chrono::zoned_time<t_DURATION, t_TIME_ZONE_PTR> > {
387 static const bool value =
true;
395template <
class t_TYPE>
396struct FormatterBase_IsStdChronoCpp20FormattableType {
397 static const bool value =
398#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CALENDAR
399 FormatterBase_IsStdChronoTimeType<t_TYPE>::value ||
401#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_TIMEZONE
402 FormatterBase_IsStdChronoZonedTime<t_TYPE>::value ||
403 std::is_same_v<t_TYPE, std::chrono::sys_info> ||
404 std::is_same_v<t_TYPE, std::chrono::local_info> ||
406 FormatterBase_IsStdChronoPointInTimeType<t_TYPE>::value;
425template <
class t_ARG,
class t_CHAR =
char>
435#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_FORMAT
440template <
class t_ARG,
class t_CHAR>
442 !std::is_arithmetic_v<t_ARG> &&
443 !std::is_same_v<t_ARG, std::nullptr_t> &&
444 !std::is_same_v<t_ARG, void *> &&
445 !std::is_same_v<t_ARG, const void *> &&
446 !std::is_same_v<t_ARG, t_CHAR *> &&
447 !std::is_same_v<t_ARG, const t_CHAR *> &&
448 !std::is_same_v<std::remove_extent_t<t_ARG>,
const t_CHAR> &&
449 !BloombergLP::bslfmt::FormatterBase_IsStdBasicString<t_ARG>::value &&
450 !BloombergLP::bslfmt::FormatterBase_IsStdBasicStringView<
452 !BloombergLP::bslfmt::FormatterBase_IsStdChronoCpp20FormattableType<
454 std::default_initializable<bsl::formatter<t_ARG, t_CHAR> >)
455struct formatter<t_ARG, t_CHAR> :
bsl::formatter<t_ARG, t_CHAR> {};
#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
Definition bdlat_valuetypefunctions.h:939
Definition bslfmt_enablestreamedformatter.h:130
Definition bdldfp_decimal.h:5549