Files
Cpp-in-Embedded-Systems/Chapter17/cib/libs/stdx/memory.hpp
Amar Mahmutbegovic 526e6ec009 rename chapters
2025-02-09 13:11:21 +01:00

34 lines
916 B
C++

#pragma once
#include <stdx/type_traits.hpp>
#include <memory>
namespace stdx {
inline namespace v1 {
template <typename T> constexpr auto to_address(T *p) noexcept -> T * {
static_assert(not stdx::is_function_v<T>,
"to_address on a function pointer is ill-formed");
return p;
}
namespace detail::detect {
template <typename T, typename = void>
constexpr auto pointer_traits_to_address = false;
template <typename T>
constexpr auto pointer_traits_to_address<
T, std::void_t<decltype(std::pointer_traits<T>::to_address(
std::declval<T>()))>> = true;
} // namespace detail::detect
template <typename T> constexpr auto to_address(T const &t) {
if constexpr (detail::detect::pointer_traits_to_address<T>) {
return std::pointer_traits<T>::to_address(t);
} else {
return stdx::to_address(t.operator->());
}
}
} // namespace v1
} // namespace stdx