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 |