27
27
#ifndef ABSL_LOG_INTERNAL_LOG_MESSAGE_H_
28
28
#define ABSL_LOG_INTERNAL_LOG_MESSAGE_H_
29
29
30
+ #include < cstddef>
30
31
#include < ios>
31
32
#include < memory>
32
33
#include < ostream>
33
34
#include < streambuf>
34
35
#include < string>
36
+ #include < type_traits>
35
37
36
38
#include " absl/base/attributes.h"
37
39
#include " absl/base/config.h"
38
40
#include " absl/base/internal/errno_saver.h"
39
41
#include " absl/base/log_severity.h"
42
+ #include " absl/base/nullability.h"
40
43
#include " absl/log/internal/nullguard.h"
41
44
#include " absl/log/log_entry.h"
42
45
#include " absl/log/log_sink.h"
@@ -56,15 +59,15 @@ class LogMessage {
56
59
struct ErrorTag {};
57
60
58
61
// Used for `LOG`.
59
- LogMessage (const char * file, int line,
62
+ LogMessage (absl::Nonnull< const char *> file, int line,
60
63
absl::LogSeverity severity) ABSL_ATTRIBUTE_COLD;
61
64
// These constructors are slightly smaller/faster to call; the severity is
62
65
// curried into the function pointer.
63
- LogMessage (const char * file, int line,
66
+ LogMessage (absl::Nonnull< const char *> file, int line,
64
67
InfoTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
65
- LogMessage (const char * file, int line,
68
+ LogMessage (absl::Nonnull< const char *> file, int line,
66
69
WarningTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
67
- LogMessage (const char * file, int line,
70
+ LogMessage (absl::Nonnull< const char *> file, int line,
68
71
ErrorTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
69
72
LogMessage (const LogMessage&) = delete ;
70
73
LogMessage& operator =(const LogMessage&) = delete ;
@@ -95,59 +98,67 @@ class LogMessage {
95
98
// of `errno`.
96
99
LogMessage& WithPerror ();
97
100
// Sends this message to `*sink` in addition to whatever other sinks it would
98
- // otherwise have been sent to. `sink` must not be null.
99
- LogMessage& ToSinkAlso (absl::LogSink* sink);
100
- // Sends this message to `*sink` and no others. `sink` must not be null.
101
- LogMessage& ToSinkOnly (absl::LogSink* sink);
101
+ // otherwise have been sent to.
102
+ LogMessage& ToSinkAlso (absl::Nonnull<absl:: LogSink*> sink);
103
+ // Sends this message to `*sink` and no others.
104
+ LogMessage& ToSinkOnly (absl::Nonnull<absl:: LogSink*> sink);
102
105
103
106
// Don't call this method from outside this library.
104
107
LogMessage& InternalStream () { return *this ; }
105
108
106
109
// By-value overloads for small, common types let us overlook common failures
107
110
// to define globals and static data members (i.e. in a .cc file).
108
- // clang-format off
109
- // The CUDA toolchain cannot handle these <<<'s:
111
+ // NOLINTBEGIN(runtime/int)
112
+ // NOLINTBEGIN(google-runtime-int)
113
+ // clang-format off: The CUDA toolchain cannot handle these <<<'s
110
114
LogMessage& operator <<(char v) { return operator << <char >(v); }
111
115
LogMessage& operator <<(signed char v) { return operator << <signed char >(v); }
112
116
LogMessage& operator <<(unsigned char v) {
113
117
return operator << <unsigned char >(v);
114
118
}
115
- LogMessage& operator <<(signed short v) { // NOLINT
116
- return operator << <signed short >(v); // NOLINT
119
+ LogMessage& operator <<(signed short v) {
120
+ return operator << <signed short >(v);
117
121
}
118
122
LogMessage& operator <<(signed int v) { return operator << <signed int >(v); }
119
- LogMessage& operator <<(signed long v) { // NOLINT
120
- return operator << <signed long >(v); // NOLINT
123
+ LogMessage& operator <<(signed long v) {
124
+ return operator << <signed long >(v);
121
125
}
122
- LogMessage& operator <<(signed long long v) { // NOLINT
123
- return operator << <signed long long >(v); // NOLINT
126
+ LogMessage& operator <<(signed long long v) {
127
+ return operator << <signed long long >(v);
124
128
}
125
- LogMessage& operator <<(unsigned short v) { // NOLINT
126
- return operator << <unsigned short >(v); // NOLINT
129
+ LogMessage& operator <<(unsigned short v) {
130
+ return operator << <unsigned short >(v);
127
131
}
128
132
LogMessage& operator <<(unsigned int v) {
129
133
return operator << <unsigned int >(v);
130
134
}
131
- LogMessage& operator <<(unsigned long v) { // NOLINT
132
- return operator << <unsigned long >(v); // NOLINT
135
+ LogMessage& operator <<(unsigned long v) {
136
+ return operator << <unsigned long >(v);
133
137
}
134
- LogMessage& operator <<(unsigned long long v) { // NOLINT
135
- return operator << <unsigned long long >(v); // NOLINT
138
+ LogMessage& operator <<(unsigned long long v) {
139
+ return operator << <unsigned long long >(v);
140
+ }
141
+ LogMessage& operator <<(absl::Nullable<void *> v) {
142
+ return operator << <void *>(v);
143
+ }
144
+ LogMessage& operator <<(absl::Nullable<const void *> v) {
145
+ return operator << <const void *>(v);
136
146
}
137
- LogMessage& operator <<(void * v) { return operator << <void *>(v); }
138
- LogMessage& operator <<(const void * v) { return operator << <const void *>(v); }
139
147
LogMessage& operator <<(float v) { return operator << <float >(v); }
140
148
LogMessage& operator <<(double v) { return operator << <double >(v); }
141
149
LogMessage& operator <<(bool v) { return operator << <bool >(v); }
142
150
// clang-format on
151
+ // NOLINTEND(google-runtime-int)
152
+ // NOLINTEND(runtime/int)
143
153
144
154
// These overloads are more efficient since no `ostream` is involved.
145
155
LogMessage& operator <<(const std::string& v);
146
156
LogMessage& operator <<(absl::string_view v);
147
157
148
158
// Handle stream manipulators e.g. std::endl.
149
- LogMessage& operator <<(std::ostream& (*m)(std::ostream& os));
150
- LogMessage& operator <<(std::ios_base& (*m)(std::ios_base& os));
159
+ LogMessage& operator <<(absl::Nonnull<std::ostream& (*)(std::ostream & os)> m);
160
+ LogMessage& operator <<(
161
+ absl::Nonnull<std::ios_base& (*)(std::ios_base & os)> m);
151
162
152
163
// Literal strings. This allows us to record C string literals as literals in
153
164
// the logging.proto.Value.
@@ -255,7 +266,7 @@ class LogMessage {
255
266
256
267
// We keep the data in a separate struct so that each instance of `LogMessage`
257
268
// uses less stack space.
258
- std::unique_ptr<LogMessageData> data_;
269
+ absl::Nonnull< std::unique_ptr<LogMessageData> > data_;
259
270
};
260
271
261
272
// Helper class so that `AbslStringify()` can modify the LogMessage.
@@ -273,7 +284,8 @@ class StringifySink final {
273
284
}
274
285
275
286
// For types that implement `AbslStringify` using `absl::Format()`.
276
- friend void AbslFormatFlush (StringifySink* sink, absl::string_view v) {
287
+ friend void AbslFormatFlush (absl::Nonnull<StringifySink*> sink,
288
+ absl::string_view v) {
277
289
sink->Append (v);
278
290
}
279
291
@@ -315,27 +327,28 @@ LogMessage& LogMessage::operator<<(char (&buf)[SIZE]) {
315
327
// We instantiate these specializations in the library's TU to save space in
316
328
// other TUs. Since the template is marked `ABSL_ATTRIBUTE_NOINLINE` we will be
317
329
// emitting a function call either way.
330
+ // NOLINTBEGIN(runtime/int)
331
+ // NOLINTBEGIN(google-runtime-int)
318
332
extern template LogMessage& LogMessage::operator <<(const char & v);
319
333
extern template LogMessage& LogMessage::operator <<(const signed char & v);
320
334
extern template LogMessage& LogMessage::operator <<(const unsigned char & v);
321
- extern template LogMessage& LogMessage::operator <<(const short & v); // NOLINT
322
- extern template LogMessage& LogMessage::operator <<(
323
- const unsigned short & v); // NOLINT
335
+ extern template LogMessage& LogMessage::operator <<(const short & v);
336
+ extern template LogMessage& LogMessage::operator <<(const unsigned short & v);
324
337
extern template LogMessage& LogMessage::operator <<(const int & v);
338
+ extern template LogMessage& LogMessage::operator <<(const unsigned int & v);
339
+ extern template LogMessage& LogMessage::operator <<(const long & v);
340
+ extern template LogMessage& LogMessage::operator <<(const unsigned long & v);
341
+ extern template LogMessage& LogMessage::operator <<(const long long & v);
342
+ extern template LogMessage& LogMessage::operator <<(const unsigned long long & v);
325
343
extern template LogMessage& LogMessage::operator <<(
326
- const unsigned int & v); // NOLINT
327
- extern template LogMessage& LogMessage::operator <<(const long & v); // NOLINT
328
- extern template LogMessage& LogMessage::operator <<(
329
- const unsigned long & v); // NOLINT
330
- extern template LogMessage& LogMessage::operator <<(
331
- const long long & v); // NOLINT
344
+ absl::Nullable<void *> const & v);
332
345
extern template LogMessage& LogMessage::operator <<(
333
- const unsigned long long & v); // NOLINT
334
- extern template LogMessage& LogMessage::operator <<(void * const & v);
335
- extern template LogMessage& LogMessage::operator <<(const void * const & v);
346
+ absl::Nullable<const void *> const & v);
336
347
extern template LogMessage& LogMessage::operator <<(const float & v);
337
348
extern template LogMessage& LogMessage::operator <<(const double & v);
338
349
extern template LogMessage& LogMessage::operator <<(const bool & v);
350
+ // NOLINTEND(google-runtime-int)
351
+ // NOLINTEND(runtime/int)
339
352
340
353
extern template void LogMessage::CopyToEncodedBuffer<
341
354
LogMessage::StringType::kLiteral >(absl::string_view str);
@@ -351,8 +364,9 @@ extern template void LogMessage::CopyToEncodedBuffer<
351
364
// message.
352
365
class LogMessageFatal final : public LogMessage {
353
366
public:
354
- LogMessageFatal (const char * file, int line) ABSL_ATTRIBUTE_COLD;
355
- LogMessageFatal (const char * file, int line,
367
+ LogMessageFatal (absl::Nonnull<const char *> file,
368
+ int line) ABSL_ATTRIBUTE_COLD;
369
+ LogMessageFatal (absl::Nonnull<const char *> file, int line,
356
370
absl::string_view failure_msg) ABSL_ATTRIBUTE_COLD;
357
371
[[noreturn]] ~LogMessageFatal ();
358
372
};
@@ -362,7 +376,8 @@ class LogMessageFatal final : public LogMessage {
362
376
// for DLOG(FATAL) variants.
363
377
class LogMessageDebugFatal final : public LogMessage {
364
378
public:
365
- LogMessageDebugFatal (const char * file, int line) ABSL_ATTRIBUTE_COLD;
379
+ LogMessageDebugFatal (absl::Nonnull<const char *> file,
380
+ int line) ABSL_ATTRIBUTE_COLD;
366
381
~LogMessageDebugFatal ();
367
382
};
368
383
@@ -371,15 +386,17 @@ class LogMessageQuietlyDebugFatal final : public LogMessage {
371
386
// DLOG(QFATAL) calls this instead of LogMessageQuietlyFatal to make sure the
372
387
// destructor is not [[noreturn]] even if this is always FATAL as this is only
373
388
// invoked when DLOG() is enabled.
374
- LogMessageQuietlyDebugFatal (const char * file, int line) ABSL_ATTRIBUTE_COLD;
389
+ LogMessageQuietlyDebugFatal (absl::Nonnull<const char *> file,
390
+ int line) ABSL_ATTRIBUTE_COLD;
375
391
~LogMessageQuietlyDebugFatal ();
376
392
};
377
393
378
394
// Used for LOG(QFATAL) to make sure it's properly understood as [[noreturn]].
379
395
class LogMessageQuietlyFatal final : public LogMessage {
380
396
public:
381
- LogMessageQuietlyFatal (const char * file, int line) ABSL_ATTRIBUTE_COLD;
382
- LogMessageQuietlyFatal (const char * file, int line,
397
+ LogMessageQuietlyFatal (absl::Nonnull<const char *> file,
398
+ int line) ABSL_ATTRIBUTE_COLD;
399
+ LogMessageQuietlyFatal (absl::Nonnull<const char *> file, int line,
383
400
absl::string_view failure_msg) ABSL_ATTRIBUTE_COLD;
384
401
[[noreturn]] ~LogMessageQuietlyFatal ();
385
402
};
0 commit comments