KleidiCV Coverage Report


Directory: ./
File: kleidicv/include/kleidicv/workspace/border_7x7.h
Date: 2025-09-25 14:13:34
Exec Total Coverage
Lines: 68 68 100.0%
Functions: 294 294 100.0%
Branches: 308 322 95.7%

Line Branch Exec Source
1 // SPDX-FileCopyrightText: 2024 - 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_7X7_H
6 #define KLEIDICV_WORKSPACE_BORDER_7X7_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 7x7 filters.
18 template <typename T>
19 class FixedBorderInfo<T, 7UL> 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 109152 Offsets(ptrdiff_t o0, ptrdiff_t o1, ptrdiff_t o2, ptrdiff_t o3,
29 ptrdiff_t o4, ptrdiff_t o5, ptrdiff_t o6)
30 109152 : offsets_{o0, o1, o2, o3, o4, o5, o6} {}
31
32 2665760 ptrdiff_t c0() const { return offsets_[0]; }
33 2665760 ptrdiff_t c1() const { return offsets_[1]; }
34 2665760 ptrdiff_t c2() const { return offsets_[2]; }
35 2665760 ptrdiff_t c3() const { return offsets_[3]; }
36 2665760 ptrdiff_t c4() const { return offsets_[4]; }
37 2665760 ptrdiff_t c5() const { return offsets_[5]; }
38 2665760 ptrdiff_t c6() const { return offsets_[6]; }
39
40 private:
41 ptrdiff_t offsets_[7];
42 };
43
44 3252 FixedBorderInfo(size_t height, FixedBorderType border_type)
45 3252 : height_(height), border_type_(border_type) {}
46
47 // Returns offsets without the influence of any border.
48 17748 Offsets offsets_without_border() const KLEIDICV_STREAMING {
49 17748 return get(-3, -2, -1, 0, 1, 2, 3);
50 }
51
52 // Returns offsets for columns affected by left border.
53 45702 Offsets offsets_with_left_border(size_t column_index) const
54 KLEIDICV_STREAMING {
55
28/35
✗ Branch 0 not taken.
✓ Branch 1 taken 1854 times.
✓ Branch 2 taken 1854 times.
✓ Branch 3 taken 1854 times.
✓ Branch 4 taken 1980 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4140 times.
✓ Branch 7 taken 1080 times.
✓ Branch 8 taken 1080 times.
✓ Branch 9 taken 1080 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 4140 times.
✓ Branch 12 taken 1080 times.
✓ Branch 13 taken 1080 times.
✓ Branch 14 taken 1080 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 4140 times.
✓ Branch 17 taken 1080 times.
✓ Branch 18 taken 1080 times.
✓ Branch 19 taken 1080 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1080 times.
✓ Branch 22 taken 1080 times.
✓ Branch 23 taken 1080 times.
✓ Branch 24 taken 1080 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1080 times.
✓ Branch 27 taken 1080 times.
✓ Branch 28 taken 1080 times.
✓ Branch 29 taken 1080 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 4140 times.
✓ Branch 32 taken 1080 times.
✓ Branch 33 taken 1080 times.
✓ Branch 34 taken 1080 times.
45702 switch (border_type_) {
56 case FixedBorderType::REPLICATE:
57
14/14
✓ Branch 0 taken 1236 times.
✓ Branch 1 taken 618 times.
✓ Branch 2 taken 2760 times.
✓ Branch 3 taken 1380 times.
✓ Branch 4 taken 2760 times.
✓ Branch 5 taken 1380 times.
✓ Branch 6 taken 2760 times.
✓ Branch 7 taken 1380 times.
✓ Branch 8 taken 720 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 720 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 2760 times.
✓ Branch 13 taken 1380 times.
20574 if (column_index == 0) {
58 6858 return get(0, 0, 0, 0, 1, 2, 3);
59
14/14
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 618 times.
✓ Branch 2 taken 1380 times.
✓ Branch 3 taken 1380 times.
✓ Branch 4 taken 1380 times.
✓ Branch 5 taken 1380 times.
✓ Branch 6 taken 1380 times.
✓ Branch 7 taken 1380 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 1380 times.
✓ Branch 13 taken 1380 times.
13716 } else if (column_index == 1) {
60 6858 return get(-1, -1, -1, 0, 1, 2, 3);
61 } else {
62 6858 return get(-2, -2, -1, 0, 1, 2, 3);
63 }
64 break;
65
66 case FixedBorderType::REFLECT:
67
14/14
✓ Branch 0 taken 1236 times.
✓ Branch 1 taken 618 times.
✓ Branch 2 taken 720 times.
✓ Branch 3 taken 360 times.
✓ Branch 4 taken 720 times.
✓ Branch 5 taken 360 times.
✓ Branch 6 taken 720 times.
✓ Branch 7 taken 360 times.
✓ Branch 8 taken 720 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 720 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 720 times.
✓ Branch 13 taken 360 times.
8334 if (column_index == 0) {
68 2778 return get(2, 1, 0, 0, 1, 2, 3);
69
14/14
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 618 times.
✓ Branch 2 taken 360 times.
✓ Branch 3 taken 360 times.
✓ Branch 4 taken 360 times.
✓ Branch 5 taken 360 times.
✓ Branch 6 taken 360 times.
✓ Branch 7 taken 360 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 360 times.
✓ Branch 13 taken 360 times.
5556 } else if (column_index == 1) {
70 2778 return get(0, -1, -1, 0, 1, 2, 3);
71 } else {
72 2778 return get(-2, -2, -1, 0, 1, 2, 3);
73 }
74 break;
75
76 case FixedBorderType::WRAP:
77
14/14
✓ Branch 0 taken 1236 times.
✓ Branch 1 taken 618 times.
✓ Branch 2 taken 720 times.
✓ Branch 3 taken 360 times.
✓ Branch 4 taken 720 times.
✓ Branch 5 taken 360 times.
✓ Branch 6 taken 720 times.
✓ Branch 7 taken 360 times.
✓ Branch 8 taken 720 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 720 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 720 times.
✓ Branch 13 taken 360 times.
8334 if (column_index == 0) {
78 2778 return get(height_ - 3, height_ - 2, height_ - 1, 0, 1, 2, 3);
79
14/14
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 618 times.
✓ Branch 2 taken 360 times.
✓ Branch 3 taken 360 times.
✓ Branch 4 taken 360 times.
✓ Branch 5 taken 360 times.
✓ Branch 6 taken 360 times.
✓ Branch 7 taken 360 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 360 times.
✓ Branch 13 taken 360 times.
5556 } else if (column_index == 1) {
80 2778 return get(height_ - 3, height_ - 2, -1, 0, 1, 2, 3);
81 } else {
82 2778 return get(height_ - 3, -2, -1, 0, 1, 2, 3);
83 }
84 break;
85
86 case FixedBorderType::REVERSE:
87
14/14
✓ Branch 0 taken 1320 times.
✓ Branch 1 taken 660 times.
✓ Branch 2 taken 720 times.
✓ Branch 3 taken 360 times.
✓ Branch 4 taken 720 times.
✓ Branch 5 taken 360 times.
✓ Branch 6 taken 720 times.
✓ Branch 7 taken 360 times.
✓ Branch 8 taken 720 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 720 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 720 times.
✓ Branch 13 taken 360 times.
8460 if (column_index == 0) {
88 2820 return get(3, 2, 1, 0, 1, 2, 3);
89
14/14
✓ Branch 0 taken 660 times.
✓ Branch 1 taken 660 times.
✓ Branch 2 taken 360 times.
✓ Branch 3 taken 360 times.
✓ Branch 4 taken 360 times.
✓ Branch 5 taken 360 times.
✓ Branch 6 taken 360 times.
✓ Branch 7 taken 360 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 360 times.
✓ Branch 13 taken 360 times.
5640 } else if (column_index == 1) {
90 2820 return get(1, 0, -1, 0, 1, 2, 3);
91 } else {
92 2820 return get(-1, -2, -1, 0, 1, 2, 3);
93 }
94 break;
95 }
96 // Unreachable. Compiler should emit a warning-as-error if any cases are
97 // uncovered above.
98 return Offsets{}; // GCOVR_EXCL_LINE
99 45702 }
100
101 // Returns offsets for columns affected by right border.
102 45702 Offsets offsets_with_right_border(size_t column_index) const
103 KLEIDICV_STREAMING {
104
28/35
✗ Branch 0 not taken.
✓ Branch 1 taken 1854 times.
✓ Branch 2 taken 1854 times.
✓ Branch 3 taken 1854 times.
✓ Branch 4 taken 1980 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4140 times.
✓ Branch 7 taken 1080 times.
✓ Branch 8 taken 1080 times.
✓ Branch 9 taken 1080 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 4140 times.
✓ Branch 12 taken 1080 times.
✓ Branch 13 taken 1080 times.
✓ Branch 14 taken 1080 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 4140 times.
✓ Branch 17 taken 1080 times.
✓ Branch 18 taken 1080 times.
✓ Branch 19 taken 1080 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1080 times.
✓ Branch 22 taken 1080 times.
✓ Branch 23 taken 1080 times.
✓ Branch 24 taken 1080 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1080 times.
✓ Branch 27 taken 1080 times.
✓ Branch 28 taken 1080 times.
✓ Branch 29 taken 1080 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 4140 times.
✓ Branch 32 taken 1080 times.
✓ Branch 33 taken 1080 times.
✓ Branch 34 taken 1080 times.
45702 switch (border_type_) {
105 case FixedBorderType::REPLICATE:
106
14/14
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 1236 times.
✓ Branch 2 taken 1380 times.
✓ Branch 3 taken 2760 times.
✓ Branch 4 taken 1380 times.
✓ Branch 5 taken 2760 times.
✓ Branch 6 taken 1380 times.
✓ Branch 7 taken 2760 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 720 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 720 times.
✓ Branch 12 taken 1380 times.
✓ Branch 13 taken 2760 times.
20574 if (column_index == (height_ - 3)) {
107 6858 return get(-3, -2, -1, 0, 1, 2, 2);
108
14/14
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 618 times.
✓ Branch 2 taken 1380 times.
✓ Branch 3 taken 1380 times.
✓ Branch 4 taken 1380 times.
✓ Branch 5 taken 1380 times.
✓ Branch 6 taken 1380 times.
✓ Branch 7 taken 1380 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 1380 times.
✓ Branch 13 taken 1380 times.
13716 } else if (column_index == (height_ - 2)) {
109 6858 return get(-3, -2, -1, 0, 1, 1, 1);
110 } else {
111 6858 return get(-3, -2, -1, 0, 0, 0, 0);
112 }
113 break;
114
115 case FixedBorderType::REFLECT:
116
14/14
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 1236 times.
✓ Branch 2 taken 360 times.
✓ Branch 3 taken 720 times.
✓ Branch 4 taken 360 times.
✓ Branch 5 taken 720 times.
✓ Branch 6 taken 360 times.
✓ Branch 7 taken 720 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 720 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 720 times.
✓ Branch 12 taken 360 times.
✓ Branch 13 taken 720 times.
8334 if (column_index == (height_ - 3)) {
117 2778 return get(-3, -2, -1, 0, 1, 2, 2);
118
14/14
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 618 times.
✓ Branch 2 taken 360 times.
✓ Branch 3 taken 360 times.
✓ Branch 4 taken 360 times.
✓ Branch 5 taken 360 times.
✓ Branch 6 taken 360 times.
✓ Branch 7 taken 360 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 360 times.
✓ Branch 13 taken 360 times.
5556 } else if (column_index == (height_ - 2)) {
119 2778 return get(-3, -2, -1, 0, 1, 1, 0);
120 } else {
121 2778 return get(-3, -2, -1, 0, 0, -1, -2);
122 }
123 break;
124
125 case FixedBorderType::WRAP:
126
14/14
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 1236 times.
✓ Branch 2 taken 360 times.
✓ Branch 3 taken 720 times.
✓ Branch 4 taken 360 times.
✓ Branch 5 taken 720 times.
✓ Branch 6 taken 360 times.
✓ Branch 7 taken 720 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 720 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 720 times.
✓ Branch 12 taken 360 times.
✓ Branch 13 taken 720 times.
8334 if (column_index == (height_ - 3)) {
127 2778 return get(-3, -2, -1, 0, 1, 2, 3 - height_);
128
14/14
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 618 times.
✓ Branch 2 taken 360 times.
✓ Branch 3 taken 360 times.
✓ Branch 4 taken 360 times.
✓ Branch 5 taken 360 times.
✓ Branch 6 taken 360 times.
✓ Branch 7 taken 360 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 360 times.
✓ Branch 13 taken 360 times.
5556 } else if (column_index == (height_ - 2)) {
129 2778 return get(-3, -2, -1, 0, 1, 2 - height_, 3 - height_);
130 } else {
131 2778 return get(-3, -2, -1, 0, 1 - height_, 2 - height_, 3 - height_);
132 }
133 break;
134
135 case FixedBorderType::REVERSE:
136
14/14
✓ Branch 0 taken 660 times.
✓ Branch 1 taken 1320 times.
✓ Branch 2 taken 360 times.
✓ Branch 3 taken 720 times.
✓ Branch 4 taken 360 times.
✓ Branch 5 taken 720 times.
✓ Branch 6 taken 360 times.
✓ Branch 7 taken 720 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 720 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 720 times.
✓ Branch 12 taken 360 times.
✓ Branch 13 taken 720 times.
8460 if (column_index == (height_ - 3)) {
137 2820 return get(-3, -2, -1, 0, 1, 2, 1);
138
14/14
✓ Branch 0 taken 660 times.
✓ Branch 1 taken 660 times.
✓ Branch 2 taken 360 times.
✓ Branch 3 taken 360 times.
✓ Branch 4 taken 360 times.
✓ Branch 5 taken 360 times.
✓ Branch 6 taken 360 times.
✓ Branch 7 taken 360 times.
✓ Branch 8 taken 360 times.
✓ Branch 9 taken 360 times.
✓ Branch 10 taken 360 times.
✓ Branch 11 taken 360 times.
✓ Branch 12 taken 360 times.
✓ Branch 13 taken 360 times.
5640 } else if (column_index == (height_ - 2)) {
139 2820 return get(-3, -2, -1, 0, 1, 0, -1);
140 } else {
141 2820 return get(-3, -2, -1, 0, -1, -2, -3);
142 }
143 break;
144 }
145 // Unreachable. Compiler should emit a warning-as-error if any cases are
146 // uncovered above.
147 return Offsets{}; // GCOVR_EXCL_LINE
148 45702 }
149
150 // Returns offsets for rows or columns affected by any border.
151 13644 Offsets offsets_with_border(size_t row_or_column_index) const
152 KLEIDICV_STREAMING {
153
14/14
✓ Branch 0 taken 1026 times.
✓ Branch 1 taken 1146 times.
✓ Branch 2 taken 648 times.
✓ Branch 3 taken 1596 times.
✓ Branch 4 taken 648 times.
✓ Branch 5 taken 1596 times.
✓ Branch 6 taken 648 times.
✓ Branch 7 taken 1596 times.
✓ Branch 8 taken 576 times.
✓ Branch 9 taken 672 times.
✓ Branch 10 taken 576 times.
✓ Branch 11 taken 672 times.
✓ Branch 12 taken 648 times.
✓ Branch 13 taken 1596 times.
13644 if (row_or_column_index <= 2U) {
154 // Rows and columns have the same offsets.
155 4770 return offsets_with_left_border(row_or_column_index);
156 }
157
14/14
✓ Branch 0 taken 1026 times.
✓ Branch 1 taken 120 times.
✓ Branch 2 taken 648 times.
✓ Branch 3 taken 948 times.
✓ Branch 4 taken 648 times.
✓ Branch 5 taken 948 times.
✓ Branch 6 taken 648 times.
✓ Branch 7 taken 948 times.
✓ Branch 8 taken 576 times.
✓ Branch 9 taken 96 times.
✓ Branch 10 taken 576 times.
✓ Branch 11 taken 96 times.
✓ Branch 12 taken 648 times.
✓ Branch 13 taken 948 times.
8874 if (row_or_column_index >= (height_ - 3U)) {
158 // Rows and columns have the same offsets.
159 4770 return offsets_with_right_border(row_or_column_index);
160 }
161 4104 return offsets_without_border();
162 13644 }
163
164 private:
165 // Takes care of static signed to unsigned casts.
166 109152 Offsets get(ptrdiff_t o0, ptrdiff_t o1, ptrdiff_t o2, ptrdiff_t o3,
167 ptrdiff_t o4, ptrdiff_t o5,
168 ptrdiff_t o6) const KLEIDICV_STREAMING {
169 109152 return Offsets{o0, o1, o2, o3, o4, o5, o6};
170 }
171
172 size_t height_;
173 FixedBorderType border_type_;
174 }; // end of class FixedBorderInfo<T, 7UL>
175
176 // Shorthand for 7x7 filter border type.
177 template <typename T>
178 using FixedBorderInfo7x7 = FixedBorderInfo<T, 7UL>;
179
180 } // namespace KLEIDICV_TARGET_NAMESPACE
181
182 #endif // KLEIDICV_WORKSPACE_BORDER_7X7_H
183