GCC Code Coverage Report


Directory: ./
File: tasks/kamaletdinov_r_bitwise_int/tbb/src/ops_tbb.cpp
Date: 2026-04-02 17:12:27
Exec Total Coverage
Lines: 73 73 100.0%
Functions: 11 11 100.0%
Branches: 61 96 63.5%

Line Branch Exec Source
1 #include "kamaletdinov_r_bitwise_int/tbb/include/ops_tbb.hpp"
2
3 #include <algorithm>
4 #include <array>
5 #include <cstddef>
6 #include <vector>
7
8 #include "kamaletdinov_r_bitwise_int/common/include/common.hpp"
9 #include "oneapi/tbb/parallel_for.h"
10 #include "oneapi/tbb/task_arena.h"
11
12 namespace kamaletdinov_r_bitwise_int {
13
14 namespace {
15
16 100 void CountingSortByDigit(std::vector<int> &arr, int exp) {
17 100 const int n = static_cast<int>(arr.size());
18 100 const int num_parts = tbb::this_task_arena::max_concurrency();
19
20 100 std::vector<std::array<int, 10>> part_counts(num_parts);
21
22
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
100 tbb::parallel_for(0, num_parts, [&](int part) {
23
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 400 times.
400 part_counts.at(part).fill(0);
24 400 const int begin = part * n / num_parts;
25 400 const int end = (part + 1) * n / num_parts;
26
2/2
✓ Branch 0 taken 15980 times.
✓ Branch 1 taken 400 times.
16380 for (int i = begin; i < end; i++) {
27
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15980 times.
15980 const int digit = (arr.at(i) / exp) % 10;
28
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15980 times.
15980 part_counts.at(part).at(digit)++;
29 }
30 400 });
31
32 100 std::array<int, 10> total = {};
33
2/2
✓ Branch 0 taken 400 times.
✓ Branch 1 taken 100 times.
500 for (int pi = 0; pi < num_parts; pi++) {
34
2/2
✓ Branch 0 taken 4000 times.
✓ Branch 1 taken 400 times.
4400 for (int di = 0; di < 10; di++) {
35
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4000 times.
4000 total.at(di) += part_counts.at(pi).at(di);
36 }
37 }
38
39 100 std::array<int, 10> starts = {};
40
2/2
✓ Branch 0 taken 900 times.
✓ Branch 1 taken 100 times.
1000 for (int di = 1; di < 10; di++) {
41 900 starts.at(di) = starts.at(di - 1) + total.at(di - 1);
42 }
43
44
1/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
100 std::vector<std::array<int, 10>> part_positions(num_parts);
45
2/2
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 100 times.
1100 for (int di = 0; di < 10; di++) {
46 1000 int off = starts.at(di);
47
2/2
✓ Branch 0 taken 4000 times.
✓ Branch 1 taken 1000 times.
5000 for (int pi = 0; pi < num_parts; pi++) {
48
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4000 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4000 times.
4000 part_positions.at(pi).at(di) = off;
49 4000 off += part_counts.at(pi).at(di);
50 }
51 }
52
53
1/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
100 std::vector<int> output(n);
54
55
2/6
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 100 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
100 tbb::parallel_for(0, num_parts, [&](int part) {
56
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 400 times.
400 auto pos = part_positions.at(part);
57 400 const int begin = part * n / num_parts;
58 400 const int end = (part + 1) * n / num_parts;
59
2/2
✓ Branch 0 taken 15980 times.
✓ Branch 1 taken 400 times.
16380 for (int i = begin; i < end; i++) {
60
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15980 times.
15980 const int digit = (arr.at(i) / exp) % 10;
61
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 15980 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 15980 times.
15980 output.at(pos.at(digit)++) = arr.at(i);
62 }
63 400 });
64
65 arr.swap(output);
66 100 }
67
68
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 4 times.
64 void RadixSortPositive(std::vector<int> &arr) {
69
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 4 times.
64 if (arr.empty()) {
70 return;
71 }
72
73 60 const int max_val = *std::ranges::max_element(arr);
74
1/2
✓ Branch 0 taken 100 times.
✗ Branch 1 not taken.
100 for (int exp = 1; max_val / exp > 0; exp *= 10) {
75 100 CountingSortByDigit(arr, exp);
76
2/2
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 60 times.
100 if (exp > max_val / 10) {
77 break;
78 }
79 }
80 }
81
82
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 32 times.
40 void BitwiseSortTBB(std::vector<int> &arr) {
83
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 32 times.
40 if (arr.size() <= 1) {
84 8 return;
85 }
86
87 32 std::vector<int> neg;
88
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 std::vector<int> pos;
89
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 neg.reserve(arr.size());
90
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 pos.reserve(arr.size());
91
92
2/2
✓ Branch 0 taken 5532 times.
✓ Branch 1 taken 32 times.
5564 for (int val : arr) {
93
2/2
✓ Branch 0 taken 2740 times.
✓ Branch 1 taken 2792 times.
5532 if (val < 0) {
94
1/4
✓ Branch 1 taken 2740 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
2740 neg.push_back(-val);
95 } else {
96 pos.push_back(val);
97 }
98 }
99
100
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 RadixSortPositive(neg);
101
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 RadixSortPositive(pos);
102
103 std::size_t idx = 0;
104
2/2
✓ Branch 0 taken 2740 times.
✓ Branch 1 taken 32 times.
2772 for (int i = static_cast<int>(neg.size()) - 1; i >= 0; i--) {
105
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2740 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2740 times.
2740 arr.at(idx++) = -neg.at(i);
106 }
107
2/2
✓ Branch 0 taken 2792 times.
✓ Branch 1 taken 32 times.
2824 for (int v : pos) {
108
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2792 times.
2792 arr.at(idx++) = v;
109 }
110 }
111
112 } // namespace
113
114 40 KamaletdinovRBitwiseIntTBB::KamaletdinovRBitwiseIntTBB(const InType &in) {
115 SetTypeOfTask(GetStaticTypeOfTask());
116 40 GetInput() = in;
117 GetOutput() = 0;
118 40 }
119
120 40 bool KamaletdinovRBitwiseIntTBB::ValidationImpl() {
121 40 return GetInput() >= 0;
122 }
123
124 40 bool KamaletdinovRBitwiseIntTBB::PreProcessingImpl() {
125 40 const int n = GetInput();
126 40 data_.resize(n);
127
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 5536 times.
5576 tbb::parallel_for(0, n, [&](int i) { data_.at(i) = (n / 2) - i; });
128 40 return true;
129 }
130
131 40 bool KamaletdinovRBitwiseIntTBB::RunImpl() {
132 40 BitwiseSortTBB(data_);
133 40 return true;
134 }
135
136
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 4 times.
40 bool KamaletdinovRBitwiseIntTBB::PostProcessingImpl() {
137 const bool sorted = std::ranges::is_sorted(data_);
138
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
40 GetOutput() = sorted ? GetInput() : 0;
139 40 return true;
140 }
141
142 } // namespace kamaletdinov_r_bitwise_int
143