LCOV - code coverage report
Current view: top level - libs/url/src/detail/path.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 60 60
Test Date: 2024-08-20 16:05:53 Functions: 100.0 % 3 3

            Line data    Source code
       1              : //
       2              : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
       3              : //
       4              : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       5              : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       6              : //
       7              : // Official repository: https://github.com/boostorg/url
       8              : //
       9              : 
      10              : #ifndef BOOST_URL_DETAIL_PATH_HPP
      11              : #define BOOST_URL_DETAIL_PATH_HPP
      12              : 
      13              : #include <boost/core/detail/string_view.hpp>
      14              : 
      15              : namespace boost {
      16              : namespace urls {
      17              : namespace detail {
      18              : 
      19              : // Return the number of characters at
      20              : // the front of the path that are reserved
      21              : inline
      22              : std::size_t
      23         4245 : path_prefix(
      24              :     char const* p,
      25              :     std::size_t n) noexcept
      26              : {
      27         4245 :     switch(n)
      28              :     {
      29          328 :     case 0:
      30          328 :         return 0;
      31              : 
      32          247 :     case 1:
      33          247 :         if(p[0] == '/')
      34          162 :             return 1;
      35           85 :         return 0;
      36              : 
      37          184 :     case 2:
      38          184 :         if(p[0] == '/')
      39           83 :             return 1;
      40          101 :         if( p[0] == '.' &&
      41           86 :             p[1] == '/')
      42           57 :             return 2;
      43           44 :         return 0;
      44              : 
      45         3486 :     default:
      46         3486 :         if(p[0] == '/')
      47              :         {
      48         1851 :             if( p[1] == '.' &&
      49          433 :                 p[2] == '/')
      50          234 :                 return 3;
      51         1617 :             return 1;
      52              :         }
      53         1635 :         if( p[0] == '.' &&
      54          638 :             p[1] == '/')
      55          351 :             return 2;
      56         1284 :         break;
      57              :     }
      58         1284 :     return 0;
      59              : }
      60              : 
      61              : // VFALCO DEPRECATED
      62              : inline
      63              : std::size_t
      64         4245 : path_prefix(
      65              :     core::string_view s) noexcept
      66              : {
      67         4245 :     return path_prefix(
      68         4245 :         s.data(), s.size());
      69              : }
      70              : 
      71              : // returns the number of adjusted
      72              : // segments based on the malleable prefix.
      73              : inline
      74              : std::size_t
      75         3685 : path_segments(
      76              :     core::string_view s,
      77              :     std::size_t nseg) noexcept
      78              : {
      79         3685 :     switch(s.size())
      80              :     {
      81         1123 :     case 0:
      82         1123 :         BOOST_ASSERT(nseg == 0);
      83         1123 :         return 0;
      84              : 
      85          552 :     case 1:
      86          552 :         BOOST_ASSERT(nseg == 1);
      87          552 :         if(s[0] == '/')
      88          492 :             return 0;
      89           60 :         return 1;
      90              : 
      91          166 :     case 2:
      92          166 :         if(s[0] == '/')
      93          124 :             return nseg;
      94           66 :         if( s[0] == '.' &&
      95           24 :             s[1] == '/')
      96              :         {
      97           14 :             BOOST_ASSERT(nseg > 1);
      98           14 :             return nseg - 1;
      99              :         }
     100           28 :         return nseg;
     101              : 
     102         1844 :     default:
     103         1844 :         if(s[0] == '/')
     104              :         {
     105          983 :             if( s[1] == '.' &&
     106           66 :                 s[2] == '/')
     107              :             {
     108           44 :                 BOOST_ASSERT(nseg > 1);
     109           44 :                 return nseg - 1;
     110              :             }
     111          873 :             return nseg;
     112              :         }
     113         1003 :         if( s[0] == '.' &&
     114           76 :             s[1] == '/')
     115              :         {
     116           39 :             BOOST_ASSERT(nseg > 1);
     117           39 :             return nseg - 1;
     118              :         }
     119          888 :         break;
     120              :     }
     121          888 :     return nseg;
     122              : }
     123              : 
     124              : // Trim reserved characters from
     125              : // the front of the path.
     126              : inline
     127              : core::string_view
     128              : clean_path(
     129              :     core::string_view s) noexcept
     130              : {
     131              :     s.remove_prefix(
     132              :         path_prefix(s));
     133              :     return s;
     134              : }
     135              : 
     136              : } // detail
     137              : } // urls
     138              : } // boost
     139              : 
     140              : #endif
        

Generated by: LCOV version 2.1