blob: a7059182ff7590284e8184b8d0ceff75f7d33375 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file defines useful logging macros/methods for CDM adapter.
#include <iostream>
#include <sstream>
#include <string>
namespace media {
namespace {
// The following classes/macros are adapted from base/logging.h.
// 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".
class LogMessageVoidify {
LogMessageVoidify() {}
// This has to be an operator with a precedence lower than << but
// higher than ?:
void operator&(std::ostream&) {}
} // namespace
// This class serves two purposes:
// (1) It adds common headers to the log message, e.g. timestamp, process ID.
// (2) It adds a line break at the end of the log message.
// This class is copied and modified from base/logging.* but is quite different
// in terms of how things work. This class is designed to work only with the
// CDM_DLOG() defined below and should not be used for other purposes.
class CdmLogMessage {
CdmLogMessage(const char* file, int line);
std::string message() { return stream_.str(); }
std::ostringstream stream_;
// Helper macro which avoids evaluating the arguments to a stream if
// the condition doesn't hold.
#define CDM_LAZY_STREAM(stream, condition) \
!(condition) ? (void) 0 : LogMessageVoidify() & (stream)
#define CDM_DLOG() CDM_LAZY_STREAM(std::cout, CDM_DLOG_IS_ON()) \
<< CdmLogMessage(__FILE__, __LINE__).message()
#if defined(NDEBUG)
#define CDM_DLOG_IS_ON() false
#define CDM_DLOG_IS_ON() true
} // namespace media