| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- #if !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION)
- #pragma once
- #include <c10/macros/Macros.h>
- #include <cstring>
- namespace c10 {
- namespace detail {
- template <typename T>
- struct LoadImpl {
- C10_HOST_DEVICE static T apply(const void* src) {
- return *reinterpret_cast<const T*>(src);
- }
- };
- template <>
- struct LoadImpl<bool> {
- C10_HOST_DEVICE static bool apply(const void* src) {
- static_assert(sizeof(bool) == sizeof(char));
- // NOTE: [Loading boolean values]
- // Protect against invalid boolean values by loading as a byte
- // first, then converting to bool (see gh-54789).
- return *reinterpret_cast<const unsigned char*>(src);
- }
- };
- } // namespace detail
- template <typename T>
- C10_HOST_DEVICE constexpr T load(const void* src) {
- return c10::detail::LoadImpl<T>::apply(src);
- }
- template <typename scalar_t>
- C10_HOST_DEVICE constexpr scalar_t load(const scalar_t* src) {
- return c10::detail::LoadImpl<scalar_t>::apply(src);
- }
- } // namespace c10
- #else
- #error "This file should not be included when either TORCH_STABLE_ONLY or TORCH_TARGET_VERSION is defined."
- #endif // !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION)
|