mirror of
https://github.com/esphome/esphome.git
synced 2026-10-07 03:16:37 +00:00
[core] Use __builtin_memcpy in Callback::create for cleaner code
Replace char-by-char loops with __builtin_memcpy in the inline Callback storage path. Generates identical code but is cleaner and avoids clang-analyzer false positives without NOLINT annotations.
This commit is contained in:
@@ -1752,15 +1752,10 @@ template<typename... Ts> struct Callback<void(Ts...)> {
|
|||||||
// creates objects of implicit-lifetime types (trivially copyable qualifies).
|
// creates objects of implicit-lifetime types (trivially copyable qualifies).
|
||||||
Callback cb;
|
Callback cb;
|
||||||
cb.ctx = nullptr;
|
cb.ctx = nullptr;
|
||||||
char *dst = reinterpret_cast<char *>(&cb.ctx); // NOLINT(clang-analyzer-core.uninitialized.Assign)
|
__builtin_memcpy(&cb.ctx, &callable, sizeof(DecayF));
|
||||||
const char *src = reinterpret_cast<const char *>(&callable); // NOLINT(clang-analyzer-core.uninitialized.Assign)
|
|
||||||
for (size_t i = 0; i < sizeof(DecayF); ++i)
|
|
||||||
dst[i] = src[i]; // NOLINT(clang-analyzer-core.uninitialized.Assign)
|
|
||||||
cb.fn = [](void *c, Ts... args) {
|
cb.fn = [](void *c, Ts... args) {
|
||||||
alignas(DecayF) char buf[sizeof(DecayF)];
|
alignas(DecayF) char buf[sizeof(DecayF)];
|
||||||
const char *csrc = reinterpret_cast<const char *>(&c); // NOLINT(clang-analyzer-core.uninitialized.Assign)
|
__builtin_memcpy(buf, &c, sizeof(DecayF));
|
||||||
for (size_t i = 0; i < sizeof(DecayF); ++i)
|
|
||||||
buf[i] = csrc[i]; // NOLINT(clang-analyzer-core.uninitialized.Assign)
|
|
||||||
reinterpret_cast<DecayF *>(buf)->operator()(args...);
|
reinterpret_cast<DecayF *>(buf)->operator()(args...);
|
||||||
};
|
};
|
||||||
return cb;
|
return cb;
|
||||||
|
|||||||
Reference in New Issue
Block a user