GCC Code Coverage Report


Directory: libs/url/
File: src/detail/path.hpp
Date: 2025-11-10 19:06:22
Exec Total Coverage
Lines: 60 60 100.0%
Functions: 3 3 100.0%
Branches: 55 60 91.7%

Line Branch Exec Source
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 4325 path_prefix(
24 char const* p,
25 std::size_t n) noexcept
26 {
27
4/4
✓ Branch 0 taken 310 times.
✓ Branch 1 taken 239 times.
✓ Branch 2 taken 258 times.
✓ Branch 3 taken 3518 times.
4325 switch(n)
28 {
29 310 case 0:
30 310 return 0;
31
32 239 case 1:
33
2/2
✓ Branch 0 taken 154 times.
✓ Branch 1 taken 85 times.
239 if(p[0] == '/')
34 154 return 1;
35 85 return 0;
36
37 258 case 2:
38
2/2
✓ Branch 0 taken 157 times.
✓ Branch 1 taken 101 times.
258 if(p[0] == '/')
39 157 return 1;
40
2/2
✓ Branch 0 taken 86 times.
✓ Branch 1 taken 15 times.
101 if( p[0] == '.' &&
41
2/2
✓ Branch 0 taken 57 times.
✓ Branch 1 taken 29 times.
86 p[1] == '/')
42 57 return 2;
43 44 return 0;
44
45 3518 default:
46
2/2
✓ Branch 0 taken 1870 times.
✓ Branch 1 taken 1648 times.
3518 if(p[0] == '/')
47 {
48
2/2
✓ Branch 0 taken 433 times.
✓ Branch 1 taken 1437 times.
1870 if( p[1] == '.' &&
49
2/2
✓ Branch 0 taken 234 times.
✓ Branch 1 taken 199 times.
433 p[2] == '/')
50 234 return 3;
51 1636 return 1;
52 }
53
2/2
✓ Branch 0 taken 638 times.
✓ Branch 1 taken 1010 times.
1648 if( p[0] == '.' &&
54
2/2
✓ Branch 0 taken 351 times.
✓ Branch 1 taken 287 times.
638 p[1] == '/')
55 351 return 2;
56 1297 break;
57 }
58 1297 return 0;
59 }
60
61 // VFALCO DEPRECATED
62 inline
63 std::size_t
64 4325 path_prefix(
65 core::string_view s) noexcept
66 {
67 4325 return path_prefix(
68 4325 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 3731 path_segments(
76 core::string_view s,
77 std::size_t nseg) noexcept
78 {
79
4/4
✓ Branch 1 taken 1133 times.
✓ Branch 2 taken 554 times.
✓ Branch 3 taken 180 times.
✓ Branch 4 taken 1864 times.
3731 switch(s.size())
80 {
81 1133 case 0:
82
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1133 times.
1133 BOOST_ASSERT(nseg == 0);
83 1133 return 0;
84
85 554 case 1:
86
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 554 times.
554 BOOST_ASSERT(nseg == 1);
87
2/2
✓ Branch 1 taken 494 times.
✓ Branch 2 taken 60 times.
554 if(s[0] == '/')
88 494 return 0;
89 60 return 1;
90
91 180 case 2:
92
2/2
✓ Branch 1 taken 138 times.
✓ Branch 2 taken 42 times.
180 if(s[0] == '/')
93 138 return nseg;
94
4/4
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 28 times.
66 if( s[0] == '.' &&
95
2/2
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 10 times.
24 s[1] == '/')
96 {
97
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 BOOST_ASSERT(nseg > 1);
98 14 return nseg - 1;
99 }
100 28 return nseg;
101
102 1864 default:
103
2/2
✓ Branch 1 taken 932 times.
✓ Branch 2 taken 932 times.
1864 if(s[0] == '/')
104 {
105
4/4
✓ Branch 1 taken 66 times.
✓ Branch 2 taken 866 times.
✓ Branch 3 taken 44 times.
✓ Branch 4 taken 888 times.
998 if( s[1] == '.' &&
106
2/2
✓ Branch 1 taken 44 times.
✓ Branch 2 taken 22 times.
66 s[2] == '/')
107 {
108
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
44 BOOST_ASSERT(nseg > 1);
109 44 return nseg - 1;
110 }
111 888 return nseg;
112 }
113
4/4
✓ Branch 1 taken 76 times.
✓ Branch 2 taken 856 times.
✓ Branch 3 taken 39 times.
✓ Branch 4 taken 893 times.
1008 if( s[0] == '.' &&
114
2/2
✓ Branch 1 taken 39 times.
✓ Branch 2 taken 37 times.
76 s[1] == '/')
115 {
116
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 39 times.
39 BOOST_ASSERT(nseg > 1);
117 39 return nseg - 1;
118 }
119 893 break;
120 }
121 893 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
141