LCOV - code coverage report
Current view: top level - opt/homebrew/include/boost/test/utils/basic_cstring - bcs_char_traits.hpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 27 27 100.0 %
Date: 2026-06-25 07:23:43 Functions: 5 5 100.0 %

          Line data    Source code
       1             : //  (C) Copyright Gennadiy Rozental 2001.
       2             : //  Distributed under the Boost Software License, Version 1.0.
       3             : //  (See accompanying file LICENSE_1_0.txt or copy at
       4             : //  http://www.boost.org/LICENSE_1_0.txt)
       5             : 
       6             : //  See http://www.boost.org/libs/test for the library home page.
       7             : //
       8             : //  File        : $RCSfile$
       9             : //
      10             : //  Version     : $Revision$
      11             : //
      12             : //  Description : generic char traits class; wraps std::char_traits
      13             : // ***************************************************************************
      14             : 
      15             : #ifndef BOOST_TEST_UTILS_BCS_CHAR_TRAITS_HPP
      16             : #define BOOST_TEST_UTILS_BCS_CHAR_TRAITS_HPP
      17             : 
      18             : // Boost
      19             : #include <boost/config.hpp>
      20             : #include <boost/detail/workaround.hpp>
      21             : #include <boost/test/detail/config.hpp>
      22             : #include <boost/type_traits/add_const.hpp>
      23             : 
      24             : // STL
      25             : #include <string>                       // std::char_traits
      26             : #include <cstddef>                      // std::size_t
      27             : 
      28             : #include <boost/test/detail/suppress_warnings.hpp>
      29             : 
      30             : //____________________________________________________________________________//
      31             : 
      32             : namespace boost {
      33             : 
      34             : namespace unit_test {
      35             : 
      36             : namespace ut_detail {
      37             : 
      38             : template<typename CharT> struct bcs_base_char           { typedef CharT type; };
      39             : 
      40             : template<> struct bcs_base_char<char const>             { typedef char type; };
      41             : template<> struct bcs_base_char<unsigned char>          { typedef char type; };
      42             : #if !BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x551))
      43             : template<> struct bcs_base_char<unsigned char const>    { typedef char type; };
      44             : #endif
      45             : 
      46             : template<> struct bcs_base_char<wchar_t const>          { typedef wchar_t type; };
      47             : 
      48             : // ************************************************************************** //
      49             : // **************               bcs_char_traits                ************** //
      50             : // ************************************************************************** //
      51             : 
      52             : template<typename CharT>
      53             : struct bcs_char_traits_impl
      54             : {
      55             : #if BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x564))
      56             :     typedef CharT const const_char;
      57             : #else
      58             :     typedef typename boost::add_const<CharT>::type const_char;
      59             : #endif
      60   241962779 :     static bool eq( CharT c1, CharT c2 )
      61             :     {
      62   241962779 :         return c1 == c2;
      63             :     }
      64      115448 :     static bool lt( CharT c1, CharT c2 )
      65             :     {
      66      115448 :         return c1 < c2;
      67             :     }
      68             : 
      69      169179 :     static int compare( const_char* cstr1, const_char* cstr2, std::size_t n )
      70             :     {
      71      653924 :         while( n > 0 ) {
      72      600193 :             if( !eq( *cstr1, *cstr2 ) )
      73      115448 :                 return lt( *cstr1, *cstr2 ) ? -1 : 1;
      74      484745 :             ++cstr1;
      75      484745 :             ++cstr2;
      76      484745 :             --n;
      77             :         }
      78             : 
      79       53731 :         return 0;
      80      169179 :     }
      81             : 
      82    25461315 :     static std::size_t length( const_char* cstr )
      83             :     {
      84    25461315 :         const_char null_char = CharT();
      85             : 
      86    25461315 :         const_char* ptr = cstr;
      87   241311340 :         while( !eq( *ptr, null_char ) )
      88   215850025 :             ++ptr;
      89             : 
      90    25461315 :         return ptr - cstr;
      91             :     }
      92             : 
      93       19126 :     static const_char* find( const_char* s, std::size_t n, CharT c )
      94             :     {
      95       67890 :         while( n > 0 ) {
      96       51246 :             if( eq( *s, c ) )
      97        2482 :                 return s;
      98             : 
      99       48764 :             ++s;
     100       48764 :             --n;
     101             :         }
     102       16644 :         return 0;
     103       19126 :     }
     104             : };
     105             : 
     106             : #ifdef BOOST_CLASSIC_IOSTREAMS
     107             : template<typename CharT>
     108             : struct char_traits_with_find : std::string_char_traits<CharT> {
     109             :     static CharT const* find( CharT const* s, std::size_t n, CharT c )
     110             :     {
     111             :         while( n > 0 ) {
     112             :             if( eq( *s, c ) )
     113             :                 return s;
     114             : 
     115             :             ++s;
     116             :             --n;
     117             :         }
     118             :         return 0;
     119             :     }
     120             : };
     121             : 
     122             : template<> struct bcs_char_traits_impl<char> : public char_traits_with_find<char> {};
     123             : template<> struct bcs_char_traits_impl<wchar_t> : public char_traits_with_find<wchar_t> {};
     124             : #else
     125             : template<> struct bcs_char_traits_impl<char> : public std::char_traits<char> {};
     126             : template<> struct bcs_char_traits_impl<wchar_t> : public std::char_traits<wchar_t> {};
     127             : #endif
     128             : 
     129             : template<typename CharT>
     130             : class bcs_char_traits : public bcs_char_traits_impl<CharT> {
     131             :     typedef typename ut_detail::bcs_base_char<CharT>::type                              the_base_char;
     132             : public:
     133             : #ifdef BOOST_CLASSIC_IOSTREAMS
     134             :     typedef std::basic_string<the_base_char, std::string_char_traits<the_base_char> >   std_string;
     135             : #else
     136             :     typedef std::basic_string<the_base_char, std::char_traits<the_base_char> >          std_string;
     137             : #endif
     138             : };
     139             : 
     140             : } // namespace ut_detail
     141             : 
     142             : } // namespace unit_test
     143             : 
     144             : } // namespace boost
     145             : 
     146             : //____________________________________________________________________________//
     147             : 
     148             : #include <boost/test/detail/enable_warnings.hpp>
     149             : 
     150             : #endif // BOOST_TEST_UTILS_BCS_CHAR_TRAITS_HPP

Generated by: LCOV version 1.16