diff --git a/include/transmute.hpp b/include/transmute.hpp new file mode 100644 index 0000000..a5fd976 --- /dev/null +++ b/include/transmute.hpp @@ -0,0 +1,65 @@ +#pragma once + +#include + +namespace util { + +template +struct copy_const : std::type_identity {}; + +template +struct copy_const : std::type_identity {}; + +template +using copy_const_t = typename copy_const::type; + +template +struct copy_volatile : std::type_identity {}; + +template +struct copy_volatile : std::type_identity {}; + +template +using copy_volatile_t = typename copy_volatile::type; + +template +struct copy_cv : std::type_identity>> { +}; + +template +using copy_cv_t = typename copy_cv::type; + +template +struct copy_reference : std::type_identity {}; +template +struct copy_reference + : std::type_identity> {}; +template +struct copy_reference + : std::type_identity> {}; + +template +using copy_reference_t = typename copy_reference::type; + +template +using copy_cvref_t = copy_reference_t< + T1, copy_reference_t, T2>>>; + +template +constexpr inline auto transmute(auto &&t1) -> copy_cvref_t { + return std::forward>( + reinterpret_cast>(t1)); +} + +template +constexpr inline auto transmute(auto &t1) -> copy_cvref_t { + return std::forward>( + reinterpret_cast>(t1)); +} + +template +constexpr inline auto transmute(T1 t1) -> T2 { + return std::forward(reinterpret_cast(t1)); +} + +} // namespace util \ No newline at end of file