github.com/searKing/golang/go@v1.2.117/os/signal/cgo/include/boost/stacktrace/detail/to_hex_array.hpp (about) 1 // Copyright Antony Polukhin, 2016-2023. 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See 4 // accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 7 #ifndef BOOST_STACKTRACE_DETAIL_TO_HEX_ARRAY_HPP 8 #define BOOST_STACKTRACE_DETAIL_TO_HEX_ARRAY_HPP 9 10 #include <boost/config.hpp> 11 #ifdef BOOST_HAS_PRAGMA_ONCE 12 # pragma once 13 #endif 14 15 #include <array> 16 #include <type_traits> 17 18 namespace boost { namespace stacktrace { namespace detail { 19 20 BOOST_STATIC_CONSTEXPR char to_hex_array_bytes[] = "0123456789ABCDEF"; 21 22 template <class T> 23 inline std::array<char, 2 + sizeof(void*) * 2 + 1> to_hex_array(T addr) noexcept { 24 std::array<char, 2 + sizeof(void*) * 2 + 1> ret = {"0x"}; 25 ret.back() = '\0'; 26 static_assert(!std::is_pointer<T>::value, ""); 27 28 const std::size_t s = sizeof(T); 29 30 char* out = ret.data() + s * 2 + 1; 31 32 for (std::size_t i = 0; i < s; ++i) { 33 const unsigned char tmp_addr = (addr & 0xFFu); 34 *out = to_hex_array_bytes[tmp_addr & 0xF]; 35 -- out; 36 *out = to_hex_array_bytes[tmp_addr >> 4]; 37 -- out; 38 addr >>= 8; 39 } 40 41 return ret; 42 } 43 44 inline std::array<char, 2 + sizeof(void*) * 2 + 1> to_hex_array(const void* addr) noexcept { 45 return to_hex_array( 46 reinterpret_cast< std::make_unsigned<std::ptrdiff_t>::type >(addr) 47 ); 48 } 49 50 }}} // namespace boost::stacktrace::detail 51 52 #endif // BOOST_STACKTRACE_DETAIL_TO_HEX_ARRAY_HPP