ImmutableCString is a string class similar to CString except it's
immutable. ImmutableCString occupies 16 bytes instead of 8 for CString.
However, ImmutableCString is able to avoid memory allocation when
constructed from a string literal, and in that way it us similar
to StaticString.
ImmutableCString can be auto converted from StaticString.
The backend tag tracking is updated to use ImmutableCString and
the FrameGraph resource manager us updated to use StaticString.
Together these changes significantly cut down heap allocations due to
internal tagging.
We also add optional tracking to {Immutable}CString.
127 lines
3.3 KiB
C++
127 lines
3.3 KiB
C++
/*
|
|
* Copyright (C) 2025 The Android Open Source Project
|
|
*
|
|
* 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
|
|
*
|
|
* http://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.
|
|
*/
|
|
|
|
#ifndef TNT_UTILS_LOGGER_H
|
|
#define TNT_UTILS_LOGGER_H
|
|
|
|
// Logger.h provides a subset of the Abseil logging API, offering the following macros:
|
|
|
|
// **LOG(severity)**: Logs a message at the specified severity level.
|
|
// **DLOG(severity)**: Logs a message at the specified severity level only in debug builds.
|
|
|
|
// Supported `severity` levels are:
|
|
// * `INFO`
|
|
// * `WARNING`
|
|
// * `ERROR`
|
|
// * `FATAL`
|
|
|
|
// For programmatic control over logging severity, use the `LEVEL` macro:
|
|
|
|
// **LOG(LEVEL(expression))**: Logs a message at a severity level determined by the `expression`.
|
|
// The `expression` must return a `utils::LogSeverity` value, which is equivalent to
|
|
// `absl::LogSeverity`.
|
|
|
|
#if defined(FILAMENT_USE_ABSEIL_LOGGING)
|
|
|
|
#include <absl/base/log_severity.h>
|
|
#include <absl/log/log.h>
|
|
|
|
namespace utils {
|
|
using absl::LogSeverity;
|
|
}
|
|
|
|
#else
|
|
|
|
#include <utils/Log.h>
|
|
#include <utils/ostream.h>
|
|
|
|
namespace utils {
|
|
|
|
enum class LogSeverity : int {
|
|
kInfo = 0,
|
|
kWarning = 1,
|
|
kError = 2,
|
|
kFatal = 3,
|
|
};
|
|
|
|
template<typename Stream>
|
|
class LogLine {
|
|
public:
|
|
explicit LogLine(Stream& stream)
|
|
: mStream(stream) {}
|
|
|
|
LogLine(const LogLine&) = delete;
|
|
LogLine(LogLine&&) = delete;
|
|
LogLine& operator=(const LogLine&) = delete;
|
|
LogLine& operator=(LogLine&&) = delete;
|
|
|
|
~LogLine() noexcept { mStream << io::endl; }
|
|
|
|
template<typename T>
|
|
LogLine& operator<<(T&& value) {
|
|
mStream << std::forward<T>(value);
|
|
return *this;
|
|
}
|
|
|
|
private:
|
|
Stream& mStream;
|
|
};
|
|
|
|
static inline io::ostream& getLogStream(LogSeverity severity) {
|
|
switch (severity) {
|
|
case LogSeverity::kInfo:
|
|
return slog.d;
|
|
case LogSeverity::kWarning:
|
|
return slog.w;
|
|
case LogSeverity::kError:
|
|
return slog.e;
|
|
case LogSeverity::kFatal:
|
|
return slog.e;
|
|
default:
|
|
return slog.d;
|
|
}
|
|
}
|
|
|
|
struct NoopStream final {
|
|
template<typename T>
|
|
NoopStream& operator<<(const T&) {
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
#define LOG(severity) LOG_IMPL_##severity
|
|
|
|
#ifndef NDEBUG
|
|
#define DLOG(severity) DLOG_IMPL_##severity
|
|
#else
|
|
#define DLOG(severity) utils::NoopStream()
|
|
#endif
|
|
|
|
#define DLOG_IMPL_INFO utils::LogLine(utils::slog.d)
|
|
#define DLOG_IMPL_WARNING utils::LogLine(utils::slog.d)
|
|
#define DLOG_IMPL_ERROR utils::LogLine(utils::slog.d)
|
|
#define DLOG_IMPL_LEVEL(severity) utils::LogLine(((void) severity, utils::slog.d))
|
|
|
|
#define LOG_IMPL_INFO utils::LogLine(utils::slog.i)
|
|
#define LOG_IMPL_WARNING utils::LogLine(utils::slog.w)
|
|
#define LOG_IMPL_ERROR utils::LogLine(utils::slog.e)
|
|
#define LOG_IMPL_LEVEL(severity) utils::LogLine(getLogStream(severity))
|
|
|
|
}// namespace utils
|
|
#endif
|
|
|
|
#endif// TNT_UTILS_LOGGER_H
|