mimic++ v9.2.1
Loading...
Searching...
No Matches
cpptrace.hpp
Go to the documentation of this file.
1// Copyright Dominic (DNKpp) Koepke 2024 - 2025.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at
4// https://www.boost.org/LICENSE_1_0.txt)
5
6#ifndef MIMICPP_EXT_STACKTRACE_CPPTRACE_HPP
7#define MIMICPP_EXT_STACKTRACE_CPPTRACE_HPP
8
9#include "mimic++/Fwd.hpp"
11
12#ifndef MIMICPP_DETAIL_IS_MODULE
13 #if __has_include(<cpptrace/basic.hpp>)
14 #include <cpptrace/basic.hpp>
15 #elif __has_include(<cpptrace/cpptrace.hpp>)
16 // this is necessary for old cpptrace versions.
17 // see: https://github.com/jeremy-rifkin/libassert/issues/110
18 #include <cpptrace/cpptrace.hpp>
19 #else
20 #error "The cpptrace stacktrace backend is explicitly enabled, but the the required include-file can not be found."
21 #endif
22
23 #include <limits>
24 #include <string>
25#endif
26
28{
29 using type = cpptrace::stacktrace;
30};
31
32template <>
34{
35 using Backend = cpptrace::stacktrace;
36
37 [[nodiscard]]
38 static Backend current(std::size_t const skip, std::size_t const max) noexcept
39 {
40 MIMICPP_ASSERT(skip < std::numeric_limits<std::size_t>::max() - max, "Skip + max is too high.");
41
42 return cpptrace::generate_trace(skip + 1, max);
43 }
44
45 [[nodiscard]]
46 static Backend current(std::size_t const skip)
47 {
48 MIMICPP_ASSERT(skip < std::numeric_limits<std::size_t>::max(), "Skip is too high.");
49
50 return cpptrace::generate_trace(skip + 1);
51 }
52
53 [[nodiscard]]
55 {
56 return stacktrace.frames.size();
57 }
58
59 [[nodiscard]]
61 {
62 return stacktrace.frames.empty();
63 }
64
65 [[nodiscard]]
66 static MIMICPP_DETAIL_CONSTEXPR_STRING std::string description(Backend const& stacktrace, std::size_t const at)
67 {
68 return frame(stacktrace, at).symbol;
69 }
70
71 [[nodiscard]]
72 static MIMICPP_DETAIL_CONSTEXPR_STRING std::string source_file(Backend const& stacktrace, std::size_t const at)
73 {
74 return frame(stacktrace, at).filename;
75 }
76
77 [[nodiscard]]
78 static MIMICPP_DETAIL_CONSTEXPR_VECTOR std::size_t source_line(Backend const& stacktrace, std::size_t const at)
79 {
80 return frame(stacktrace, at).line.value_or(0u);
81 }
82
83 [[nodiscard]]
84 static MIMICPP_DETAIL_CONSTEXPR_VECTOR cpptrace::stacktrace_frame const& frame(Backend const& stacktrace, std::size_t const at)
85 {
86 return stacktrace.frames.at(at);
87 }
88};
89
90#endif
#define MIMICPP_DETAIL_CONSTEXPR_STRING
Definition Config.hpp:60
#define MIMICPP_DETAIL_CONSTEXPR_VECTOR
Definition Config.hpp:69
#define MIMICPP_ASSERT(condition, msg)
Definition Config.hpp:51
Definition Fwd.hpp:447
static MIMICPP_DETAIL_CONSTEXPR_STRING std::string source_file(Backend const &stacktrace, std::size_t const at)
Definition cpptrace.hpp:72
static MIMICPP_DETAIL_CONSTEXPR_VECTOR bool empty(Backend const &stacktrace)
Definition cpptrace.hpp:60
static Backend current(std::size_t const skip)
Definition cpptrace.hpp:46
cpptrace::stacktrace Backend
Definition cpptrace.hpp:35
static MIMICPP_DETAIL_CONSTEXPR_STRING std::string description(Backend const &stacktrace, std::size_t const at)
Definition cpptrace.hpp:66
static Backend current(std::size_t const skip, std::size_t const max) noexcept
Definition cpptrace.hpp:38
static MIMICPP_DETAIL_CONSTEXPR_VECTOR cpptrace::stacktrace_frame const & frame(Backend const &stacktrace, std::size_t const at)
Definition cpptrace.hpp:84
static MIMICPP_DETAIL_CONSTEXPR_VECTOR std::size_t size(Backend const &stacktrace)
Definition cpptrace.hpp:54
static MIMICPP_DETAIL_CONSTEXPR_VECTOR std::size_t source_line(Backend const &stacktrace, std::size_t const at)
Definition cpptrace.hpp:78
Trait type for stacktrace backends.
Definition Fwd.hpp:453
Definition Stacktrace.hpp:529
NullBackend type
Definition Stacktrace.hpp:530