#include <iostream>
#include <cstring>
template <typename T, typename PtrType>
class BitReinterpretType
{
public:
explicit BitReinterpretType(PtrType* ptr) : m_ptr(ptr) {}
inline const T& operator=(const T& source)
{
std::memcpy(m_ptr, &source, sizeof(source));
return source;
}
inline operator T() const
{
T result;
std::memcpy(&result, m_ptr, sizeof(result));
return result;
}
private:
PtrType* m_ptr;
};
template <typename T, typename PtrType>
class BitReinterpretTypeConst
{
public:
explicit BitReinterpretTypeConst(const PtrType* ptr) : m_ptr(ptr) {}
inline operator T() const
{
T result;
std::memcpy(&result, m_ptr, sizeof(result));
return result;
}
private:
const PtrType* m_ptr;
};
template <typename T, typename PtrType>
inline auto BitReinterpret(const PtrType* ptr) noexcept -> BitReinterpretTypeConst<T, PtrType>
{
return BitReinterpretTypeConst<T, PtrType>{ptr};
}
template <typename T, typename PtrType>
inline auto BitReinterpret(PtrType* ptr) noexcept -> BitReinterpretType<T, PtrType>
{
return BitReinterpretType<T, PtrType>{ptr};
}
struct my_struct
{
int x;
};
int main()
{
unsigned char data[20] = {0xff, 0xff, 0xff, 0xff, /*etc*/};
my_struct ms = BitReinterpret<my_struct>(data);
std::cout << std::hex << ms.x <<std::endl;
ms.x = 123;
BitReinterpret<my_struct>(data) = ms;
std::cout << std::hex << int(data[0]) <<std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBQdHJUeXBlPgpjbGFzcyBCaXRSZWludGVycHJldFR5cGUKewpwdWJsaWM6CiAgZXhwbGljaXQgQml0UmVpbnRlcnByZXRUeXBlKFB0clR5cGUqIHB0cikgOiBtX3B0cihwdHIpIHt9CgogIGlubGluZSBjb25zdCBUJiBvcGVyYXRvcj0oY29uc3QgVCYgc291cmNlKQogIHsKICAgIHN0ZDo6bWVtY3B5KG1fcHRyLCAmc291cmNlLCBzaXplb2Yoc291cmNlKSk7CiAgICByZXR1cm4gc291cmNlOwogIH0KCiAgaW5saW5lIG9wZXJhdG9yIFQoKSBjb25zdAogIHsKICAgIFQgcmVzdWx0OwogICAgc3RkOjptZW1jcHkoJnJlc3VsdCwgbV9wdHIsIHNpemVvZihyZXN1bHQpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKcHJpdmF0ZToKICBQdHJUeXBlKiBtX3B0cjsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBQdHJUeXBlPgpjbGFzcyBCaXRSZWludGVycHJldFR5cGVDb25zdAp7CnB1YmxpYzoKICBleHBsaWNpdCBCaXRSZWludGVycHJldFR5cGVDb25zdChjb25zdCBQdHJUeXBlKiBwdHIpIDogbV9wdHIocHRyKSB7fQoKICBpbmxpbmUgb3BlcmF0b3IgVCgpIGNvbnN0CiAgewogICAgVCByZXN1bHQ7CiAgICBzdGQ6Om1lbWNweSgmcmVzdWx0LCBtX3B0ciwgc2l6ZW9mKHJlc3VsdCkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cgpwcml2YXRlOgogIGNvbnN0IFB0clR5cGUqIG1fcHRyOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFB0clR5cGU+CmlubGluZSBhdXRvIEJpdFJlaW50ZXJwcmV0KGNvbnN0IFB0clR5cGUqIHB0cikgbm9leGNlcHQgLT4gQml0UmVpbnRlcnByZXRUeXBlQ29uc3Q8VCwgUHRyVHlwZT4KewogIHJldHVybiBCaXRSZWludGVycHJldFR5cGVDb25zdDxULCBQdHJUeXBlPntwdHJ9Owp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUHRyVHlwZT4KaW5saW5lIGF1dG8gQml0UmVpbnRlcnByZXQoUHRyVHlwZSogcHRyKSBub2V4Y2VwdCAtPiBCaXRSZWludGVycHJldFR5cGU8VCwgUHRyVHlwZT4KewogIHJldHVybiBCaXRSZWludGVycHJldFR5cGU8VCwgUHRyVHlwZT57cHRyfTsKfQoKc3RydWN0IG15X3N0cnVjdAp7CglpbnQgeDsKfTsKCmludCBtYWluKCkKewoJdW5zaWduZWQgY2hhciBkYXRhWzIwXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAvKmV0YyovfTsKCQoJbXlfc3RydWN0IG1zID0gQml0UmVpbnRlcnByZXQ8bXlfc3RydWN0PihkYXRhKTsKCXN0ZDo6Y291dCA8PCBzdGQ6OmhleCA8PCBtcy54IDw8c3RkOjplbmRsOwoJCgltcy54ID0gMTIzOwoJCglCaXRSZWludGVycHJldDxteV9zdHJ1Y3Q+KGRhdGEpID0gbXM7CglzdGQ6OmNvdXQgPDwgc3RkOjpoZXggPDwgaW50KGRhdGFbMF0pIDw8c3RkOjplbmRsOwp9