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 */
4546class LogSeverity {
4647public:
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
129158private:
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