github.com/searKing/golang/go@v1.2.117/runtime/cgosymbolizer/include/boost/stacktrace/detail/to_hex_array.hpp (about) 1 // Copyright Antony Polukhin, 2016-2020. 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 <boost/array.hpp> 16 #include <boost/static_assert.hpp> 17 #include <boost/type_traits/is_pointer.hpp> 18 #include <boost/type_traits/make_unsigned.hpp> 19 20 namespace boost { namespace stacktrace { namespace detail { 21 22 BOOST_STATIC_CONSTEXPR char to_hex_array_bytes[] = "0123456789ABCDEF"; 23 24 template <class T> 25 inline boost::array<char, 2 + sizeof(void*) * 2 + 1> to_hex_array(T addr) BOOST_NOEXCEPT { 26 boost::array<char, 2 + sizeof(void*) * 2 + 1> ret = {"0x"}; 27 ret.back() = '\0'; 28 BOOST_STATIC_ASSERT_MSG(!boost::is_pointer<T>::value, ""); 29 30 const std::size_t s = sizeof(T); 31 32 char* out = ret.data() + s * 2 + 1; 33 34 for (std::size_t i = 0; i < s; ++i) { 35 const unsigned char tmp_addr = (addr & 0xFFu); 36 *out = to_hex_array_bytes[tmp_addr & 0xF]; 37 -- out; 38 *out = to_hex_array_bytes[tmp_addr >> 4]; 39 -- out; 40 addr >>= 8; 41 } 42 43 return ret; 44 } 45 46 inline boost::array<char, 2 + sizeof(void*) * 2 + 1> to_hex_array(const void* addr) BOOST_NOEXCEPT { 47 return to_hex_array( 48 reinterpret_cast< boost::make_unsigned<std::ptrdiff_t>::type >(addr) 49 ); 50 } 51 52 }}} // namespace boost::stacktrace::detail 53 54 #endif // BOOST_STACKTRACE_DETAIL_TO_HEX_ARRAY_HPP