GCC Code Coverage Report


Directory: libs/url/
File: libs/url/src/detail/path.hpp
Date: 2024-03-13 19:32:03
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 4245 path_prefix(
24 char const* p,
25 std::size_t n) noexcept
26 {
27
4/4
✓ Branch 0 taken 328 times.
✓ Branch 1 taken 247 times.
✓ Branch 2 taken 184 times.
✓ Branch 3 taken 3486 times.
4245 switch(n)
28 {
29 328 case 0:
30 328 return 0;
31
32 247 case 1:
33
2/2
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 85 times.
247 if(p[0] == '/')
34 162 return 1;
35 85 return 0;
36
37 184 case 2:
38
2/2
✓ Branch 0 taken 83 times.
✓ Branch 1 taken 101 times.
184 if(p[0] == '/')
39 83 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 3486 default:
46
2/2
✓ Branch 0 taken 1851 times.
✓ Branch 1 taken 1635 times.
3486 if(p[0] == '/')
47 {
48
2/2
✓ Branch 0 taken 433 times.
✓ Branch 1 taken 1418 times.
1851 if( p[1] == '.' &&
49
2/2
✓ Branch 0 taken 234 times.
✓ Branch 1 taken 199 times.
433 p[2] == '/')
50 234 return 3;
51 1617 return 1;
52 }
53
2/2
✓ Branch 0 taken 638 times.
✓ Branch 1 taken 997 times.
1635 if( p[0] == '.' &&
54
2/2
✓ Branch 0 taken 351 times.
✓ Branch 1 taken 287 times.
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 3678 path_segments(
76 core::string_view s,
77 std::size_t nseg) noexcept
78 {
79
4/4
✓ Branch 1 taken 1121 times.
✓ Branch 2 taken 552 times.
✓ Branch 3 taken 166 times.
✓ Branch 4 taken 1839 times.
3678 switch(s.size())
80 {
81 1121 case 0:
82
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1121 times.
1121 BOOST_ASSERT(nseg == 0);
83 1121 return 0;
84
85 552 case 1:
86
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 552 times.
552 BOOST_ASSERT(nseg == 1);
87
2/2
✓ Branch 1 taken 492 times.
✓ Branch 2 taken 60 times.
552 if(s[0] == '/')
88 492 return 0;
89 60 return 1;
90
91 166 case 2:
92
2/2
✓ Branch 1 taken 124 times.
✓ Branch 2 taken 42 times.
166 if(s[0] == '/')
93 124 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 1839 default:
103
2/2
✓ Branch 1 taken 912 times.
✓ Branch 2 taken 927 times.
1839 if(s[0] == '/')
104 {
105
4/4
✓ Branch 1 taken 66 times.
✓ Branch 2 taken 846 times.
✓ Branch 3 taken 44 times.
✓ Branch 4 taken 868 times.
978 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 868 return nseg;
112 }
113
4/4
✓ Branch 1 taken 76 times.
✓ Branch 2 taken 851 times.
✓ Branch 3 taken 39 times.
✓ Branch 4 taken 888 times.
1003 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 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
141