1/*
2Copyright 2018 Google Inc. All Rights Reserved.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS-IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17#ifndef RESONANCE_AUDIO_PLATFORM_LOGGING_H_
18#define RESONANCE_AUDIO_PLATFORM_LOGGING_H_
19
20#include <cstdlib>
21
22#include <cassert>
23#include <iostream>
24#include <sstream>
25
26#undef DCHECK
27#undef DCHECK_EQ
28#undef DCHECK_NE
29#undef DCHECK_LE
30#undef DCHECK_LT
31#undef DCHECK_GE
32#undef DCHECK_GT
33#undef CHECK
34#undef CHECK_EQ
35#undef CHECK_NE
36#undef CHECK_LE
37#undef CHECK_LT
38#undef CHECK_GE
39#undef CHECK_GT
40#undef CHECK_NOTNULL
41#undef LOG
42
43// This class is used to disable logging, while still allowing for log messages
44// to contain '<<' expressions.
45class NullLogger {
46 public:
47 std::ostream& GetStream() {
48 static std::ostream kNullStream(nullptr);
49 return kNullStream;
50 }
51};
52
53// If statement prevents unused variable warnings.
54#define DCHECK(expr) \
55 if (false && (expr)) \
56 ; \
57 else \
58 NullLogger().GetStream()
59#define DCHECK_OP(val1, val2, op) DCHECK((val1)op(val2))
60
61#define DCHECK_EQ(val1, val2) DCHECK_OP((val1), (val2), ==)
62#define DCHECK_NE(val1, val2) DCHECK_OP((val1), (val2), !=)
63#define DCHECK_LE(val1, val2) DCHECK_OP((val1), (val2), <=)
64#define DCHECK_LT(val1, val2) DCHECK_OP((val1), (val2), <)
65#define DCHECK_GE(val1, val2) DCHECK_OP((val1), (val2), >=)
66#define DCHECK_GT(val1, val2) DCHECK_OP((val1), (val2), >)
67
68// This class is used to log to std::cerr.
69class FatalLogger {
70 public:
71 FatalLogger(const char* file, int line) {
72 error_string_ << file << ":" << line << ": ";
73 }
74 ~FatalLogger() {
75 const std::string error_string = error_string_.str();
76 std::cerr << error_string << std::endl;
77 abort();
78 }
79 std::ostream& GetStream() { return error_string_; }
80
81 private:
82 std::ostringstream error_string_;
83};
84
85#define CHECK(condition) \
86 !(condition) ? FatalLogger(__FILE__, __LINE__).GetStream() \
87 : NullLogger().GetStream()
88
89#define CHECK_OP(val1, val2, op) CHECK((val1)op(val2))
90
91#define CHECK_EQ(val1, val2) CHECK_OP((val1), (val2), ==)
92#define CHECK_NE(val1, val2) CHECK_OP((val1), (val2), !=)
93#define CHECK_LE(val1, val2) CHECK_OP((val1), (val2), <=)
94#define CHECK_LT(val1, val2) CHECK_OP((val1), (val2), <)
95#define CHECK_GE(val1, val2) CHECK_OP((val1), (val2), >=)
96#define CHECK_GT(val1, val2) CHECK_OP((val1), (val2), >)
97
98// Helper for CHECK_NOTNULL(), using C++11 perfect forwarding.
99template <typename T>
100T CheckNotNull(T&& t) {
101 assert(t != nullptr);
102 return std::forward<T>(t);
103}
104#define CHECK_NOTNULL(val) CheckNotNull(val)
105
106#define LOG(severity) NullLogger().GetStream()
107
108#endif // RESONANCE_AUDIO_PLATFORM_LOGGING_H_
109

source code of qtmultimedia/src/3rdparty/resonance-audio/resonance_audio/base/logging.h