@ -8,39 +8,9 @@
# include "common/string_util.h"
namespace Log {
Filter : : Filter ( Level default_level ) {
ResetAll ( default_level ) ;
}
void Filter : : ResetAll ( Level level ) {
class_levels . fill ( level ) ;
}
void Filter : : SetClassLevel ( Class log_class , Level level ) {
class_levels [ static_cast < size_t > ( log_class ) ] = level ;
}
void Filter : : ParseFilterString ( const std : : string & filter_str ) {
auto clause_begin = filter_str . cbegin ( ) ;
while ( clause_begin ! = filter_str . cend ( ) ) {
auto clause_end = std : : find ( clause_begin , filter_str . cend ( ) , ' ' ) ;
// If clause isn't empty
if ( clause_end ! = clause_begin ) {
ParseFilterRule ( clause_begin , clause_end ) ;
}
if ( clause_end ! = filter_str . cend ( ) ) {
// Skip over the whitespace
+ + clause_end ;
}
clause_begin = clause_end ;
}
}
namespace {
template < typename It >
static Level GetLevelByName ( const It begin , const It end ) {
Level GetLevelByName ( const It begin , const It end ) {
for ( u8 i = 0 ; i < static_cast < u8 > ( Level : : Count ) ; + + i ) {
const char * level_name = GetLevelName ( static_cast < Level > ( i ) ) ;
if ( Common : : ComparePartialString ( begin , end , level_name ) ) {
@ -51,7 +21,7 @@ static Level GetLevelByName(const It begin, const It end) {
}
template < typename It >
static Class GetClassByName ( const It begin , const It end ) {
Class GetClassByName ( const It begin , const It end ) {
for ( ClassType i = 0 ; i < static_cast < ClassType > ( Class : : Count ) ; + + i ) {
const char * level_name = GetLogClassName ( static_cast < Class > ( i ) ) ;
if ( Common : : ComparePartialString ( begin , end , level_name ) ) {
@ -61,8 +31,8 @@ static Class GetClassByName(const It begin, const It end) {
return Class : : Count ;
}
bool Filter : : ParseFilterRule ( const std : : string : : const_iterator begin ,
const std : : string : : const_i terator end ) {
template < typename Iterator >
bool ParseFilterRule ( Filter & instance , Iterator begin , I terator end ) {
auto level_separator = std : : find ( begin , end , ' : ' ) ;
if ( level_separator = = end ) {
LOG_ERROR ( Log , " Invalid log filter. Must specify a log level after `:`: {} " ,
@ -77,7 +47,7 @@ bool Filter::ParseFilterRule(const std::string::const_iterator begin,
}
if ( Common : : ComparePartialString ( begin , level_separator , " * " ) ) {
ResetAll( level ) ;
instance. ResetAll( level ) ;
return true ;
}
@ -87,9 +57,40 @@ bool Filter::ParseFilterRule(const std::string::const_iterator begin,
return false ;
}
SetClassLevel( log_class , level ) ;
instance. SetClassLevel( log_class , level ) ;
return true ;
}
} // Anonymous namespace
Filter : : Filter ( Level default_level ) {
ResetAll ( default_level ) ;
}
void Filter : : ResetAll ( Level level ) {
class_levels . fill ( level ) ;
}
void Filter : : SetClassLevel ( Class log_class , Level level ) {
class_levels [ static_cast < size_t > ( log_class ) ] = level ;
}
void Filter : : ParseFilterString ( std : : string_view filter_view ) {
auto clause_begin = filter_view . cbegin ( ) ;
while ( clause_begin ! = filter_view . cend ( ) ) {
auto clause_end = std : : find ( clause_begin , filter_view . cend ( ) , ' ' ) ;
// If clause isn't empty
if ( clause_end ! = clause_begin ) {
ParseFilterRule ( * this , clause_begin , clause_end ) ;
}
if ( clause_end ! = filter_view . cend ( ) ) {
// Skip over the whitespace
+ + clause_end ;
}
clause_begin = clause_end ;
}
}
bool Filter : : CheckMessage ( Class log_class , Level level ) const {
return static_cast < u8 > ( level ) > = static_cast < u8 > ( class_levels [ static_cast < size_t > ( log_class ) ] ) ;