1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/// An utility trait which is used to detect panic.
///
/// # Examples
///
/// ```rust
/// use core::sync::atomic::{self, AtomicBool};
///
/// use unwind_context::unwind_context_with_fmt;
///
/// #[derive(Copy, Clone, Debug)]
/// pub struct NoStdPanicFlag<'a>(&'a AtomicBool);
///
/// impl unwind_context::PanicDetector for NoStdPanicFlag<'_> {
/// fn is_panicking(&self) -> bool {
/// self.0.load(atomic::Ordering::Relaxed)
/// }
/// }
///
/// fn func(foo: u32, bar: &str, writer: &mut String, panic_flag: NoStdPanicFlag<'_>) {
/// let ctx =
/// unwind_context_with_fmt!((foo, bar), writer = writer, panic_detector = panic_flag,);
/// // ...
/// }
/// ```
/// A default [`PanicDetector`] for a crates compiled with the Rust standard
/// library.
///
/// It uses `std::thread::panicking()` to detect whether the current thread is
/// unwinding because of panic.
///
/// # Examples
///
/// ```rust
/// use unwind_context::unwind_context_with_fmt;
///
/// fn func(foo: u32, bar: &str, writer: &mut String) {
/// let ctx = unwind_context_with_fmt!(
/// (foo, bar),
/// writer = writer,
/// panic_detector = unwind_context::StdPanicDetector,
/// );
/// // ...
/// }
/// ```
;