GCC Code Coverage Report


Directory: ./
File: tasks/yurkin_g_graham_scan/tbb/src/ops_tbb.cpp
Date: 2026-06-04 20:25:32
Exec Total Coverage
Lines: 43 45 95.6%
Functions: 5 5 100.0%
Branches: 51 154 33.1%

Line Branch Exec Source
1 #include "yurkin_g_graham_scan/tbb/include/ops_tbb.hpp"
2
3 #include <tbb/parallel_sort.h>
4 #include <tbb/tbb.h>
5
6 #include <cstddef>
7 #include <ranges>
8 #include <vector>
9
10 #include "yurkin_g_graham_scan/common/include/common.hpp"
11
12 namespace yurkin_g_graham_scan {
13
14
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 YurkinGGrahamScanTBB::YurkinGGrahamScanTBB(const InType &in) {
15 SetTypeOfTask(GetStaticTypeOfTask());
16
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 GetInput() = in;
17 GetOutput().clear();
18 4 }
19
20 4 bool YurkinGGrahamScanTBB::ValidationImpl() {
21 4 return !GetInput().empty();
22 }
23
24
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 bool YurkinGGrahamScanTBB::PreProcessingImpl() {
25 auto &pts = GetInput();
26
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 if (pts.empty()) {
27 return true;
28 }
29
30 4 tbb::parallel_sort(pts.begin(), pts.end(), [](const Point &a, const Point &b) {
31
4/44
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✓ Branch 38 taken 20 times.
✓ Branch 39 taken 8 times.
✓ Branch 40 taken 52 times.
✓ Branch 41 taken 20 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
100 if (a.x != b.x) {
32 72 return a.x < b.x;
33 }
34 28 return a.y < b.y;
35 });
36
37
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 std::vector<Point> tmp;
38
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 tmp.reserve(pts.size());
39
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 4 times.
36 for (const auto &p : pts) {
40
6/6
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 4 times.
32 if (tmp.empty() || tmp.back().x != p.x || tmp.back().y != p.y) {
41 tmp.push_back(p);
42 }
43 }
44 pts.swap(tmp);
45
46
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 return !pts.empty();
47 }
48
49 namespace { // helper: cross product
50 long double Cross(const Point &o, const Point &a, const Point &b) {
51 48 return (static_cast<long double>(a.x - o.x) * static_cast<long double>(b.y - o.y)) -
52 48 (static_cast<long double>(a.y - o.y) * static_cast<long double>(b.x - o.x));
53 }
54 } // namespace
55
56 4 bool YurkinGGrahamScanTBB::RunImpl() {
57 4 const InType pts_in = GetInput();
58 const std::size_t n = pts_in.size();
59
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (n == 0) {
60 GetOutput().clear();
61 return true;
62 }
63
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (n == 1) {
64 GetOutput() = pts_in;
65 return true;
66 }
67
68
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 InType pts = pts_in;
69
1/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
4 tbb::parallel_sort(pts.begin(), pts.end(), [](const Point &a, const Point &b) {
70
4/44
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✓ Branch 38 taken 20 times.
✓ Branch 39 taken 4 times.
✓ Branch 40 taken 12 times.
✓ Branch 41 taken 12 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
48 if (a.x != b.x) {
71 32 return a.x < b.x;
72 }
73 16 return a.y < b.y;
74 });
75
76
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 OutType lower;
77
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 lower.reserve(pts.size());
78
2/2
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 4 times.
32 for (const auto &p : pts) {
79
4/4
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 8 times.
44 while (lower.size() >= 2 && Cross(lower[lower.size() - 2], lower[lower.size() - 1], p) <= 0) {
80 lower.pop_back();
81 }
82 lower.push_back(p);
83 }
84
85 4 OutType upper;
86
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 upper.reserve(pts.size());
87
2/2
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 4 times.
32 for (const auto &p : std::ranges::reverse_view(pts)) {
88
4/4
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 16 times.
44 while (upper.size() >= 2 && Cross(upper[upper.size() - 2], upper[upper.size() - 1], p) <= 0) {
89 upper.pop_back();
90 }
91 upper.push_back(p);
92 }
93
94
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 OutType hull;
95
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 hull.reserve(lower.size() + upper.size());
96
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 4 times.
16 for (const auto &pt : lower) {
97 hull.push_back(pt);
98 }
99
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
8 for (std::size_t i = 1; i + 1 < upper.size(); ++i) {
100 hull.push_back(upper[i]);
101 }
102
103
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 GetOutput() = hull;
104 return true;
105 }
106
107
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 bool YurkinGGrahamScanTBB::PostProcessingImpl() {
108
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 if (GetInput().empty()) {
109 return true;
110 }
111 4 return !GetOutput().empty();
112 }
113
114 } // namespace yurkin_g_graham_scan
115