KleidiCV Coverage Report


Directory: ./
File: kleidicv/include/kleidicv/workspace/border_5x5.h
Date: 2025-09-25 14:13:34
Exec Total Coverage
Lines: 50 50 100.0%
Functions: 252 252 100.0%
Branches: 196 210 93.3%

Line Branch Exec Source
1 // SPDX-FileCopyrightText: 2023 - 2025 Arm Limited and/or its affiliates <open-source-office@arm.com>
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 #ifndef KLEIDICV_WORKSPACE_BORDER_5X5_H
6 #define KLEIDICV_WORKSPACE_BORDER_5X5_H
7
8 #include "border_types.h"
9 #include "kleidicv/kleidicv.h"
10
11 namespace KLEIDICV_TARGET_NAMESPACE {
12
13 // Border offsets for fixed-size filters.
14 template <typename T, const size_t S>
15 class FixedBorderInfo;
16
17 // Border offsets for 5x5 filters.
18 template <typename T>
19 class FixedBorderInfo<T, 5UL> final {
20 public:
21 // Simple object holding read-only constant offsets.
22 class Offsets final {
23 public:
24 // NOLINTBEGIN(hicpp-member-init)
25 Offsets() = default;
26 // NOLINTEND(hicpp-member-init)
27
28 129882 Offsets(ptrdiff_t o0, ptrdiff_t o1, ptrdiff_t o2, ptrdiff_t o3,
29 ptrdiff_t o4)
30 129882 : offsets_{o0, o1, o2, o3, o4} {}
31
32 1266044 ptrdiff_t c0() const { return offsets_[0]; }
33 1266044 ptrdiff_t c1() const { return offsets_[1]; }
34 1266044 ptrdiff_t c2() const { return offsets_[2]; }
35 1266044 ptrdiff_t c3() const { return offsets_[3]; }
36 1266044 ptrdiff_t c4() const { return offsets_[4]; }
37
38 private:
39 ptrdiff_t offsets_[5];
40 };
41
42 4854 FixedBorderInfo(size_t height, FixedBorderType border_type)
43 4854 : height_(height), border_type_(border_type) {}
44
45 // Returns offsets without the influence of any border.
46 35106 Offsets offsets_without_border() const KLEIDICV_STREAMING {
47 35106 return get(-2, -1, 0, 1, 2);
48 }
49
50 // Returns offsets for columns affected by left border.
51 47388 Offsets offsets_with_left_border(size_t column_index) const
52 KLEIDICV_STREAMING {
53
28/35
✗ Branch 0 not taken.
✓ Branch 1 taken 8718 times.
✓ Branch 2 taken 1290 times.
✓ Branch 3 taken 1290 times.
✓ Branch 4 taken 1350 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 7434 times.
✓ Branch 7 taken 774 times.
✓ Branch 8 taken 774 times.
✓ Branch 9 taken 774 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 7398 times.
✓ Branch 12 taken 774 times.
✓ Branch 13 taken 774 times.
✓ Branch 14 taken 774 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3804 times.
✓ Branch 17 taken 528 times.
✓ Branch 18 taken 528 times.
✓ Branch 19 taken 528 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 660 times.
✓ Branch 22 taken 528 times.
✓ Branch 23 taken 528 times.
✓ Branch 24 taken 528 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 660 times.
✓ Branch 27 taken 528 times.
✓ Branch 28 taken 528 times.
✓ Branch 29 taken 528 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3804 times.
✓ Branch 32 taken 528 times.
✓ Branch 33 taken 528 times.
✓ Branch 34 taken 528 times.
47388 switch (border_type_) {
54 case FixedBorderType::REPLICATE:
55
14/14
✓ Branch 0 taken 3876 times.
✓ Branch 1 taken 4842 times.
✓ Branch 2 taken 3717 times.
✓ Branch 3 taken 3717 times.
✓ Branch 4 taken 3699 times.
✓ Branch 5 taken 3699 times.
✓ Branch 6 taken 1902 times.
✓ Branch 7 taken 1902 times.
✓ Branch 8 taken 330 times.
✓ Branch 9 taken 330 times.
✓ Branch 10 taken 330 times.
✓ Branch 11 taken 330 times.
✓ Branch 12 taken 1902 times.
✓ Branch 13 taken 1902 times.
32478 if (column_index == 0) {
56 16722 return get(0, 0, 0, 1, 2);
57 } else {
58 15756 return get(-1, -1, 0, 1, 2);
59 }
60 break;
61
62 case FixedBorderType::REFLECT:
63
14/14
✓ Branch 0 taken 573 times.
✓ Branch 1 taken 717 times.
✓ Branch 2 taken 387 times.
✓ Branch 3 taken 387 times.
✓ Branch 4 taken 387 times.
✓ Branch 5 taken 387 times.
✓ Branch 6 taken 264 times.
✓ Branch 7 taken 264 times.
✓ Branch 8 taken 264 times.
✓ Branch 9 taken 264 times.
✓ Branch 10 taken 264 times.
✓ Branch 11 taken 264 times.
✓ Branch 12 taken 264 times.
✓ Branch 13 taken 264 times.
4950 if (column_index == 0) {
64 2547 return get(1, 0, 0, 1, 2);
65 } else {
66 2403 return get(-1, -1, 0, 1, 2);
67 }
68 break;
69
70 case FixedBorderType::WRAP:
71
14/14
✓ Branch 0 taken 573 times.
✓ Branch 1 taken 717 times.
✓ Branch 2 taken 387 times.
✓ Branch 3 taken 387 times.
✓ Branch 4 taken 387 times.
✓ Branch 5 taken 387 times.
✓ Branch 6 taken 264 times.
✓ Branch 7 taken 264 times.
✓ Branch 8 taken 264 times.
✓ Branch 9 taken 264 times.
✓ Branch 10 taken 264 times.
✓ Branch 11 taken 264 times.
✓ Branch 12 taken 264 times.
✓ Branch 13 taken 264 times.
4950 if (column_index == 0) {
72 2547 return get(height_ - 2, height_ - 1, 0, 1, 2);
73 } else {
74 2403 return get(height_ - 2, -1, 0, 1, 2);
75 }
76 break;
77
78 case FixedBorderType::REVERSE:
79
14/14
✓ Branch 0 taken 603 times.
✓ Branch 1 taken 747 times.
✓ Branch 2 taken 387 times.
✓ Branch 3 taken 387 times.
✓ Branch 4 taken 387 times.
✓ Branch 5 taken 387 times.
✓ Branch 6 taken 264 times.
✓ Branch 7 taken 264 times.
✓ Branch 8 taken 264 times.
✓ Branch 9 taken 264 times.
✓ Branch 10 taken 264 times.
✓ Branch 11 taken 264 times.
✓ Branch 12 taken 264 times.
✓ Branch 13 taken 264 times.
5010 if (column_index == 0) {
80 2577 return get(2, 1, 0, 1, 2);
81 } else {
82 2433 return get(0, -1, 0, 1, 2);
83 }
84 break;
85 }
86 // Unreachable. Compiler should emit a warning-as-error if any cases are
87 // uncovered above.
88 return Offsets{}; // GCOVR_EXCL_LINE
89 47388 }
90
91 // Returns offsets for columns affected by right border.
92 47388 Offsets offsets_with_right_border(size_t column_index) const
93 KLEIDICV_STREAMING {
94
28/35
✗ Branch 0 not taken.
✓ Branch 1 taken 8718 times.
✓ Branch 2 taken 1290 times.
✓ Branch 3 taken 1290 times.
✓ Branch 4 taken 1350 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 7434 times.
✓ Branch 7 taken 774 times.
✓ Branch 8 taken 774 times.
✓ Branch 9 taken 774 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 7398 times.
✓ Branch 12 taken 774 times.
✓ Branch 13 taken 774 times.
✓ Branch 14 taken 774 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3804 times.
✓ Branch 17 taken 528 times.
✓ Branch 18 taken 528 times.
✓ Branch 19 taken 528 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 660 times.
✓ Branch 22 taken 528 times.
✓ Branch 23 taken 528 times.
✓ Branch 24 taken 528 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 660 times.
✓ Branch 27 taken 528 times.
✓ Branch 28 taken 528 times.
✓ Branch 29 taken 528 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3804 times.
✓ Branch 32 taken 528 times.
✓ Branch 33 taken 528 times.
✓ Branch 34 taken 528 times.
47388 switch (border_type_) {
95 case FixedBorderType::REPLICATE:
96
14/14
✓ Branch 0 taken 4794 times.
✓ Branch 1 taken 3924 times.
✓ Branch 2 taken 3717 times.
✓ Branch 3 taken 3717 times.
✓ Branch 4 taken 3699 times.
✓ Branch 5 taken 3699 times.
✓ Branch 6 taken 1902 times.
✓ Branch 7 taken 1902 times.
✓ Branch 8 taken 330 times.
✓ Branch 9 taken 330 times.
✓ Branch 10 taken 330 times.
✓ Branch 11 taken 330 times.
✓ Branch 12 taken 1902 times.
✓ Branch 13 taken 1902 times.
32478 if (column_index == (height_ - 2)) {
97 16674 return get(-2, -1, 0, 1, 1);
98 } else {
99 15804 return get(-2, -1, 0, 0, 0);
100 }
101 break;
102
103 case FixedBorderType::REFLECT:
104
14/14
✓ Branch 0 taken 687 times.
✓ Branch 1 taken 603 times.
✓ Branch 2 taken 387 times.
✓ Branch 3 taken 387 times.
✓ Branch 4 taken 387 times.
✓ Branch 5 taken 387 times.
✓ Branch 6 taken 264 times.
✓ Branch 7 taken 264 times.
✓ Branch 8 taken 264 times.
✓ Branch 9 taken 264 times.
✓ Branch 10 taken 264 times.
✓ Branch 11 taken 264 times.
✓ Branch 12 taken 264 times.
✓ Branch 13 taken 264 times.
4950 if (column_index == (height_ - 2)) {
105 2517 return get(-2, -1, 0, 1, 1);
106 } else {
107 2433 return get(-2, -1, 0, 0, -1);
108 }
109 break;
110
111 case FixedBorderType::WRAP:
112
14/14
✓ Branch 0 taken 687 times.
✓ Branch 1 taken 603 times.
✓ Branch 2 taken 387 times.
✓ Branch 3 taken 387 times.
✓ Branch 4 taken 387 times.
✓ Branch 5 taken 387 times.
✓ Branch 6 taken 264 times.
✓ Branch 7 taken 264 times.
✓ Branch 8 taken 264 times.
✓ Branch 9 taken 264 times.
✓ Branch 10 taken 264 times.
✓ Branch 11 taken 264 times.
✓ Branch 12 taken 264 times.
✓ Branch 13 taken 264 times.
4950 if (column_index == (height_ - 2)) {
113 2517 return get(-2, -1, 0, 1, 2 - height_);
114 } else {
115 2433 return get(-2, -1, 0, 1 - height_, 2 - height_);
116 }
117 break;
118
119 case FixedBorderType::REVERSE:
120
14/14
✓ Branch 0 taken 717 times.
✓ Branch 1 taken 633 times.
✓ Branch 2 taken 387 times.
✓ Branch 3 taken 387 times.
✓ Branch 4 taken 387 times.
✓ Branch 5 taken 387 times.
✓ Branch 6 taken 264 times.
✓ Branch 7 taken 264 times.
✓ Branch 8 taken 264 times.
✓ Branch 9 taken 264 times.
✓ Branch 10 taken 264 times.
✓ Branch 11 taken 264 times.
✓ Branch 12 taken 264 times.
✓ Branch 13 taken 264 times.
5010 if (column_index == (height_ - 2)) {
121 2547 return get(-2, -1, 0, 1, 0);
122 } else {
123 2463 return get(-2, -1, 0, -1, -2);
124 }
125 break;
126 }
127 // Unreachable. Compiler should emit a warning-as-error if any cases are
128 // uncovered above.
129 return Offsets{}; // GCOVR_EXCL_LINE
130 47388 }
131
132 // Returns offsets for rows or columns affected by any border.
133 22074 Offsets offsets_with_border(size_t row_or_column_index) const
134 KLEIDICV_STREAMING {
135
14/14
✓ Branch 0 taken 1203 times.
✓ Branch 1 taken 5160 times.
✓ Branch 2 taken 786 times.
✓ Branch 3 taken 3699 times.
✓ Branch 4 taken 780 times.
✓ Branch 5 taken 3690 times.
✓ Branch 6 taken 480 times.
✓ Branch 7 taken 1974 times.
✓ Branch 8 taken 396 times.
✓ Branch 9 taken 528 times.
✓ Branch 10 taken 396 times.
✓ Branch 11 taken 528 times.
✓ Branch 12 taken 480 times.
✓ Branch 13 taken 1974 times.
22074 if (row_or_column_index <= 1U) {
136 // Rows and columns have the same offsets.
137 4521 return offsets_with_left_border(row_or_column_index);
138 }
139
14/14
✓ Branch 0 taken 1203 times.
✓ Branch 1 taken 3957 times.
✓ Branch 2 taken 786 times.
✓ Branch 3 taken 2913 times.
✓ Branch 4 taken 780 times.
✓ Branch 5 taken 2910 times.
✓ Branch 6 taken 480 times.
✓ Branch 7 taken 1494 times.
✓ Branch 8 taken 396 times.
✓ Branch 9 taken 132 times.
✓ Branch 10 taken 396 times.
✓ Branch 11 taken 132 times.
✓ Branch 12 taken 480 times.
✓ Branch 13 taken 1494 times.
17553 if (row_or_column_index >= (height_ - 2U)) {
140 // Rows and columns have the same offsets.
141 4521 return offsets_with_right_border(row_or_column_index);
142 }
143 13032 return offsets_without_border();
144 22074 }
145
146 private:
147 // Takes care of static signed to unsigned casts.
148 129882 Offsets get(ptrdiff_t o0, ptrdiff_t o1, ptrdiff_t o2, ptrdiff_t o3,
149 ptrdiff_t o4) const KLEIDICV_STREAMING {
150 129882 return Offsets{o0, o1, o2, o3, o4};
151 }
152
153 size_t height_;
154 FixedBorderType border_type_;
155 }; // end of class FixedBorderInfo<T, 5UL>
156
157 // Shorthand for 5x5 filter border type.
158 template <typename T>
159 using FixedBorderInfo5x5 = FixedBorderInfo<T, 5UL>;
160
161 } // namespace KLEIDICV_TARGET_NAMESPACE
162
163 #endif // KLEIDICV_WORKSPACE_BORDER_5X5_H
164