LCOV - code coverage report
Current view: top level - /usr/include/c++/13/bits - charconv.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 88.5 % 26 23
Test Date: 2024-04-30 13:17:26 Functions: 66.7 % 6 4

            Line data    Source code
       1              : // Numeric conversions (to_string, to_chars) -*- C++ -*-
       2              : 
       3              : // Copyright (C) 2017-2023 Free Software Foundation, Inc.
       4              : //
       5              : // This file is part of the GNU ISO C++ Library.  This library is free
       6              : // software; you can redistribute it and/or modify it under the
       7              : // terms of the GNU General Public License as published by the
       8              : // Free Software Foundation; either version 3, or (at your option)
       9              : // any later version.
      10              : 
      11              : // This library is distributed in the hope that it will be useful,
      12              : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13              : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14              : // GNU General Public License for more details.
      15              : 
      16              : // Under Section 7 of GPL version 3, you are granted additional
      17              : // permissions described in the GCC Runtime Library Exception, version
      18              : // 3.1, as published by the Free Software Foundation.
      19              : 
      20              : // You should have received a copy of the GNU General Public License and
      21              : // a copy of the GCC Runtime Library Exception along with this program;
      22              : // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      23              : // <http://www.gnu.org/licenses/>.
      24              : 
      25              : /** @file bits/charconv.h
      26              :  *  This is an internal header file, included by other library headers.
      27              :  *  Do not attempt to use it directly. @headername{charconv}
      28              :  */
      29              : 
      30              : #ifndef _GLIBCXX_CHARCONV_H
      31              : #define _GLIBCXX_CHARCONV_H 1
      32              : 
      33              : #pragma GCC system_header
      34              : 
      35              : #if __cplusplus >= 201103L
      36              : 
      37              : #include <type_traits>
      38              : #include <ext/numeric_traits.h>
      39              : 
      40              : namespace std _GLIBCXX_VISIBILITY(default)
      41              : {
      42              : _GLIBCXX_BEGIN_NAMESPACE_VERSION
      43              : namespace __detail
      44              : {
      45              : #if __cpp_variable_templates
      46              :   // This accepts 128-bit integers even in strict mode.
      47              :   template<typename _Tp>
      48              :     constexpr bool __integer_to_chars_is_unsigned
      49              :       = ! __gnu_cxx::__int_traits<_Tp>::__is_signed;
      50              : #endif
      51              : 
      52              :   // Generic implementation for arbitrary bases.
      53              :   template<typename _Tp>
      54              :     _GLIBCXX14_CONSTEXPR unsigned
      55       478128 :     __to_chars_len(_Tp __value, int __base = 10) noexcept
      56              :     {
      57              : #if __cpp_variable_templates
      58              :       static_assert(__integer_to_chars_is_unsigned<_Tp>, "implementation bug");
      59              : #endif
      60              : 
      61       478128 :       unsigned __n = 1;
      62       478128 :       const unsigned __b2 = __base  * __base;
      63       478128 :       const unsigned __b3 = __b2 * __base;
      64       478128 :       const unsigned long __b4 = __b3 * __base;
      65              :       for (;;)
      66              :         {
      67       478128 :           if (__value < (unsigned)__base) return __n;
      68         1178 :           if (__value < __b2) return __n + 1;
      69           10 :           if (__value < __b3) return __n + 2;
      70            0 :           if (__value < __b4) return __n + 3;
      71            0 :           __value /= __b4;
      72            0 :           __n += 4;
      73              :         }
      74              :     }
      75              : 
      76              :   // Write an unsigned integer value to the range [first,first+len).
      77              :   // The caller is required to provide a buffer of exactly the right size
      78              :   // (which can be determined by the __to_chars_len function).
      79              :   template<typename _Tp>
      80              :     _GLIBCXX23_CONSTEXPR void
      81       478128 :     __to_chars_10_impl(char* __first, unsigned __len, _Tp __val) noexcept
      82              :     {
      83              : #if __cpp_variable_templates
      84              :       static_assert(__integer_to_chars_is_unsigned<_Tp>, "implementation bug");
      85              : #endif
      86              : 
      87       478128 :       constexpr char __digits[201] =
      88              :         "0001020304050607080910111213141516171819"
      89              :         "2021222324252627282930313233343536373839"
      90              :         "4041424344454647484950515253545556575859"
      91              :         "6061626364656667686970717273747576777879"
      92              :         "8081828384858687888990919293949596979899";
      93       478128 :       unsigned __pos = __len - 1;
      94       478138 :       while (__val >= 100)
      95              :         {
      96           10 :           auto const __num = (__val % 100) * 2;
      97           10 :           __val /= 100;
      98           10 :           __first[__pos] = __digits[__num + 1];
      99           10 :           __first[__pos - 1] = __digits[__num];
     100           10 :           __pos -= 2;
     101              :         }
     102       478128 :       if (__val >= 10)
     103              :         {
     104         1168 :           auto const __num = __val * 2;
     105         1168 :           __first[1] = __digits[__num + 1];
     106         1168 :           __first[0] = __digits[__num];
     107              :         }
     108              :       else
     109       476960 :         __first[0] = '0' + __val;
     110       478128 :     }
     111              : 
     112              : } // namespace __detail
     113              : _GLIBCXX_END_NAMESPACE_VERSION
     114              : } // namespace std
     115              : #endif // C++11
     116              : #endif // _GLIBCXX_CHARCONV_H
        

Generated by: LCOV version 2.0-1