diff --git a/CMakeLists.txt b/CMakeLists.txt index 3407c4d..e85b23f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,7 @@ set(headers src/espcrc32builder.h src/esprandom.h src/espstrutils.h + src/futurecpp.h src/lockhelper.h src/lockingqueue.h src/recursivelockhelper.h diff --git a/src/futurecpp.h b/src/futurecpp.h new file mode 100644 index 0000000..bf2b514 --- /dev/null +++ b/src/futurecpp.h @@ -0,0 +1,29 @@ +#pragma once + +// system includes +#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