// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ // // 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. #ifndef GOOGLE_PROTOBUF_STUBS_LOGGING_H_ #define GOOGLE_PROTOBUF_STUBS_LOGGING_H_ #include #include // =================================================================== // emulates google3/base/logging.h namespace google { namespace protobuf { enum LogLevel { LOGLEVEL_INFO, // Informational. This is never actually used by // libprotobuf. LOGLEVEL_WARNING, // Warns about issues that, although not technically a // problem now, could cause problems in the future. For // example, a // warning will be printed when parsing a // message that is near the message size limit. LOGLEVEL_ERROR, // An error occurred which should never happen during // normal use. LOGLEVEL_FATAL, // An error occurred from which the library cannot // recover. This usually indicates a programming error // in the code which calls the library, especially when // compiled in debug mode. #ifdef NDEBUG LOGLEVEL_DFATAL = LOGLEVEL_ERROR #else LOGLEVEL_DFATAL = LOGLEVEL_FATAL #endif }; class StringPiece; namespace util { class Status; } class uint128; namespace internal { class LogFinisher; class LIBPROTOBUF_EXPORT LogMessage { public: LogMessage(LogLevel level, const char* filename, int line); ~LogMessage(); LogMessage& operator<<(const std::string& value); LogMessage& operator<<(const char* value); LogMessage& operator<<(char value); LogMessage& operator<<(int value); LogMessage& operator<<(uint value); LogMessage& operator<<(long value); LogMessage& operator<<(unsigned long value); LogMessage& operator<<(long long value); LogMessage& operator<<(unsigned long long value); LogMessage& operator<<(double value); LogMessage& operator<<(void* value); LogMessage& operator<<(const StringPiece& value); LogMessage& operator<<(const ::google::protobuf::util::Status& status); LogMessage& operator<<(const uint128& value); private: friend class LogFinisher; void Finish(); LogLevel level_; const char* filename_; int line_; std::string message_; }; // Used to make the entire "LOG(BLAH) << etc." expression have a void return // type and print a newline after each message. class LIBPROTOBUF_EXPORT LogFinisher { public: void operator=(LogMessage& other); }; template bool IsOk(T status) { return status.ok(); } template<> inline bool IsOk(bool status) { return status; } } // namespace internal // Undef everything in case we're being mixed with some other Google library // which already defined them itself. Presumably all Google libraries will // support the same syntax for these so it should not be a big deal if they // end up using our definitions instead. #undef GOOGLE_LOG #undef GOOGLE_LOG_IF #undef GOOGLE_CHECK #undef GOOGLE_CHECK_OK #undef GOOGLE_CHECK_EQ #undef GOOGLE_CHECK_NE #undef GOOGLE_CHECK_LT #undef GOOGLE_CHECK_LE #undef GOOGLE_CHECK_GT #undef GOOGLE_CHECK_GE #undef GOOGLE_CHECK_NOTNULL #undef GOOGLE_DLOG #undef GOOGLE_DCHECK #undef GOOGLE_DCHECK_OK #undef GOOGLE_DCHECK_EQ #undef GOOGLE_DCHECK_NE #undef GOOGLE_DCHECK_LT #undef GOOGLE_DCHECK_LE #undef GOOGLE_DCHECK_GT #undef GOOGLE_DCHECK_GE #define GOOGLE_LOG(LEVEL) \ ::google::protobuf::internal::LogFinisher() = \ ::google::protobuf::internal::LogMessage( \ ::google::protobuf::LOGLEVEL_##LEVEL, __FILE__, __LINE__) #define GOOGLE_LOG_IF(LEVEL, CONDITION) \ !(CONDITION) ? (void)0 : GOOGLE_LOG(LEVEL) #define GOOGLE_CHECK(EXPRESSION) \ GOOGLE_LOG_IF(FATAL, !(EXPRESSION)) << "CHECK failed: " #EXPRESSION ": " #define GOOGLE_CHECK_OK(A) GOOGLE_CHECK(::google::protobuf::internal::IsOk(A)) #define GOOGLE_CHECK_EQ(A, B) GOOGLE_CHECK((A) == (B)) #define GOOGLE_CHECK_NE(A, B) GOOGLE_CHECK((A) != (B)) #define GOOGLE_CHECK_LT(A, B) GOOGLE_CHECK((A) < (B)) #define GOOGLE_CHECK_LE(A, B) GOOGLE_CHECK((A) <= (B)) #define GOOGLE_CHECK_GT(A, B) GOOGLE_CHECK((A) > (B)) #define GOOGLE_CHECK_GE(A, B) GOOGLE_CHECK((A) >= (B)) namespace internal { template T* CheckNotNull(const char* /* file */, int /* line */, const char* name, T* val) { if (val == NULL) { GOOGLE_LOG(FATAL) << name; } return val; } } // namespace internal #define GOOGLE_CHECK_NOTNULL(A) \ ::google::protobuf::internal::CheckNotNull(\ __FILE__, __LINE__, "'" #A "' must not be NULL", (A)) #ifdef NDEBUG #define GOOGLE_DLOG(LEVEL) GOOGLE_LOG_IF(LEVEL, false) #define GOOGLE_DCHECK(EXPRESSION) while(false) GOOGLE_CHECK(EXPRESSION) #define GOOGLE_DCHECK_OK(E) GOOGLE_DCHECK(::google::protobuf::internal::IsOk(E)) #define GOOGLE_DCHECK_EQ(A, B) GOOGLE_DCHECK((A) == (B)) #define GOOGLE_DCHECK_NE(A, B) GOOGLE_DCHECK((A) != (B)) #define GOOGLE_DCHECK_LT(A, B) GOOGLE_DCHECK((A) < (B)) #define GOOGLE_DCHECK_LE(A, B) GOOGLE_DCHECK((A) <= (B)) #define GOOGLE_DCHECK_GT(A, B) GOOGLE_DCHECK((A) > (B)) #define GOOGLE_DCHECK_GE(A, B) GOOGLE_DCHECK((A) >= (B)) #else // NDEBUG #define GOOGLE_DLOG GOOGLE_LOG #define GOOGLE_DCHECK GOOGLE_CHECK #define GOOGLE_DCHECK_OK GOOGLE_CHECK_OK #define GOOGLE_DCHECK_EQ GOOGLE_CHECK_EQ #define GOOGLE_DCHECK_NE GOOGLE_CHECK_NE #define GOOGLE_DCHECK_LT GOOGLE_CHECK_LT #define GOOGLE_DCHECK_LE GOOGLE_CHECK_LE #define GOOGLE_DCHECK_GT GOOGLE_CHECK_GT #define GOOGLE_DCHECK_GE GOOGLE_CHECK_GE #endif // !NDEBUG typedef void LogHandler(LogLevel level, const char* filename, int line, const std::string& message); // The protobuf library sometimes writes warning and error messages to // stderr. These messages are primarily useful for developers, but may // also help end users figure out a problem. If you would prefer that // these messages be sent somewhere other than stderr, call SetLogHandler() // to set your own handler. This returns the old handler. Set the handler // to NULL to ignore log messages (but see also LogSilencer, below). // // Obviously, SetLogHandler is not thread-safe. You should only call it // at initialization time, and probably not from library code. If you // simply want to suppress log messages temporarily (e.g. because you // have some code that tends to trigger them frequently and you know // the warnings are not important to you), use the LogSilencer class // below. LIBPROTOBUF_EXPORT LogHandler* SetLogHandler(LogHandler* new_func); // Create a LogSilencer if you want to temporarily suppress all log // messages. As long as any LogSilencer objects exist, non-fatal // log messages will be discarded (the current LogHandler will *not* // be called). Constructing a LogSilencer is thread-safe. You may // accidentally suppress log messages occurring in another thread, but // since messages are generally for debugging purposes only, this isn't // a big deal. If you want to intercept log messages, use SetLogHandler(). class LIBPROTOBUF_EXPORT LogSilencer { public: LogSilencer(); ~LogSilencer(); }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_LOGGING_H_