1// Copyright 2010 Google
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14#ifndef BASE_LOGGING_H
15#define BASE_LOGGING_H
16
17#include <stdlib.h>
18#include <iostream>
19using std::ostream;
20using std::cout;
21using std::endl;
22
23#include "base/macros.h"
24
25// Always-on checking
26#define CHECK(x) if(x){}else LogMessageFatal(__FILE__, __LINE__).stream() << "Check failed: " #x
27#define CHECK_LT(x, y) CHECK((x) < (y))
28#define CHECK_GT(x, y) CHECK((x) > (y))
29#define CHECK_LE(x, y) CHECK((x) <= (y))
30#define CHECK_GE(x, y) CHECK((x) >= (y))
31#define CHECK_EQ(x, y) CHECK((x) == (y))
32#define CHECK_NE(x, y) CHECK((x) != (y))
33#define CHECK_NOTNULL(x) CHECK((x) != NULL)
34
35#ifndef NDEBUG
36// Debug-only checking.
37#define DCHECK(condition) CHECK(condition)
38#define DCHECK_EQ(val1, val2) CHECK_EQ(val1, val2)
39#define DCHECK_NE(val1, val2) CHECK_NE(val1, val2)
40#define DCHECK_LE(val1, val2) CHECK_LE(val1, val2)
41#define DCHECK_LT(val1, val2) CHECK_LT(val1, val2)
42#define DCHECK_GE(val1, val2) CHECK_GE(val1, val2)
43#define DCHECK_GT(val1, val2) CHECK_GT(val1, val2)
44#else
45#define DCHECK(condition) CHECK(true)
46#define DCHECK_EQ(val1, val2) CHECK(true)
47#define DCHECK_NE(val1, val2) CHECK(true)
48#define DCHECK_LE(val1, val2) CHECK(true)
49#define DCHECK_LT(val1, val2) CHECK(true)
50#define DCHECK_GE(val1, val2) CHECK(true)
51#define DCHECK_GT(val1, val2) CHECK(true)
52#endif
53
54#define LOG_INFO LogMessage(__FILE__, __LINE__)
55#define LOG_ERROR LOG_INFO
56#define LOG_WARNING LOG_INFO
57#define LOG_FATAL LogMessageFatal(__FILE__, __LINE__)
58#define LOG_QFATAL LOG_FATAL
59
60#define VLOG(x) if((x)>0){} else LOG_INFO.stream()
61
62#ifdef NDEBUG
63#define DEBUG_MODE false
64#define LOG_DFATAL LOG_ERROR
65#else
66#define DEBUG_MODE true
67#define LOG_DFATAL LOG_FATAL
68#endif
69
70#define LOG(severity) LOG_ ## severity.stream()
71#define LG LOG_INFO.stream()
72
73namespace google_base {
74class DateLogger {
75 public:
76 DateLogger();
77 char* const HumanDate();
78 private:
79 char buffer_[9];
80};
81} // namespace google_base
82
83class LogMessage {
84 public:
85 LogMessage(const char* file, int line) {
86 std::cerr << "[" << pretty_date_.HumanDate() << "] "
87 << file << ":" << line << ": ";
88 }
89 ~LogMessage() { std::cerr << "\n"; }
90 std::ostream& stream() { return std::cerr; }
91
92 private:
93 google_base::DateLogger pretty_date_;
94 DISALLOW_COPY_AND_ASSIGN(LogMessage);
95};
96
97class LogMessageFatal : public LogMessage {
98 public:
99 LogMessageFatal(const char* file, int line)
100 : LogMessage(file, line) { }
101 ~LogMessageFatal() {
102 std::cerr << "\n";
103 abort();
104 }
105 private:
106 DISALLOW_COPY_AND_ASSIGN(LogMessageFatal);
107};
108
109#endif // BASE_LOGGING_H
110