include/boost/url/detail/path.hpp

98.3% Lines (59/60) 100.0% Functions (3/3) 85.0% Branches (51/60)
include/boost/url/detail/path.hpp
Line Branch Hits 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 4367 path_prefix(
24 char const* p,
25 std::size_t n) noexcept
26 {
27
4/4
✓ Branch 0 taken 311 times.
✓ Branch 1 taken 240 times.
✓ Branch 2 taken 259 times.
✓ Branch 3 taken 3557 times.
4367 switch(n)
28 {
29 311 case 0:
30 311 return 0;
31
32 240 case 1:
33
2/2
✓ Branch 0 taken 155 times.
✓ Branch 1 taken 85 times.
240 if(p[0] == '/')
34 155 return 1;
35 85 return 0;
36
37 259 case 2:
38
2/2
✓ Branch 0 taken 158 times.
✓ Branch 1 taken 101 times.
259 if(p[0] == '/')
39 158 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 3557 default:
46
2/2
✓ Branch 0 taken 1905 times.
✓ Branch 1 taken 1652 times.
3557 if(p[0] == '/')
47 {
48
2/2
✓ Branch 0 taken 433 times.
✓ Branch 1 taken 1472 times.
1905 if( p[1] == '.' &&
49
2/2
✓ Branch 0 taken 234 times.
✓ Branch 1 taken 199 times.
433 p[2] == '/')
50 234 return 3;
51 1671 return 1;
52 }
53
2/2
✓ Branch 0 taken 638 times.
✓ Branch 1 taken 1014 times.
1652 if( p[0] == '.' &&
54
2/2
✓ Branch 0 taken 351 times.
✓ Branch 1 taken 287 times.
638 p[1] == '/')
55 351 return 2;
56 1301 break;
57 }
58 1301 return 0;
59 }
60
61 // VFALCO DEPRECATED
62 inline
63 std::size_t
64 4367 path_prefix(
65 core::string_view s) noexcept
66 {
67 4367 return path_prefix(
68 4367 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 158 path_segments(
76 core::string_view s,
77 std::size_t nseg) noexcept
78 {
79
4/4
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 11 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 138 times.
158 switch(s.size())
80 {
81 3 case 0:
82
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 BOOST_ASSERT(nseg == 0);
83 3 return 0;
84
85 11 case 1:
86
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
11 BOOST_ASSERT(nseg == 1);
87
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 4 times.
11 if(s[0] == '/')
88 7 return 0;
89 4 return 1;
90
91 6 case 2:
92
2/2
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 5 times.
6 if(s[0] == '/')
93 1 return nseg;
94
2/4
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
10 if( s[0] == '.' &&
95
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 s[1] == '/')
96 {
97
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 BOOST_ASSERT(nseg > 1);
98 5 return nseg - 1;
99 }
100 return nseg;
101
102 138 default:
103
2/2
✓ Branch 1 taken 34 times.
✓ Branch 2 taken 104 times.
138 if(s[0] == '/')
104 {
105
4/4
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 33 times.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 33 times.
35 if( s[1] == '.' &&
106
1/2
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
1 s[2] == '/')
107 {
108
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 time.
1 BOOST_ASSERT(nseg > 1);
109 1 return nseg - 1;
110 }
111 33 return nseg;
112 }
113
4/4
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 101 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 102 times.
107 if( s[0] == '.' &&
114
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 time.
3 s[1] == '/')
115 {
116
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 BOOST_ASSERT(nseg > 1);
117 2 return nseg - 1;
118 }
119 102 break;
120 }
121 102 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