127 lines · c
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef _LIBCPP___FORMAT_FORMATTER_INTEGER_H11#define _LIBCPP___FORMAT_FORMATTER_INTEGER_H12 13#include <__concepts/arithmetic.h>14#include <__config>15#include <__format/concepts.h>16#include <__format/format_parse_context.h>17#include <__format/formatter.h>18#include <__format/formatter_integral.h>19#include <__format/formatter_output.h>20#include <__format/parser_std_format_spec.h>21#include <__type_traits/is_void.h>22#include <__type_traits/make_32_64_or_128_bit.h>23 24#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)25# pragma GCC system_header26#endif27 28_LIBCPP_BEGIN_NAMESPACE_STD29 30#if _LIBCPP_STD_VER >= 2031 32template <__fmt_char_type _CharT>33struct __formatter_integer {34public:35 template <class _ParseContext>36 _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __ctx) {37 typename _ParseContext::iterator __result = __parser_.__parse(__ctx, __format_spec::__fields_integral);38 __format_spec::__process_parsed_integer(__parser_, "an integer");39 return __result;40 }41 42 template <integral _Tp, class _FormatContext>43 _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator format(_Tp __value, _FormatContext& __ctx) const {44 __format_spec::__parsed_specifications<_CharT> __specs = __parser_.__get_parsed_std_specifications(__ctx);45 46 if (__specs.__std_.__type_ == __format_spec::__type::__char)47 return __formatter::__format_char(__value, __ctx.out(), __specs);48 49 using _Type = __make_32_64_or_128_bit_t<_Tp>;50 static_assert(!is_void<_Type>::value, "unsupported integral type used in __formatter_integer::__format");51 52 // Reduce the number of instantiation of the integer formatter53 return __formatter::__format_integer(static_cast<_Type>(__value), __ctx, __specs);54 }55 56 __format_spec::__parser<_CharT> __parser_;57};58 59// Signed integral types.60template <__fmt_char_type _CharT>61struct formatter<signed char, _CharT> : public __formatter_integer<_CharT> {};62template <__fmt_char_type _CharT>63struct formatter<short, _CharT> : public __formatter_integer<_CharT> {};64template <__fmt_char_type _CharT>65struct formatter<int, _CharT> : public __formatter_integer<_CharT> {};66template <__fmt_char_type _CharT>67struct formatter<long, _CharT> : public __formatter_integer<_CharT> {};68template <__fmt_char_type _CharT>69struct formatter<long long, _CharT> : public __formatter_integer<_CharT> {};70# if _LIBCPP_HAS_INT12871template <__fmt_char_type _CharT>72struct formatter<__int128_t, _CharT> : public __formatter_integer<_CharT> {};73# endif74 75// Unsigned integral types.76template <__fmt_char_type _CharT>77struct formatter<unsigned char, _CharT> : public __formatter_integer<_CharT> {};78template <__fmt_char_type _CharT>79struct formatter<unsigned short, _CharT> : public __formatter_integer<_CharT> {};80template <__fmt_char_type _CharT>81struct formatter<unsigned, _CharT> : public __formatter_integer<_CharT> {};82template <__fmt_char_type _CharT>83struct formatter<unsigned long, _CharT> : public __formatter_integer<_CharT> {};84template <__fmt_char_type _CharT>85struct formatter<unsigned long long, _CharT> : public __formatter_integer<_CharT> {};86# if _LIBCPP_HAS_INT12887template <__fmt_char_type _CharT>88struct formatter<__uint128_t, _CharT> : public __formatter_integer<_CharT> {};89# endif90 91# if _LIBCPP_STD_VER >= 2392template <>93inline constexpr bool enable_nonlocking_formatter_optimization<signed char> = true;94template <>95inline constexpr bool enable_nonlocking_formatter_optimization<short> = true;96template <>97inline constexpr bool enable_nonlocking_formatter_optimization<int> = true;98template <>99inline constexpr bool enable_nonlocking_formatter_optimization<long> = true;100template <>101inline constexpr bool enable_nonlocking_formatter_optimization<long long> = true;102# if _LIBCPP_HAS_INT128103template <>104inline constexpr bool enable_nonlocking_formatter_optimization<__int128_t> = true;105# endif106 107template <>108inline constexpr bool enable_nonlocking_formatter_optimization<unsigned char> = true;109template <>110inline constexpr bool enable_nonlocking_formatter_optimization<unsigned short> = true;111template <>112inline constexpr bool enable_nonlocking_formatter_optimization<unsigned> = true;113template <>114inline constexpr bool enable_nonlocking_formatter_optimization<unsigned long> = true;115template <>116inline constexpr bool enable_nonlocking_formatter_optimization<unsigned long long> = true;117# if _LIBCPP_HAS_INT128118template <>119inline constexpr bool enable_nonlocking_formatter_optimization<__uint128_t> = true;120# endif121# endif // _LIBCPP_STD_VER >= 23122#endif // _LIBCPP_STD_VER >= 20123 124_LIBCPP_END_NAMESPACE_STD125 126#endif // _LIBCPP___FORMAT_FORMATTER_INTEGER_H127