GCC Code Coverage Report


Directory: ./
File: src/utilities/strings.cpp
Date: 2023-04-27 00:55:30
Exec Total Coverage
Lines: 57 60 95.0%
Functions: 5 9 55.6%
Branches: 49 61 80.3%

Line Branch Exec Source
1 #include "utilities/strings.h"
2 #include "utilities/names.h"
3
4 #include "ast/magic.h"
5 #include "ast/nodes.h"
6
7 namespace lython {
8
9 template <typename Iterator>
10 String join(String const& sep, Iterator const& start, Iterator const& end) {
11 1096 int count = int(end - start);
12
13
2/2
✓ Branch 0 taken 218 times.
✓ Branch 1 taken 330 times.
1096 if (count == 1)
14
1/2
✓ Branch 2 taken 218 times.
✗ Branch 4 not taken.
436 return String(*start);
15
16
2/2
✓ Branch 0 taken 68 times.
✓ Branch 1 taken 262 times.
660 if (count == 0)
17
1/1
✓ Branch 2 taken 68 times.
136 return "";
18
19 524 std::ptrdiff_t size = 0;
20
2/2
✓ Branch 1 taken 1017 times.
✓ Branch 2 taken 262 times.
2558 for (auto i = start; i != end; ++i)
21
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2034 size += StringView(*i).size();
22
23 524 size += int(sep.size()) * (count - 1);
24
1/1
✓ Branch 2 taken 262 times.
524 String result(size_t(size), ' ');
25
26 524 size = 0;
27
2/2
✓ Branch 2 taken 1017 times.
✓ Branch 3 taken 262 times.
2558 for (auto i = start; i != end; ++i) {
28
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2034 StringView const& str = *i;
29
1/1
✓ Branch 5 taken 1017 times.
2034 std::copy(std::begin(str), std::end(str), result.begin() + size);
30 2034 size += str.size();
31
32
2/2
✓ Branch 1 taken 755 times.
✓ Branch 2 taken 262 times.
2034 if (size_t(size) < result.size()) {
33
1/1
✓ Branch 5 taken 755 times.
1510 std::copy(std::begin(sep), std::end(sep), result.begin() + size);
34 1510 size += sep.size();
35 }
36 }
37
38 524 return result;
39 524 }
40
41 String join(String const& sep, Array<String> const& strs) {
42
1/1
✓ Branch 3 taken 548 times.
1096 return join(sep, std::begin(strs), std::end(strs));
43 }
44
45 String join(String const& sep, Array<StringView> const& strs) {
46 return join(sep, std::begin(strs), std::end(strs));
47 }
48
49 String join(String const& sep, Array<StringRef> const& strs) {
50 return join(sep, std::begin(strs), std::end(strs));
51 }
52
53 template String join(String const& sep, Array<ExprNode*> const& exprs);
54 template String join(String const& sep, Array<Pattern*> const& exprs);
55
56 Set<char> const& strip_defaults() {
57
4/7
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 1060 times.
✓ Branch 3 taken 11 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 11 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
1071 static Set<char> char_set = {'\n', ' ', '\t'};
58 1071 return char_set;
59 }
60
61 String strip(String const& v) {
62 1060 Set<char> const& char_set = strip_defaults();
63
64 // remove trailing from the left
65 1060 auto k = 0ul;
66
2/2
✓ Branch 3 taken 1106 times.
✓ Branch 4 taken 6 times.
1112 for (auto i = v.begin(); i != v.end(); ++i) {
67
3/3
✓ Branch 2 taken 1106 times.
✓ Branch 4 taken 1054 times.
✓ Branch 5 taken 52 times.
1106 if (char_set.count(*i) == 0) {
68 1054 break;
69 }
70 52 k += 1;
71 }
72
73 // remove trailing from the right
74 1060 auto p = 0ul;
75
3/3
✓ Branch 3 taken 1115 times.
✓ Branch 5 taken 1109 times.
✓ Branch 6 taken 6 times.
1115 for (auto i = v.rbegin(); i != v.rend(); ++i) {
76
3/3
✓ Branch 2 taken 1109 times.
✓ Branch 4 taken 1054 times.
✓ Branch 5 taken 55 times.
1109 if (char_set.count(*i) == 0) {
77 1054 break;
78 }
79 55 p += 1;
80 }
81
82 1060 String result;
83 1060 int new_size = int(v.size()) - (k + p);
84
85
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1054 times.
1060 if (new_size <= 0) {
86 6 return result;
87 }
88
89
1/1
✓ Branch 1 taken 1054 times.
1054 result.reserve(new_size);
90
91
2/2
✓ Branch 1 taken 1054 times.
✓ Branch 8 taken 1054 times.
1054 std::copy(std::begin(v) + k, std::end(v) - p, std::back_inserter(result));
92 1054 return result;
93 }
94
95 Array<String> split(char sep, String const& text) {
96 288 int count = 1;
97
2/2
✓ Branch 5 taken 431 times.
✓ Branch 6 taken 288 times.
719 for (auto c: text) {
98
2/2
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 393 times.
431 if (c == sep) {
99 38 count += 1;
100 }
101 }
102
103 288 Array<String> frags;
104
1/1
✓ Branch 1 taken 288 times.
288 frags.reserve(count);
105 288 String buffer;
106
107
2/2
✓ Branch 1 taken 431 times.
✓ Branch 2 taken 288 times.
719 for (int i = 0; i < text.size(); i++) {
108 431 char c = text[i];
109
110
2/2
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 393 times.
431 if (c == sep) {
111
1/1
✓ Branch 1 taken 38 times.
38 frags.push_back(buffer);
112
1/1
✓ Branch 1 taken 38 times.
38 buffer.resize(0);
113 } else {
114
1/1
✓ Branch 1 taken 393 times.
393 buffer.push_back(c);
115 }
116 }
117
118
1/1
✓ Branch 1 taken 288 times.
288 frags.push_back(buffer);
119 576 return frags;
120 288 }
121
122 } // namespace lython
123