GCC Code Coverage Report


Directory: ./
File: firmware/libfirmware/util/include/rusefi/arrays.h
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 89.2% 181 0 203
Functions: 89.4% 59 0 66
Branches: 92.6% 50 0 54
Decisions: 83.3% 10 - 12

Line Branch Decision Exec Source
1 #pragma once
2
3 #include <cstddef>
4 #include <cstring>
5
6 #include "scaled_channel.h"
7 #include "critical_error.h"
8
9 /**
10 * Copies an array from src to dest. The lengths of the arrays must match.
11 */
12 template <typename DElement, typename SElement, size_t N>
13 23005 constexpr void copyArray(DElement (&dest)[N], const SElement (&src)[N]) {
14
48/52
void copyArray<unsigned short, float, 16ul>(unsigned short (&) [16ul], float const (&) [16ul]):
✓ Branch 0 taken 10128 times.
✓ Branch 1 taken 633 times.
void copyArray<scaled_channel<unsigned char, 1, 20>, float, 16ul>(scaled_channel<unsigned char, 1, 20> (&) [16ul], float const (&) [16ul]):
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 15 times.
void copyArray<scaled_channel<short, 1, 1>, float, 16ul>(scaled_channel<short, 1, 1> (&) [16ul], float const (&) [16ul]):
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 15 times.
void copyArray<scaled_channel<unsigned char, 2, 1>, float, 16ul>(scaled_channel<unsigned char, 2, 1> (&) [16ul], float const (&) [16ul]):
✓ Branch 0 taken 9616 times.
✓ Branch 1 taken 601 times.
void copyArray<scaled_channel<unsigned char, 1, 100>, float, 16ul>(scaled_channel<unsigned char, 1, 100> (&) [16ul], float const (&) [16ul]):
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 15 times.
void copyArray<scaled_channel<short, 1, 1>, int, 4ul>(scaled_channel<short, 1, 1> (&) [4ul], int const (&) [4ul]):
✓ Branch 0 taken 2348 times.
✓ Branch 1 taken 587 times.
void copyArray<unsigned short, float, 8ul>(unsigned short (&) [8ul], float const (&) [8ul]):
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 16 times.
void copyArray<scaled_channel<unsigned int, 10, 1>, float, 2ul>(scaled_channel<unsigned int, 10, 1> (&) [2ul], float const (&) [2ul]):
✓ Branch 0 taken 2362 times.
✓ Branch 1 taken 1181 times.
void copyArray<scaled_channel<short, 100, 1>, float, 8ul>(scaled_channel<short, 100, 1> (&) [8ul], float const (&) [8ul]):
✓ Branch 0 taken 14136 times.
✓ Branch 1 taken 1767 times.
void copyArray<scaled_channel<int, 10, 1>, int, 2ul>(scaled_channel<int, 10, 1> (&) [2ul], int const (&) [2ul]):
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
void copyArray<unsigned short, int, 4ul>(unsigned short (&) [4ul], int const (&) [4ul]):
✓ Branch 0 taken 9380 times.
✓ Branch 1 taken 2345 times.
void copyArray<scaled_channel<unsigned char, 1, 100>, float, 8ul>(scaled_channel<unsigned char, 1, 100> (&) [8ul], float const (&) [8ul]):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void copyArray<scaled_channel<unsigned char, 50, 1>, float, 8ul>(scaled_channel<unsigned char, 50, 1> (&) [8ul], float const (&) [8ul]):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void copyArray<scaled_channel<unsigned short, 100, 1>, float, 8ul>(scaled_channel<unsigned short, 100, 1> (&) [8ul], float const (&) [8ul]):
✓ Branch 0 taken 4688 times.
✓ Branch 1 taken 586 times.
void copyArray<unsigned short, float, 4ul>(unsigned short (&) [4ul], float const (&) [4ul]):
✓ Branch 0 taken 2344 times.
✓ Branch 1 taken 586 times.
void copyArray<signed char, float, 8ul>(signed char (&) [8ul], float const (&) [8ul]):
✓ Branch 0 taken 4688 times.
✓ Branch 1 taken 586 times.
void copyArray<scaled_channel<unsigned char, 1, 5>, unsigned short, 8ul>(scaled_channel<unsigned char, 1, 5> (&) [8ul], unsigned short const (&) [8ul]):
✓ Branch 0 taken 4688 times.
✓ Branch 1 taken 586 times.
void copyArray<scaled_channel<short, 1, 1>, signed char, 8ul>(scaled_channel<short, 1, 1> (&) [8ul], signed char const (&) [8ul]):
✓ Branch 0 taken 4688 times.
✓ Branch 1 taken 586 times.
void copyArray<scaled_channel<unsigned char, 100, 1>, float, 8ul>(scaled_channel<unsigned char, 100, 1> (&) [8ul], float const (&) [8ul]):
✓ Branch 0 taken 18752 times.
✓ Branch 1 taken 2344 times.
void copyArray<unsigned short, unsigned char, 16ul>(unsigned short (&) [16ul], unsigned char const (&) [16ul]):
✓ Branch 0 taken 112 times.
✓ Branch 1 taken 7 times.
void copyArray<scaled_channel<signed char, 10, 1>, int, 4ul>(scaled_channel<signed char, 10, 1> (&) [4ul], int const (&) [4ul]):
✓ Branch 0 taken 9376 times.
✓ Branch 1 taken 2344 times.
void copyArray<scaled_channel<short, 10, 1>, double, 5ul>(scaled_channel<short, 10, 1> (&) [5ul], double const (&) [5ul]):
✓ Branch 0 taken 14650 times.
✓ Branch 1 taken 2930 times.
void copyArray<scaled_channel<short, 10, 1>, double, 8ul>(scaled_channel<short, 10, 1> (&) [8ul], double const (&) [8ul]):
✓ Branch 0 taken 28128 times.
✓ Branch 1 taken 3516 times.
void copyArray<signed char, int, 8ul>(signed char (&) [8ul], int const (&) [8ul]):
✓ Branch 0 taken 4688 times.
✓ Branch 1 taken 586 times.
void copyArray<scaled_channel<unsigned char, 1, 20>, int, 16ul>(scaled_channel<unsigned char, 1, 20> (&) [16ul], int const (&) [16ul]):
✓ Branch 0 taken 9376 times.
✓ Branch 1 taken 586 times.
void copyArray<scaled_channel<short, 1, 1>, int, 16ul>(scaled_channel<short, 1, 1> (&) [16ul], int const (&) [16ul]):
✓ Branch 0 taken 9376 times.
✓ Branch 1 taken 586 times.
8/10
void copyArray<unsigned short, float, 16ul>(unsigned short (&) [16ul], float const (&) [16ul]):
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
void copyArray<scaled_channel<unsigned char, 2, 1>, float, 16ul>(scaled_channel<unsigned char, 2, 1> (&) [16ul], float const (&) [16ul]):
✓ Decision 'true' taken 9616 times.
✓ Decision 'false' taken 601 times.
void copyArray<scaled_channel<short, 1, 1>, int, 4ul>(scaled_channel<short, 1, 1> (&) [4ul], int const (&) [4ul]):
✓ Decision 'true' taken 2348 times.
✓ Decision 'false' taken 587 times.
void copyArray<scaled_channel<int, 10, 1>, int, 2ul>(scaled_channel<int, 10, 1> (&) [2ul], int const (&) [2ul]):
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 1 time.
void copyArray<unsigned short, unsigned char, 16ul>(unsigned short (&) [16ul], unsigned char const (&) [16ul]):
✓ Decision 'true' taken 112 times.
✓ Decision 'false' taken 7 times.
187379 for (size_t i = 0; i < N; i++) {
15 164374 dest[i] = src[i];
16 }
17 23005 }
18
19 // specialization that can use memcpy when src and dest types match
20 template <typename DElement, size_t N>
21 constexpr void copyArray(scaled_channel<DElement, 1, 1> (&dest)[N], const DElement (&src)[N]) {
22 memcpy(dest, src, sizeof(DElement) * N);
23 }
24
25 template <typename DElement, size_t N>
26 3549 constexpr void copyArray(DElement (&dest)[N], const DElement (&src)[N]) {
27 3549 memcpy(dest, src, sizeof(DElement) * N);
28 3549 }
29
30 /**
31 * Copies an array from src to the beginning of dst. If dst is larger
32 * than src, then only the elements copied from src will be touched.
33 * Any remaining elements at the end will be untouched.
34 */
35 template <typename TElement, size_t NSrc, size_t NDest>
36 1 constexpr void copyArrayPartial(TElement (&dest)[NDest], const TElement (&src)[NSrc]) {
37 static_assert(NDest >= NSrc, "Source array must be larger than destination.");
38
39
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 1 time.
3 for (size_t i = 0; i < NSrc; i++) {
40 2 dest[i] = src[i];
41 }
42 1 }
43
44 namespace efi
45 {
46 template <typename T, size_t N>
47 439082514 constexpr size_t size(const T(&)[N]) {
48 439082514 return N;
49 }
50
51 // Zero the passed object
52 template <typename T>
53 586 constexpr void clear(T* obj) {
54 #ifdef WE_HAVE_CRITICAL_ERROR_METHOD
55 if (obj == nullptr) {
56 efiCriticalError("clear nullptr");
57 return;
58 }
59 #endif // WE_HAVE_CRITICAL_ERROR_METHOD
60 // The cast to void* is to prevent errors like:
61 // clearing an object of non-trivial type 'struct persistent_config_s'; use assignment or value-initialization instead
62 // This is technically wrong, but we know config objects only ever actually
63 // contain integral types, though they may be wrapped in a scaled_channel
64 586 memset(reinterpret_cast<void*>(obj), 0, sizeof(T));
65 586 }
66
67 template <typename T>
68 constexpr void clear(T& obj) {
69 clear(&obj);
70 }
71 } // namespace efi
72