mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-18 05:32:52 +00:00
0116c10e41
This is a follow-up to PR #5786, which fixed a segfault caused by an unexpected deduced type for unalignedStore. To prevent future errors of this kind, require a caller to specify the stored type explicitly.
26 lines
742 B
C++
26 lines
742 B
C++
#pragma once
|
|
|
|
#include <string.h>
|
|
#include <type_traits>
|
|
|
|
|
|
template <typename T>
|
|
inline T unalignedLoad(const void * address)
|
|
{
|
|
T res {};
|
|
memcpy(&res, address, sizeof(res));
|
|
return res;
|
|
}
|
|
|
|
/// We've had troubles before with wrong store size due to integral promotions
|
|
/// (e.g., unalignedStore(dest, uint16_t + uint16_t) stores an uint32_t).
|
|
/// To prevent this, make the caller specify the stored type explicitly.
|
|
/// To disable deduction of T, wrap the argument type with std::enable_if.
|
|
template <typename T>
|
|
inline void unalignedStore(void * address,
|
|
const typename std::enable_if<true, T>::type & src)
|
|
{
|
|
static_assert(std::is_trivially_copyable_v<T>);
|
|
memcpy(address, &src, sizeof(src));
|
|
}
|