18#include "pw_log_tokenized/config.h"
21namespace log_tokenized {
25template <
typename T,
unsigned kBits,
unsigned kShift>
28 static constexpr T Get(T value) {
return (value >> kShift) & kMask; }
29 static constexpr T Shift(T value) {
30 return (value <= kMask ? value : T(0)) << kShift;
34 static constexpr T kMask = (T(1) << kBits) - 1;
37template <
typename T,
unsigned kShift>
40 static constexpr T Get(T) {
return 0; }
41 static constexpr T Shift(T) {
return 0; }
55template <
unsigned kLevelBits,
59 typename T = uintptr_t>
62 template <T log_level = 0, T module = 0, T flags = 0, T line = 0>
64 static_assert(log_level < (1 << kLevelBits),
"The level is too large!");
65 static_assert(line < (1 << kLineBits),
"The line number is too large!");
66 static_assert(
flags < (1 << kFlagBits),
"The flags are too large!");
67 static_assert(
module < (1 << kModuleBits),
"The module is too large!");
76 : value_(BitsFromMetadata(log_level,
module,
flags, line)) {}
81 constexpr T
level()
const {
return Level::Get(value_); }
88 constexpr T
flags()
const {
return Flags::Get(value_); }
92 constexpr T
module()
const {
return Module::Get(value_); }
95 constexpr T
value()
const {
return value_; }
104 static constexpr T BitsFromMetadata(T log_level, T
module, T
flags, T line) {
105 return Level::Shift(log_level) | Module::Shift(
module) |
106 Flags::Shift(
flags) | Line::Shift(line);
111 static_assert(kLevelBits + kLineBits + kFlagBits + kModuleBits <=
121using Metadata = GenericMetadata<PW_LOG_TOKENIZED_LEVEL_BITS,
122 PW_LOG_TOKENIZED_LINE_BITS,
123 PW_LOG_TOKENIZED_FLAG_BITS,
124 PW_LOG_TOKENIZED_MODULE_BITS>;
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27
Definition: metadata.h:26