#pragma once // system includes #include #include #include // C++20 backports (until espressif finally updates their aged compiler suite) namespace std { template typename std::enable_if_t< sizeof(To) == sizeof(From) && std::is_trivially_copyable_v && std::is_trivially_copyable_v, To> // constexpr support needs compiler magic bit_cast(const From& src) noexcept { static_assert(std::is_trivially_constructible_v, "This implementation additionally requires destination type to be trivially constructible"); To dst; std::memcpy(&dst, &src, sizeof(To)); return dst; } template {}>> constexpr std::underlying_type_t to_underlying(EnumT e) noexcept { return static_cast>(e); } } // namespace std