xref: /llvm-project/libcxx/include/__format/formatter_char.h (revision c6f3b7bcd0596d30f8dabecdfb9e44f9a07b6e4c)
149e736d8SMark de Wever // -*- C++ -*-
249e736d8SMark de Wever //===----------------------------------------------------------------------===//
349e736d8SMark de Wever //
449e736d8SMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
549e736d8SMark de Wever // See https://llvm.org/LICENSE.txt for license information.
649e736d8SMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
749e736d8SMark de Wever //
849e736d8SMark de Wever //===----------------------------------------------------------------------===//
949e736d8SMark de Wever 
1049e736d8SMark de Wever #ifndef _LIBCPP___FORMAT_FORMATTER_CHAR_H
1149e736d8SMark de Wever #define _LIBCPP___FORMAT_FORMATTER_CHAR_H
1249e736d8SMark de Wever 
1338adfa91SMark de Wever #include <__concepts/same_as.h>
1449e736d8SMark de Wever #include <__config>
15a595fcf9SMark de Wever #include <__format/concepts.h>
1638adfa91SMark de Wever #include <__format/format_parse_context.h>
1749e736d8SMark de Wever #include <__format/formatter.h>
1849e736d8SMark de Wever #include <__format/formatter_integral.h>
1938adfa91SMark de Wever #include <__format/formatter_output.h>
2049e736d8SMark de Wever #include <__format/parser_std_format_spec.h>
213ab20c68SMark de Wever #include <__format/write_escaped.h>
2238adfa91SMark de Wever #include <__type_traits/conditional.h>
2316b8c960SMark de Wever #include <__type_traits/make_unsigned.h>
2449e736d8SMark de Wever 
2549e736d8SMark de Wever #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2649e736d8SMark de Wever #  pragma GCC system_header
2749e736d8SMark de Wever #endif
2849e736d8SMark de Wever 
2949e736d8SMark de Wever _LIBCPP_BEGIN_NAMESPACE_STD
3049e736d8SMark de Wever 
314f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
3249e736d8SMark de Wever 
33a595fcf9SMark de Wever template <__fmt_char_type _CharT>
343d334df5SLouis Dionne struct _LIBCPP_TEMPLATE_VIS __formatter_char {
3549e736d8SMark de Wever public:
36b51e8acdSMark de Wever   template <class _ParseContext>
37b51e8acdSMark de Wever   _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __ctx) {
38b51e8acdSMark de Wever     typename _ParseContext::iterator __result = __parser_.__parse(__ctx, __format_spec::__fields_integral);
39a0ffecccSMark de Wever     __format_spec::__process_parsed_char(__parser_, "a character");
4038adfa91SMark de Wever     return __result;
4149e736d8SMark de Wever   }
4249e736d8SMark de Wever 
43b51e8acdSMark de Wever   template <class _FormatContext>
44b51e8acdSMark de Wever   _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator format(_CharT __value, _FormatContext& __ctx) const {
4565897292SMark de Wever     if (__parser_.__type_ == __format_spec::__type::__default || __parser_.__type_ == __format_spec::__type::__char)
4638adfa91SMark de Wever       return __formatter::__format_char(__value, __ctx.out(), __parser_.__get_parsed_std_specifications(__ctx));
4738adfa91SMark de Wever 
484f15267dSNikolas Klauser #  if _LIBCPP_STD_VER >= 23
49a4800735SMark de Wever     if (__parser_.__type_ == __format_spec::__type::__debug)
50a4800735SMark de Wever       return __formatter::__format_escaped_char(__value, __ctx.out(), __parser_.__get_parsed_std_specifications(__ctx));
51a4800735SMark de Wever #  endif
52a4800735SMark de Wever 
5316b8c960SMark de Wever     if constexpr (sizeof(_CharT) <= sizeof(unsigned))
5438adfa91SMark de Wever       return __formatter::__format_integer(
5516b8c960SMark de Wever           static_cast<unsigned>(static_cast<make_unsigned_t<_CharT>>(__value)),
5638adfa91SMark de Wever           __ctx,
5738adfa91SMark de Wever           __parser_.__get_parsed_std_specifications(__ctx));
5838adfa91SMark de Wever     else
5916b8c960SMark de Wever       return __formatter::__format_integer(
6016b8c960SMark de Wever           static_cast<make_unsigned_t<_CharT>>(__value), __ctx, __parser_.__get_parsed_std_specifications(__ctx));
6149e736d8SMark de Wever   }
6238adfa91SMark de Wever 
63b51e8acdSMark de Wever   template <class _FormatContext>
64b51e8acdSMark de Wever   _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator format(char __value, _FormatContext& __ctx) const
6538adfa91SMark de Wever     requires(same_as<_CharT, wchar_t>)
6638adfa91SMark de Wever   {
6716b8c960SMark de Wever     return format(static_cast<wchar_t>(static_cast<unsigned char>(__value)), __ctx);
6838adfa91SMark de Wever   }
6938adfa91SMark de Wever 
704f15267dSNikolas Klauser #  if _LIBCPP_STD_VER >= 23
71a4800735SMark de Wever   _LIBCPP_HIDE_FROM_ABI constexpr void set_debug_format() { __parser_.__type_ = __format_spec::__type::__debug; }
72a4800735SMark de Wever #  endif
73a4800735SMark de Wever 
7438adfa91SMark de Wever   __format_spec::__parser<_CharT> __parser_;
7549e736d8SMark de Wever };
7649e736d8SMark de Wever 
7749e736d8SMark de Wever template <>
783d334df5SLouis Dionne struct _LIBCPP_TEMPLATE_VIS formatter<char, char> : public __formatter_char<char> {};
7949e736d8SMark de Wever 
80*c6f3b7bcSNikolas Klauser #  if _LIBCPP_HAS_WIDE_CHARACTERS
8149e736d8SMark de Wever template <>
823d334df5SLouis Dionne struct _LIBCPP_TEMPLATE_VIS formatter<char, wchar_t> : public __formatter_char<wchar_t> {};
8349e736d8SMark de Wever 
8449e736d8SMark de Wever template <>
8516b8c960SMark de Wever struct _LIBCPP_TEMPLATE_VIS formatter<wchar_t, wchar_t> : public __formatter_char<wchar_t> {};
86*c6f3b7bcSNikolas Klauser #  endif // _LIBCPP_HAS_WIDE_CHARACTERS
8749e736d8SMark de Wever 
88f08df56dSMark de Wever #  if _LIBCPP_STD_VER >= 23
89f08df56dSMark de Wever template <>
90f08df56dSMark de Wever inline constexpr bool enable_nonlocking_formatter_optimization<char> = true;
91*c6f3b7bcSNikolas Klauser #    if _LIBCPP_HAS_WIDE_CHARACTERS
92f08df56dSMark de Wever template <>
93f08df56dSMark de Wever inline constexpr bool enable_nonlocking_formatter_optimization<wchar_t> = true;
94*c6f3b7bcSNikolas Klauser #    endif // _LIBCPP_HAS_WIDE_CHARACTERS
95f08df56dSMark de Wever #  endif   // _LIBCPP_STD_VER >= 23
96f08df56dSMark de Wever 
974f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
9849e736d8SMark de Wever 
9949e736d8SMark de Wever _LIBCPP_END_NAMESPACE_STD
10049e736d8SMark de Wever 
10149e736d8SMark de Wever #endif // _LIBCPP___FORMAT_FORMATTER_CHAR_H
102