12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // Copyright Antony Polukhin, 2016-2021.
- //
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_STACKTRACE_FRAME_HPP
- #define BOOST_STACKTRACE_FRAME_HPP
- #include <boost/config.hpp>
- #ifdef BOOST_HAS_PRAGMA_ONCE
- # pragma once
- #endif
- #include <iosfwd>
- #include <string>
- #include <boost/core/explicit_operator_bool.hpp>
- #include <boost/stacktrace/safe_dump_to.hpp> // boost::stacktrace::detail::native_frame_ptr_t
- #include <boost/stacktrace/detail/frame_decl.hpp>
- #include <boost/stacktrace/detail/push_options.h>
- namespace boost { namespace stacktrace {
- /// Comparison operators that provide platform dependant ordering and have O(1) complexity; are Async-Handler-Safe.
- BOOST_CONSTEXPR inline bool operator< (const frame& lhs, const frame& rhs) BOOST_NOEXCEPT { return lhs.address() < rhs.address(); }
- BOOST_CONSTEXPR inline bool operator> (const frame& lhs, const frame& rhs) BOOST_NOEXCEPT { return rhs < lhs; }
- BOOST_CONSTEXPR inline bool operator<=(const frame& lhs, const frame& rhs) BOOST_NOEXCEPT { return !(lhs > rhs); }
- BOOST_CONSTEXPR inline bool operator>=(const frame& lhs, const frame& rhs) BOOST_NOEXCEPT { return !(lhs < rhs); }
- BOOST_CONSTEXPR inline bool operator==(const frame& lhs, const frame& rhs) BOOST_NOEXCEPT { return lhs.address() == rhs.address(); }
- BOOST_CONSTEXPR inline bool operator!=(const frame& lhs, const frame& rhs) BOOST_NOEXCEPT { return !(lhs == rhs); }
- /// Fast hashing support, O(1) complexity; Async-Handler-Safe.
- inline std::size_t hash_value(const frame& f) BOOST_NOEXCEPT {
- return reinterpret_cast<std::size_t>(f.address());
- }
- /// Outputs stacktrace::frame in a human readable format to string; unsafe to use in async handlers.
- BOOST_STACKTRACE_FUNCTION std::string to_string(const frame& f);
- /// Outputs stacktrace::frame in a human readable format to output stream; unsafe to use in async handlers.
- template <class CharT, class TraitsT>
- std::basic_ostream<CharT, TraitsT>& operator<<(std::basic_ostream<CharT, TraitsT>& os, const frame& f) {
- return os << boost::stacktrace::to_string(f);
- }
- }} // namespace boost::stacktrace
- /// @cond
- #include <boost/stacktrace/detail/pop_options.h>
- #ifndef BOOST_STACKTRACE_LINK
- # if defined(BOOST_STACKTRACE_USE_NOOP)
- # include <boost/stacktrace/detail/frame_noop.ipp>
- # elif defined(BOOST_MSVC) || defined(BOOST_STACKTRACE_USE_WINDBG) || defined(BOOST_STACKTRACE_USE_WINDBG_CACHED)
- # include <boost/stacktrace/detail/frame_msvc.ipp>
- # else
- # include <boost/stacktrace/detail/frame_unwind.ipp>
- # endif
- #endif
- /// @endcond
- #endif // BOOST_STACKTRACE_FRAME_HPP
|