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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//! output without the trait bounds (using specialization to
//! find the right impl anyway)
//!
//! output value for type of impl Debug, output type name for unimplDebug.
//!
//! # for example:
//! ```
//! #[derive(Debug)]
//! struct A(usize);
//! struct B(usize);
//! fn main() {
//! println!("{:?}", A(1)); // output: A(1)
//! println!("{:?}", B(1)); // output: `pi_print_any::B`
//! }
//! ```
//!
//! **NOTE**: This uses experimental Rust features and is therefore
//! by itself experimental and unstable, and has all the problems of
//! `feature(specialization)`.
//!
use fmt;
use type_name;
/// output a message by `println!`, and then each value's debug representation (if it has one)
///
/// # Examples
///
/// ```
/// #[macro_use] extern crate pi_print_any;
///
/// fn process_something<T>(x: T) {
/// unsafe {
/// println_any!("println_any: {:?}", x);
/// }
/// }
///
/// ```
/// output a message by `print!`, and then each value's debug representation (if it has one)
///
/// # Examples
///
/// ```
/// #[macro_use] extern crate pi_print_any;
///
/// fn process_something<T>(x: T) {
/// unsafe {
/// print_any!("print_any: {:?}", x);
/// }
/// }
///
/// ```
/// output a message by a specified way, and then each value's debug representation (if it has one)
///
/// # Examples
///
/// ```
/// #[macro_use] extern crate pi_print_any;
///
/// fn main() {
/// out_any!(print,"out_any: {:?}", 1); // output by print
/// out_any!(println,"out_any: {:?}", 1); // output by println
/// out_any!(log::info,"out_any: {:?}", 1); // output by log::info
/// }
/// ```
/// This type always implements `Debug`. Uses specialization to use
/// the inner value's Debug (which it should basically always have).
///
/// Otherwise, falls back to print the type name.
///
/// # Examples
///
/// ```
/// use debugit::DebugIt as D;
///
/// fn process_something<T>(x: T) {
/// unsafe {
/// println!("starting with {:?}", D(&x));
/// }
/// }
/// ```
/// This type always implements `Debug`. Uses specialization to use
/// the inner value's Debug (which it should basically always have).
///
/// Otherwise, falls back to print the type name.
///
/// # Examples
///
/// ```
/// use debugit::DebugIt as D;
///
/// fn process_something<T>(x: T) {
/// unsafe {
/// println!("starting with {:?}", D(&x));
/// }
/// }
/// ```