Implement std::bit_cast<>

Partial implementation of std::bit_cast from C++20.
Also fix most strict-aliasing rule break warnings (gcc).
This commit is contained in:
Nekotekina 2019-06-02 00:12:17 +03:00
parent 790962425c
commit dfd50d0185
24 changed files with 145 additions and 176 deletions

View file

@ -380,13 +380,12 @@ struct se_storage<T, 2, 2>
static inline u16 to(const T& src)
{
return swap(reinterpret_cast<const u16&>(src));
return swap(std::bit_cast<u16>(src));
}
static inline T from(u16 src)
{
const u16 result = swap(src);
return reinterpret_cast<const T&>(result);
return std::bit_cast<T, u16>(swap(src));
}
};
@ -406,13 +405,12 @@ struct se_storage<T, 4, 4>
static inline u32 to(const T& src)
{
return swap(reinterpret_cast<const u32&>(src));
return swap(std::bit_cast<u32>(src));
}
static inline T from(u32 src)
{
const u32 result = swap(src);
return reinterpret_cast<const T&>(result);
return std::bit_cast<T, u32>(swap(src));
}
};
@ -432,13 +430,12 @@ struct se_storage<T, 8, 8>
static inline u64 to(const T& src)
{
return swap(reinterpret_cast<const u64&>(src));
return swap(std::bit_cast<u64>(src));
}
static inline T from(u64 src)
{
const u64 result = swap(src);
return reinterpret_cast<const T&>(result);
return std::bit_cast<T, u64>(swap(src));
}
};
@ -454,13 +451,12 @@ struct se_storage<T, 16, 16>
static inline v128 to(const T& src)
{
return swap(reinterpret_cast<const v128&>(src));
return swap(std::bit_cast<v128>(src));
}
static inline T from(const v128& src)
{
const v128 result = swap(src);
return reinterpret_cast<const T&>(result);
return std::bit_cast<T, v128>(swap(src));
}
};
@ -524,33 +520,24 @@ class se_t<T, false, Align>
stype m_data;
static stype init(type value)
{
stype result;
std::memcpy(&result, &value, sizeof(result));
return result;
}
public:
se_t() = default;
se_t(type value)
: m_data(init(value))
: m_data(std::bit_cast<stype>(value))
{
}
type value() const
{
type result;
std::memcpy(&result, &m_data, sizeof(result));
return result;
return std::bit_cast<type>(m_data);
}
se_t& operator=(const se_t& value) = default;
se_t& operator=(type value)
{
std::memcpy(&m_data, &value, sizeof(m_data));
m_data = std::bit_cast<stype>(value);
return *this;
}