aboutsummaryrefslogtreecommitdiff
path: root/pw_log/public/pw_log/internal/glog_adapter.h
diff options
context:
space:
mode:
Diffstat (limited to 'pw_log/public/pw_log/internal/glog_adapter.h')
-rw-r--r--pw_log/public/pw_log/internal/glog_adapter.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/pw_log/public/pw_log/internal/glog_adapter.h b/pw_log/public/pw_log/internal/glog_adapter.h
new file mode 100644
index 000000000..3e63b90df
--- /dev/null
+++ b/pw_log/public/pw_log/internal/glog_adapter.h
@@ -0,0 +1,91 @@
+// Copyright 2022 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+#pragma once
+
+#include "pw_assert/check.h"
+#include "pw_log/glog_adapter_config.h"
+#include "pw_log/levels.h"
+#include "pw_log/log.h"
+#include "pw_string/string_builder.h"
+
+namespace pw::log::internal {
+
+class GlogStreamingLog {
+ public:
+ GlogStreamingLog() = default;
+
+ template <typename T>
+ GlogStreamingLog& operator<<(const T& value) {
+ string_builder_ << value;
+ return *this;
+ }
+
+ protected:
+ pw::StringBuffer<PW_LOG_CFG_GLOG_BUFFER_SIZE_BYTES> string_builder_;
+};
+
+} // namespace pw::log::internal
+
+// Declares a unique GlogStreamingLog class definition with a destructor which
+// matches the desired pw_log_level.
+#define _PW_LOG_GLOG_DECLARATION_PW_LOG(pw_log_level, unique) \
+ class unique : public ::pw::log::internal::GlogStreamingLog { \
+ public: \
+ ~unique() { \
+ PW_HANDLE_LOG( \
+ pw_log_level, PW_LOG_FLAGS, "%s", string_builder_.c_str()); \
+ } \
+ }
+
+// Declares a unique GlogStreamingLog class definition with a destructor which
+// invokes PW_CRASH.
+#define _PW_LOG_GLOG_DECLARATION_PW_CRASH(unique) \
+ class unique : public ::pw::log::internal::GlogStreamingLog { \
+ public: \
+ ~unique() { PW_CRASH("%s", string_builder_.c_str()); } \
+ }
+
+// Dispatching macros to translate the glog level to PW_LOG and PW_CRASH.
+#define _PW_LOG_GLOG_DECLARATION_DEBUG(unique) \
+ _PW_LOG_GLOG_DECLARATION_PW_LOG(PW_LOG_LEVEL_DEBUG, unique)
+
+#define _PW_LOG_GLOG_DECLARATION_INFO(unique) \
+ _PW_LOG_GLOG_DECLARATION_PW_LOG(PW_LOG_LEVEL_INFO, unique)
+
+#define _PW_LOG_GLOG_DECLARATION_WARNING(unique) \
+ _PW_LOG_GLOG_DECLARATION_PW_LOG(PW_LOG_LEVEL_WARN, unique)
+
+#define _PW_LOG_GLOG_DECLARATION_ERROR(unique) \
+ _PW_LOG_GLOG_DECLARATION_PW_LOG(PW_LOG_LEVEL_ERROR, unique)
+
+#define _PW_LOG_GLOG_DECLARATION_FATAL(unique) \
+ _PW_LOG_GLOG_DECLARATION_PW_CRASH(unique)
+
+#if defined(NDEBUG)
+#define _PW_LOG_GLOG_DECLARATION_DFATAL(unique) \
+ _PW_LOG_GLOG_DECLARATION_PW_LOG(PW_LOG_LEVEL_ERROR, unique)
+#else // !defined(NDEBUG)
+#define _PW_LOG_GLOG_DECLARATION_DFATAL(unique) \
+ _PW_LOG_GLOG_DECLARATION_PW_CRASH(unique)
+#endif // defined(NDEBUG)
+
+#define _PW_LOG_GLOG(glog_declaration, unique) \
+ glog_declaration(unique); \
+ unique()
+
+#define _PW_LOG_GLOG_IF(glog_declaration, expr, unique) \
+ glog_declaration(unique); \
+ if (!(expr)) { \
+ } else \
+ unique()