diff --git a/util/include/rusefi/arrays.h b/util/include/rusefi/arrays.h index 6ca4d89..fe0941e 100644 --- a/util/include/rusefi/arrays.h +++ b/util/include/rusefi/arrays.h @@ -39,3 +39,26 @@ constexpr void copyArrayPartial(TElement (&dest)[NDest], const TElement (&src)[N dest[i] = src[i]; } } + +namespace efi +{ +template +constexpr size_t size(const T(&)[N]) { + return N; +} + +// Zero the passed object +template +constexpr void clear(T* obj) { + // The cast to void* is to prevent errors like: + // clearing an object of non-trivial type 'struct persistent_config_s'; use assignment or value-initialization instead + // This is technically wrong, but we know config objects only ever actually + // contain integral types, though they may be wrapped in a scaled_channel + memset(reinterpret_cast(obj), 0, sizeof(T)); +} + +template +constexpr void clear(T& obj) { + clear(&obj); +} +} // namespace efi