ClickHouse/base/ext/bit_cast.h

31 lines
897 B
C++
Raw Normal View History

2015-11-06 14:49:24 +00:00
#pragma once
#include <string.h>
#include <algorithm>
2015-11-06 14:49:24 +00:00
#include <type_traits>
namespace ext
{
/** \brief Returns value `from` converted to type `To` while retaining bit representation.
2017-06-21 17:16:24 +00:00
* `To` and `From` must satisfy `CopyConstructible`.
*/
template <typename To, typename From>
std::decay_t<To> bit_cast(const From & from)
{
2017-06-21 17:16:24 +00:00
To res {};
memcpy(static_cast<void*>(&res), &from, std::min(sizeof(res), sizeof(from)));
2017-06-21 17:16:24 +00:00
return res;
}
/** \brief Returns value `from` converted to type `To` while retaining bit representation.
2017-06-21 17:16:24 +00:00
* `To` and `From` must satisfy `CopyConstructible`.
*/
template <typename To, typename From>
std::decay_t<To> safe_bit_cast(const From & from)
{
static_assert(sizeof(To) == sizeof(From), "bit cast on types of different width");
2017-06-21 17:16:24 +00:00
return bit_cast<To, From>(from);
}
2015-11-06 14:49:24 +00:00
}