File indexing completed on 2025-08-28 08:27:10
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #pragma once
0021
0022 #include <cstring>
0023 #include <memory>
0024 #include <type_traits>
0025
0026 #include "arrow/util/macros.h"
0027
0028 namespace arrow {
0029 namespace util {
0030
0031 namespace internal {
0032
0033 constexpr uint8_t kNonNullFiller = 0;
0034
0035 }
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046 template <typename T>
0047 inline T* MakeNonNull(T* maybe_null = NULLPTR) {
0048 if (ARROW_PREDICT_TRUE(maybe_null != NULLPTR)) {
0049 return maybe_null;
0050 }
0051
0052 return const_cast<T*>(reinterpret_cast<const T*>(&internal::kNonNullFiller));
0053 }
0054
0055 template <typename T>
0056 inline std::enable_if_t<std::is_trivially_copyable_v<T>, T> SafeLoadAs(
0057 const uint8_t* unaligned) {
0058 std::remove_const_t<T> ret;
0059 std::memcpy(&ret, unaligned, sizeof(T));
0060 return ret;
0061 }
0062
0063 template <typename T>
0064 inline std::enable_if_t<std::is_trivially_copyable_v<T>, T> SafeLoad(const T* unaligned) {
0065 std::remove_const_t<T> ret;
0066 std::memcpy(&ret, static_cast<const void*>(unaligned), sizeof(T));
0067 return ret;
0068 }
0069
0070 template <typename U, typename T>
0071 inline std::enable_if_t<std::is_trivially_copyable_v<T> &&
0072 std::is_trivially_copyable_v<U> && sizeof(T) == sizeof(U),
0073 U>
0074 SafeCopy(T value) {
0075 std::remove_const_t<U> ret;
0076 std::memcpy(&ret, static_cast<const void*>(&value), sizeof(T));
0077 return ret;
0078 }
0079
0080 template <typename T>
0081 inline std::enable_if_t<std::is_trivially_copyable_v<T>, void> SafeStore(void* unaligned,
0082 T value) {
0083 std::memcpy(unaligned, &value, sizeof(T));
0084 }
0085
0086 }
0087 }