Skip to content

Commit 17edea3

Browse files
BillyDonahueEvergreen Agent
authored andcommitted
SERVER-47698 LogSeverity constexpr refactor
1 parent 62b0831 commit 17edea3

File tree

2 files changed

+77
-103
lines changed

2 files changed

+77
-103
lines changed

src/mongo/logv2/log_severity.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,4 @@ StringData LogSeverity::toStringDataCompact() const {
9292
return "U"_sd;
9393
}
9494

95-
std::ostream& operator<<(std::ostream& os, LogSeverity severity) {
96-
return os << severity.toStringData();
97-
}
98-
9995
} // namespace mongo::logv2

src/mongo/logv2/log_severity.h

Lines changed: 77 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929

3030
#pragma once
3131

32-
#include <iosfwd>
32+
#include <algorithm>
33+
#include <iostream>
3334
#include <string>
3435

3536
#include "mongo/base/string_data.h"
@@ -44,47 +45,69 @@ namespace mongo::logv2 {
4445
*/
4546
class LogSeverity {
4647
public:
47-
//
48-
// Static factory methods for getting LogSeverity objects of the various severity levels.
49-
//
50-
51-
static inline LogSeverity Severe();
52-
static inline LogSeverity Error();
53-
static inline LogSeverity Warning();
54-
static inline LogSeverity Info();
55-
static inline LogSeverity Log(); // === Debug(0)
56-
5748
static constexpr int kMaxDebugLevel = 5;
5849

59-
// Construct a LogSeverity to represent the given debug level. Debug levels above
60-
// kMaxDebugLevel will be reset to kMaxDebugLevel.
61-
static inline LogSeverity Debug(int debugLevel);
50+
/**
51+
* Factory functions for getting LogSeverity objects of the various severity levels
52+
* @{
53+
*/
54+
static constexpr LogSeverity Severe() noexcept {
55+
return LogSeverity(-4);
56+
}
57+
static constexpr LogSeverity Error() noexcept {
58+
return LogSeverity(-3);
59+
}
60+
static constexpr LogSeverity Warning() noexcept {
61+
return LogSeverity(-2);
62+
}
63+
static constexpr LogSeverity Info() noexcept {
64+
return LogSeverity(-1);
65+
}
66+
/** Log() === Debug(0) */
67+
static constexpr LogSeverity Log() noexcept {
68+
return LogSeverity(0);
69+
}
70+
/** @} */
71+
72+
/**
73+
* Construct a LogSeverity to represent the given debug level.
74+
* Debug levels above kMaxDebugLevel will be clamped to kMaxDebugLevel.
75+
*/
76+
static constexpr LogSeverity Debug(int debugLevel) noexcept {
77+
return LogSeverity(std::min(debugLevel, kMaxDebugLevel));
78+
}
6279

6380
/**
6481
* Casts an integer to a severity.
65-
*
66-
* Do not use this. It exists to enable a handful of leftover uses of LOG(0).
6782
*/
68-
static inline LogSeverity cast(int);
83+
static constexpr LogSeverity cast(int ll) noexcept {
84+
return LogSeverity(ll);
85+
}
6986

70-
inline int toInt() const;
87+
constexpr int toInt() const noexcept {
88+
return _severity;
89+
}
7190

7291
/**
7392
* Returns a LogSeverity object that is one unit "more severe" than this one.
7493
*/
75-
inline LogSeverity moreSevere() const;
94+
constexpr LogSeverity moreSevere() const noexcept {
95+
return LogSeverity(_severity - 1);
96+
}
7697

7798
/**
7899
* Returns a LogSeverity object that is one unit "less severe" than this one.
79100
*/
80-
inline LogSeverity lessSevere() const;
101+
constexpr LogSeverity lessSevere() const noexcept {
102+
return LogSeverity(_severity + 1);
103+
}
81104

82105
/**
83106
* Returns a std::string naming this severity level.
84107
*
85108
* See toStringData(), below.
86109
*/
87-
inline std::string toString() const;
110+
std::string toString() const;
88111

89112
/**
90113
* Returns a StringData naming this security level.
@@ -104,30 +127,41 @@ class LogSeverity {
104127
*/
105128
StringData toStringDataCompact() const;
106129

107-
//
108-
// Comparison operations.
109-
//
110-
111-
/// Returns true if this is exactly as severe as other.
112-
inline bool operator==(const LogSeverity other) const;
113-
114-
/// Returns true if this is not exactly as severe as other.
115-
inline bool operator!=(const LogSeverity other) const;
116-
117-
/// Returns true if this is less severe than other.
118-
inline bool operator<(const LogSeverity other) const;
119-
120-
/// Returns true if this is no more severe than other.
121-
inline bool operator<=(const LogSeverity other) const;
122-
123-
/// Returns true if this is more severe than other.
124-
inline bool operator>(const LogSeverity other) const;
125-
126-
/// Returns true if this is no less severe than other.
127-
inline bool operator>=(const LogSeverity other) const;
130+
/**
131+
* Comparison operations.
132+
* @{
133+
*/
134+
friend constexpr bool operator==(LogSeverity a, LogSeverity b) noexcept {
135+
return a._order() == b._order();
136+
}
137+
friend constexpr bool operator!=(LogSeverity a, LogSeverity b) noexcept {
138+
return a._order() != b._order();
139+
}
140+
friend constexpr bool operator<(LogSeverity a, LogSeverity b) noexcept {
141+
return a._order() < b._order();
142+
}
143+
friend constexpr bool operator>(LogSeverity a, LogSeverity b) noexcept {
144+
return a._order() > b._order();
145+
}
146+
friend constexpr bool operator<=(LogSeverity a, LogSeverity b) noexcept {
147+
return a._order() <= b._order();
148+
}
149+
friend constexpr bool operator>=(LogSeverity a, LogSeverity b) noexcept {
150+
return a._order() >= b._order();
151+
}
152+
/** @} */
153+
154+
friend std::ostream& operator<<(std::ostream& os, LogSeverity severity) {
155+
return os << severity.toStringData();
156+
}
128157

129158
private:
130-
explicit LogSeverity(int severity) : _severity(severity) {}
159+
explicit constexpr LogSeverity(int severity) noexcept : _severity{severity} {}
160+
161+
/** Express the inverse sense of _severity for the comparison ops in one place. */
162+
constexpr int _order() noexcept {
163+
return -_severity;
164+
}
131165

132166
/// The stored severity. More negative is more severe. NOTE: This means that the >, <, >=
133167
/// and <= operators on LogSeverity have opposite sense of the same operators on the
@@ -142,60 +176,4 @@ class LogSeverity {
142176
int _severity;
143177
};
144178

145-
std::ostream& operator<<(std::ostream& os, LogSeverity severity);
146-
147-
LogSeverity LogSeverity::Severe() {
148-
return LogSeverity(-4);
149-
}
150-
LogSeverity LogSeverity::Error() {
151-
return LogSeverity(-3);
152-
}
153-
LogSeverity LogSeverity::Warning() {
154-
return LogSeverity(-2);
155-
}
156-
LogSeverity LogSeverity::Info() {
157-
return LogSeverity(-1);
158-
}
159-
LogSeverity LogSeverity::Log() {
160-
return LogSeverity(0);
161-
}
162-
LogSeverity LogSeverity::Debug(int debugLevel) {
163-
// It would be appropriate to use std::max or std::clamp instead,
164-
// but it seems better not to drag in all of <algorithm> here.
165-
return LogSeverity(debugLevel > kMaxDebugLevel ? kMaxDebugLevel : debugLevel);
166-
}
167-
168-
LogSeverity LogSeverity::cast(int ll) {
169-
return LogSeverity(ll);
170-
}
171-
172-
int LogSeverity::toInt() const {
173-
return _severity;
174-
}
175-
LogSeverity LogSeverity::moreSevere() const {
176-
return LogSeverity(_severity - 1);
177-
}
178-
LogSeverity LogSeverity::lessSevere() const {
179-
return LogSeverity(_severity + 1);
180-
}
181-
182-
bool LogSeverity::operator==(LogSeverity other) const {
183-
return _severity == other._severity;
184-
}
185-
bool LogSeverity::operator!=(LogSeverity other) const {
186-
return _severity != other._severity;
187-
}
188-
bool LogSeverity::operator<(LogSeverity other) const {
189-
return _severity > other._severity;
190-
}
191-
bool LogSeverity::operator<=(LogSeverity other) const {
192-
return _severity >= other._severity;
193-
}
194-
bool LogSeverity::operator>(LogSeverity other) const {
195-
return _severity < other._severity;
196-
}
197-
bool LogSeverity::operator>=(LogSeverity other) const {
198-
return _severity <= other._severity;
199-
}
200-
201179
} // namespace mongo::logv2

0 commit comments

Comments
 (0)