aboutsummaryrefslogtreecommitdiff
path: root/internal/ceres/miniglog/glog/logging.h
diff options
context:
space:
mode:
Diffstat (limited to 'internal/ceres/miniglog/glog/logging.h')
-rw-r--r--internal/ceres/miniglog/glog/logging.h274
1 files changed, 137 insertions, 137 deletions
diff --git a/internal/ceres/miniglog/glog/logging.h b/internal/ceres/miniglog/glog/logging.h
index 1fc137b..bab3191 100644
--- a/internal/ceres/miniglog/glog/logging.h
+++ b/internal/ceres/miniglog/glog/logging.h
@@ -1,100 +1,74 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2011, 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
+// Copyright 2011 Google Inc. All Rights Reserved.
// Author: settinger@google.com (Scott Ettinger)
-// keir@google.com (Keir Mierle)
-//
-// Simplified Glog style logging with Android support. Supported macros in
-// decreasing severity level per line:
+
+// Simplified Google3 style logging with Android support.
+// Supported macros are : LOG(INFO), LOG(WARNING), LOG(ERROR), LOG(FATAL),
+// and VLOG(n).
//
-// VLOG(2), VLOG(N)
-// VLOG(1),
-// LOG(INFO), VLOG(0), LG
-// LOG(WARNING),
-// LOG(ERROR),
-// LOG(FATAL),
+// Portions of this code are taken from the GLOG package. This code
+// is only a small subset of the GLOG functionality. And like GLOG,
+// higher levels are more verbose.
//
-// With VLOG(n), the output is directed to one of the 5 Android log levels:
+// Notable differences from GLOG :
//
-// 2 - Verbose
-// 1 - Debug
-// 0 - Info
-// -1 - Warning
-// -2 - Error
-// -3 - Fatal
+// 1. lack of support for displaying unprintable characters and lack
+// of stack trace information upon failure of the CHECK macros.
+// 2. All output is tagged with the string "native".
+// 3. While there is no runtime flag filtering logs (-v, -vmodule), the
+// compile time define MAX_LOG_LEVEL can be used to silence any
+// logging above the given level.
//
-// Any logging of level 2 and above is directed to the Verbose level. All
-// Android log output is tagged with the string "native".
+// -------------------------------- Usage ------------------------------------
+// Basic usage :
+// LOG(<severity level>) acts as a c++ stream to the Android logcat output.
+// e.g. LOG(INFO) << "Value of counter = " << counter;
//
-// If the symbol ANDROID is not defined, all output goes to std::cerr.
-// This allows code to be built on a different system for debug.
+// Valid severity levels include INFO, WARNING, ERROR, FATAL.
+// The various severity levels are routed to the corresponding Android logcat
+// output.
+// LOG(FATAL) outputs to the log and then terminates.
//
-// Portions of this code are taken from the GLOG package. This code is only a
-// small subset of the GLOG functionality. Notable differences from GLOG
-// behavior include lack of support for displaying unprintable characters and
-// lack of stack trace information upon failure of the CHECK macros. On
-// non-Android systems, log output goes to std::cerr and is not written to a
-// file.
+// VLOG(<severity level>) can also be used.
+// VLOG(n) output is directed to the Android logcat levels as follows :
+// >=2 - Verbose
+// 1 - Debug
+// 0 - Info
+// -1 - Warning
+// -2 - Error
+// <=-3 - Fatal
+// Note that VLOG(FATAL) will terminate the program.
//
-// CHECK macros are defined to test for conditions within code. Any CHECK that
-// fails will log the failure and terminate the application.
+// CHECK macros are defined to test for conditions within code. Any CHECK
+// that fails will log the failure and terminate the application.
// e.g. CHECK_GE(3, 2) will pass while CHECK_GE(3, 4) will fail after logging
// "Check failed 3 >= 4".
+// The following CHECK macros are defined :
//
-// The following CHECK macros are defined:
-//
-// CHECK(condition) - fails if condition is false and logs condition.
-// CHECK_NOTNULL(variable) - fails if the variable is NULL.
+// CHECK(condition) - fails if condition is false and logs condition.
+// CHECK_NOTNULL(variable) - fails if the variable is NULL.
//
// The following binary check macros are also defined :
-//
-// Macro Operator equivalent
-// -------------------- -------------------
-// CHECK_EQ(val1, val2) val1 == val2
-// CHECK_NE(val1, val2) val1 != val2
-// CHECK_GT(val1, val2) val1 > val2
-// CHECK_GE(val1, val2) val1 >= val2
-// CHECK_LT(val1, val2) val1 < val2
-// CHECK_LE(val1, val2) val1 <= val2
+// Macro operator applied
+// ------------------------------------------
+// CHECK_EQ(val1, val2) val1 == val2
+// CHECK_NE(val1, val2) val1 != val2
+// CHECK_GT(val1, val2) val1 > val2
+// CHECK_GE(val1, val2) val1 >= val2
+// CHECK_LT(val1, val2) val1 < val2
+// CHECK_LE(val1, val2) val1 <= val2
//
// Debug only versions of all of the check macros are also defined. These
// macros generate no code in a release build, but avoid unused variable
// warnings / errors.
-//
-// To use the debug only versions, prepend a D to the normal check macros, e.g.
-// DCHECK_EQ(a, b).
+// To use the debug only versions, Prepend a D to the normal check macros.
+// e.g. DCHECK_EQ(a, b);
-#ifndef CERCES_INTERNAL_MINIGLOG_GLOG_LOGGING_H_
-#define CERCES_INTERNAL_MINIGLOG_GLOG_LOGGING_H_
+#ifndef MOBILE_BASE_LOGGING_H_
+#define MOBILE_BASE_LOGGING_H_
-#ifdef ANDROID
+// Definitions for building on an Android system.
#include <android/log.h>
-#endif // ANDROID
+#include <time.h>
#include <algorithm>
#include <iostream>
@@ -120,29 +94,26 @@ const int WARNING = ::WARNING;
const int ERROR = ::ERROR;
const int FATAL = ::FATAL;
-// Sink class used for integration with mock and test functions. If sinks are
-// added, all log output is also sent to each sink through the send function.
-// In this implementation, WaitTillSent() is called immediately after the send.
+#ifdef ENABLE_LOG_SINKS
+
+// Sink class used for integration with mock and test functions.
+// If sinks are added, all log output is also sent to each sink through
+// the send function. In this implementation, WaitTillSent() is called
+// immediately after the send.
// This implementation is not thread safe.
class LogSink {
public:
virtual ~LogSink() {}
- virtual void send(LogSeverity severity,
- const char* full_filename,
- const char* base_filename,
- int line,
+ virtual void send(LogSeverity severity, const char* full_filename,
+ const char* base_filename, int line,
const struct tm* tm_time,
- const char* message,
- size_t message_len) = 0;
+ const char* message, size_t message_len) = 0;
virtual void WaitTillSent() = 0;
};
-// Global set of log sinks. The actual object is defined in logging.cc.
-extern std::set<LogSink *> log_sinks_global;
-
-inline void InitGoogleLogging(char *argv) {
- // Do nothing; this is ignored.
-}
+// Global set of log sinks.
+// TODO(settinger): Move this into a .cc file.
+static std::set<LogSink *> log_sinks_global;
// Note: the Log sink functions are not thread safe.
inline void AddLogSink(LogSink *sink) {
@@ -153,16 +124,19 @@ inline void RemoveLogSink(LogSink *sink) {
log_sinks_global.erase(sink);
}
+#endif // #ifdef ENABLE_LOG_SINKS
+
+inline void InitGoogleLogging(char *argv) {}
+
} // namespace google
// ---------------------------- Logger Class --------------------------------
// Class created for each use of the logging macros.
// The logger acts as a stream and routes the final stream contents to the
-// Android logcat output at the proper filter level. If ANDROID is not
-// defined, output is directed to std::cerr. This class should not
+// Android logcat output at the proper filter level. This class should not
// be directly instantiated in code, rather it should be invoked through the
-// use of the log macros LG, LOG, or VLOG.
+// use of the log macros LOG, or VLOG.
class MessageLogger {
public:
MessageLogger(const char *file, int line, const char *tag, int severity)
@@ -174,14 +148,17 @@ class MessageLogger {
// Output the contents of the stream to the proper channel on destruction.
~MessageLogger() {
+#ifdef MAX_LOG_LEVEL
+ if (severity_ > MAX_LOG_LEVEL && severity_ > FATAL) {
+ return;
+ }
+#endif
stream_ << "\n";
-
-#ifdef ANDROID
static const int android_log_levels[] = {
ANDROID_LOG_FATAL, // LOG(FATAL)
ANDROID_LOG_ERROR, // LOG(ERROR)
ANDROID_LOG_WARN, // LOG(WARNING)
- ANDROID_LOG_INFO, // LOG(INFO), LG, VLOG(0)
+ ANDROID_LOG_INFO, // LOG(INFO), VLOG(0)
ANDROID_LOG_DEBUG, // VLOG(1)
ANDROID_LOG_VERBOSE, // VLOG(2) .. VLOG(N)
};
@@ -193,22 +170,22 @@ class MessageLogger {
int android_log_level = android_log_levels[android_level_index];
// Output the log string the Android log at the appropriate level.
- __android_log_print(android_log_level, tag_.c_str(), stream_.str().c_str());
+ __android_log_write(android_log_level, tag_.c_str(), stream_.str().c_str());
// Indicate termination if needed.
if (severity_ == FATAL) {
- __android_log_print(ANDROID_LOG_FATAL,
+ __android_log_write(ANDROID_LOG_FATAL,
tag_.c_str(),
"terminating.\n");
}
-#else
- // If not building on Android, log all output to std::cerr.
- std::cerr << stream_.str();
-#endif // ANDROID
+
+#ifdef ENABLE_LOG_SINKS
LogToSinks(severity_);
WaitForSinks();
+#endif // #ifdef ENABLE_LOG_SINKS
+
// Android logging at level FATAL does not terminate execution, so abort()
// is still required to stop the program.
if (severity_ == FATAL) {
@@ -220,41 +197,41 @@ class MessageLogger {
std::stringstream &stream() { return stream_; }
private:
+#ifdef ENABLE_LOG_SINKS
+
void LogToSinks(int severity) {
time_t rawtime;
- struct tm* timeinfo;
+ struct tm * timeinfo;
- time (&rawtime);
- timeinfo = localtime(&rawtime);
- std::set<google::LogSink*>::iterator iter;
+ time ( &rawtime );
+ timeinfo = localtime ( &rawtime );
+ std::set<google::LogSink *>::iterator iter;
// Send the log message to all sinks.
for (iter = google::log_sinks_global.begin();
- iter != google::log_sinks_global.end(); ++iter) {
+ iter != google::log_sinks_global.end(); ++iter)
(*iter)->send(severity, file_.c_str(), filename_only_.c_str(), line_,
timeinfo, stream_.str().c_str(), stream_.str().size());
- }
}
void WaitForSinks() {
- // TODO(settinger): Add locks for thread safety.
+ // TODO(settinger): add locks for thread safety.
std::set<google::LogSink *>::iterator iter;
-
// Call WaitTillSent() for all sinks.
for (iter = google::log_sinks_global.begin();
- iter != google::log_sinks_global.end(); ++iter) {
+ iter != google::log_sinks_global.end(); ++iter)
(*iter)->WaitTillSent();
- }
}
+#endif // #ifdef ENABLE_LOG_SINKS
+
void StripBasename(const std::string &full_path, std::string *filename) {
// TODO(settinger): add support for OS with different path separators.
const char kSeparator = '/';
size_t pos = full_path.rfind(kSeparator);
- if (pos != std::string::npos) {
+ if (pos != std::string::npos)
*filename = full_path.substr(pos + 1, std::string::npos);
- } else {
+ else
*filename = full_path;
- }
}
std::string file_;
@@ -267,20 +244,6 @@ class MessageLogger {
// ---------------------- Logging Macro definitions --------------------------
-#define LG MessageLogger((char *)__FILE__, __LINE__, "native", \
- INFO).stream()
-
-#define LOG(n) MessageLogger((char *)__FILE__, __LINE__, "native", \
- n).stream()
-
-#define VLOG(n) MessageLogger((char *)__FILE__, __LINE__, "native", \
- n).stream()
-
-// Currently, VLOG is always on.
-#define VLOG_IS_ON(x) true
-
-// ---------------------------- CHECK helpers --------------------------------
-
// This class is used to explicitly ignore values in the conditional
// logging macros. This avoids compiler warnings like "value computed
// is not used" and "statement has no effect".
@@ -294,7 +257,40 @@ class LoggerVoidify {
// Log only if condition is met. Otherwise evaluates to void.
#define LOG_IF(severity, condition) \
- condition ? (void) 0 : LoggerVoidify() & LOG(severity)
+ !(condition) ? (void) 0 : LoggerVoidify() & \
+ MessageLogger((char *)__FILE__, __LINE__, "native", severity).stream()
+
+// Log only if condition is NOT met. Otherwise evaluates to void.
+#define LOG_IF_FALSE(severity, condition) LOG_IF(severity, !(condition))
+
+// LG is a convenient shortcut for LOG(INFO). Its use is in new
+// google3 code is discouraged and the following shortcut exists for
+// backward compatibility with existing code.
+#ifdef MAX_LOG_LEVEL
+#define LOG(n) LOG_IF(n, n <= MAX_LOG_LEVEL)
+#define VLOG(n) LOG_IF(n, n <= MAX_LOG_LEVEL)
+#define LG LOG_IF(INFO, INFO <= MAX_LOG_LEVEL)
+#else
+#define LOG(n) MessageLogger((char *)__FILE__, __LINE__, "native", n).stream()
+#define VLOG(n) MessageLogger((char *)__FILE__, __LINE__, "native", n).stream()
+#define LG MessageLogger((char *)__FILE__, __LINE__, "native", INFO).stream()
+#endif
+
+// Currently, VLOG is always on for levels below MAX_LOG_LEVEL.
+#ifndef MAX_LOG_LEVEL
+#define VLOG_IS_ON(x) (1)
+#else
+#define VLOG_IS_ON(x) (x <= MAX_LOG_LEVEL)
+#endif
+
+#ifndef NDEBUG
+#define DLOG LOG
+#else
+#define DLOG(severity) true ? (void) 0 : LoggerVoidify() & \
+ MessageLogger((char *)__FILE__, __LINE__, "native", severity).stream()
+#endif
+
+// ---------------------------- CHECK helpers --------------------------------
// Log a message and terminate.
template<class T>
@@ -306,16 +302,16 @@ void LogMessageFatal(const char *file, int line, const T &message) {
// ---------------------------- CHECK macros ---------------------------------
// Check for a given boolean condition.
-#define CHECK(condition) LOG_IF(FATAL, condition) \
+#define CHECK(condition) LOG_IF_FALSE(FATAL, condition) \
<< "Check failed: " #condition " "
#ifndef NDEBUG
// Debug only version of CHECK
-#define DCHECK(condition) LOG_IF(FATAL, condition) \
+#define DCHECK(condition) LOG_IF_FALSE(FATAL, condition) \
<< "Check failed: " #condition " "
#else
// Optimized version - generates no code.
-#define DCHECK(condition) if (false) LOG_IF(FATAL, condition) \
+#define DCHECK(condition) if (false) LOG_IF_FALSE(FATAL, condition) \
<< "Check failed: " #condition " "
#endif // NDEBUG
@@ -323,7 +319,7 @@ void LogMessageFatal(const char *file, int line, const T &message) {
// Generic binary operator check macro. This should not be directly invoked,
// instead use the binary comparison macros defined below.
-#define CHECK_OP(val1, val2, op) LOG_IF(FATAL, (val1 op val2)) \
+#define CHECK_OP(val1, val2, op) LOG_IF_FALSE(FATAL, (val1 op val2)) \
<< "Check failed: " #val1 " " #op " " #val2 " "
// Check_op macro definitions
@@ -388,4 +384,8 @@ T& CheckNotNull(const char *file, int line, const char *names, T& t) {
CheckNotNull(__FILE__, __LINE__, "'" #val "' Must be non NULL", (val))
#endif // NDEBUG
-#endif // CERCES_INTERNAL_MINIGLOG_GLOG_LOGGING_H_
+inline void PrintAndroid(const char *msg) {
+ __android_log_write(ANDROID_LOG_VERBOSE, "native", msg);
+}
+
+#endif // MOBILE_BASE_LOGGING_H_