GCC Code Coverage Report


Directory: ./
File: tasks/mityaeva_radix/seq/src/sorter_seq.cpp
Date: 2026-04-02 17:12:27
Exec Total Coverage
Lines: 49 49 100.0%
Functions: 3 3 100.0%
Branches: 40 60 66.7%

Line Branch Exec Source
1 #include "mityaeva_radix/seq/include/sorter_seq.hpp"
2
3 #include <algorithm>
4 #include <cstddef>
5 #include <vector>
6
7 namespace mityaeva_radix {
8 704 void SorterSeq::CountingSortAsc(std::vector<double> &source, std::vector<double> &destination, int byte) {
9 auto *mas = reinterpret_cast<unsigned char *>(source.data());
10 704 std::vector<int> counter(256, 0);
11 auto size = source.size();
12
2/2
✓ Branch 0 taken 18240 times.
✓ Branch 1 taken 704 times.
18944 for (std::size_t i = 0; i < size; i++) {
13 18240 counter[mas[(8 * i) + byte]]++;
14 }
15 int j = 0;
16
1/2
✓ Branch 0 taken 27264 times.
✗ Branch 1 not taken.
27264 for (; j < 256; j++) {
17
2/2
✓ Branch 0 taken 26560 times.
✓ Branch 1 taken 704 times.
27264 if (counter[j] != 0) {
18 break;
19 }
20 }
21 704 int tem = counter[j];
22 704 counter[j] = 0;
23 704 j++;
24
2/2
✓ Branch 0 taken 152960 times.
✓ Branch 1 taken 704 times.
153664 for (; j < 256; j++) {
25 152960 int b = counter[j];
26 152960 counter[j] = tem;
27 152960 tem += b;
28 }
29
2/2
✓ Branch 0 taken 18240 times.
✓ Branch 1 taken 704 times.
18944 for (std::size_t i = 0; i < size; i++) {
30 18240 destination[counter[mas[(8 * i) + byte]]] = source[i];
31 18240 counter[mas[(8 * i) + byte]]++;
32 }
33 704 }
34
35 704 void SorterSeq::CountingSortDesc(std::vector<double> &source, std::vector<double> &destination, int byte) {
36 auto *mas = reinterpret_cast<unsigned char *>(source.data());
37 704 std::vector<int> count(256, 0);
38 auto size = source.size();
39
2/2
✓ Branch 0 taken 17408 times.
✓ Branch 1 taken 704 times.
18112 for (std::size_t i = 0; i < size; i++) {
40 17408 count[mas[(8 * i) + byte]]++;
41 }
42 int sum = 0;
43
1/4
✓ Branch 1 taken 704 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
704 std::vector<int> pos(256, 0);
44
2/2
✓ Branch 0 taken 180224 times.
✓ Branch 1 taken 704 times.
180928 for (int i = 255; i >= 0; i--) {
45 180224 sum += count[i];
46 180224 pos[i] = sum - count[i];
47 }
48
2/2
✓ Branch 0 taken 17408 times.
✓ Branch 1 taken 704 times.
18112 for (std::size_t i = 0; i < size; i++) {
49 17408 int byte_val = mas[(8 * i) + byte];
50 17408 destination[pos[byte_val]] = source[i];
51 17408 pos[byte_val]++;
52 }
53 704 }
54
55
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 88 times.
96 void SorterSeq::LSDSortDouble(std::vector<double> &inp) {
56
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 88 times.
96 if (inp.size() <= 1) {
57 8 return;
58 }
59 auto count_negative = std::ranges::count_if(inp, [](auto x) { return x < 0; });
60 88 std::vector<double> negative;
61
1/2
✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
88 negative.reserve(count_negative);
62
1/2
✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
88 std::vector<double> positive;
63
1/2
✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
88 positive.reserve(inp.size() - count_negative);
64
2/2
✓ Branch 0 taken 4456 times.
✓ Branch 1 taken 88 times.
4544 for (auto x : inp) {
65
2/2
✓ Branch 0 taken 2176 times.
✓ Branch 1 taken 2280 times.
4456 if (x < 0) {
66 negative.push_back(x);
67 } else {
68 positive.push_back(x);
69 }
70 }
71
2/6
✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 88 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
88 std::vector<double> out_n(negative.size());
72
1/4
✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
88 std::vector<double> out_p(positive.size());
73
2/2
✓ Branch 0 taken 704 times.
✓ Branch 1 taken 88 times.
792 for (int i = 0; i < 8; i++) {
74
2/2
✓ Branch 0 taken 352 times.
✓ Branch 1 taken 352 times.
704 if (i % 2 == 0) {
75
1/2
✓ Branch 1 taken 352 times.
✗ Branch 2 not taken.
352 CountingSortDesc(negative, out_n, i);
76
1/2
✓ Branch 1 taken 352 times.
✗ Branch 2 not taken.
352 CountingSortAsc(positive, out_p, i);
77 } else {
78
1/2
✓ Branch 1 taken 352 times.
✗ Branch 2 not taken.
352 CountingSortDesc(out_n, negative, i);
79
1/2
✓ Branch 1 taken 352 times.
✗ Branch 2 not taken.
352 CountingSortAsc(out_p, positive, i);
80 }
81 }
82 inp.clear();
83
1/2
✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
88 inp.insert(inp.begin(), negative.begin(), negative.end());
84
1/2
✓ Branch 0 taken 88 times.
✗ Branch 1 not taken.
88 inp.insert(inp.end(), positive.begin(), positive.end());
85 };
86
87 } // namespace mityaeva_radix
88