mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 12:50:06 +00:00 
			
		
		
		
	Migrate UGC from std::regex to RE2
This commit is contained in:
		
							parent
							
								
									ad87fc77fe
								
							
						
					
					
						commit
						4f309ecb39
					
				
					 1 changed files with 10 additions and 9 deletions
				
			
		|  | @ -2,12 +2,12 @@ | ||||||
| #include <scwx/util/logger.hpp> | #include <scwx/util/logger.hpp> | ||||||
| 
 | 
 | ||||||
| #include <map> | #include <map> | ||||||
| #include <regex> |  | ||||||
| 
 | 
 | ||||||
| #include <boost/assign.hpp> | #include <boost/assign.hpp> | ||||||
| #include <boost/bimap.hpp> | #include <boost/bimap.hpp> | ||||||
| #include <boost/bimap/unordered_set_of.hpp> | #include <boost/bimap/unordered_set_of.hpp> | ||||||
| #include <boost/tokenizer.hpp> | #include <boost/tokenizer.hpp> | ||||||
|  | #include <re2/re2.h> | ||||||
| 
 | 
 | ||||||
| namespace scwx | namespace scwx | ||||||
| { | { | ||||||
|  | @ -104,10 +104,10 @@ bool Ugc::Parse(const std::vector<std::string>& ugcString) | ||||||
|    bool dataValid = false; |    bool dataValid = false; | ||||||
| 
 | 
 | ||||||
|    // UGC takes the form SSFNNN-NNN>NNN-SSFNNN-DDHHMM- (NWSI 10-1702)
 |    // UGC takes the form SSFNNN-NNN>NNN-SSFNNN-DDHHMM- (NWSI 10-1702)
 | ||||||
|    static const std::regex reStart {"[A-Z]{2}[CZ]([0-9]{3}|ALL)"}; |    static constexpr LazyRE2 reStart          = {"[A-Z]{2}[CZ]([0-9]{3}|ALL)"}; | ||||||
|    static const std::regex reAnyFipsId {"([0-9]{3}|ALL)"}; |    static constexpr LazyRE2 reAnyFipsId      = {"([0-9]{3}|ALL)"}; | ||||||
|    static const std::regex reSpecificFipsId {"(?!0{3})[0-9]{3}"}; |    static constexpr LazyRE2 reSpecificFipsId = {"[0-9]{3}"}; | ||||||
|    static const std::regex reProductExpiration {"[0-9]{6}"}; |    static constexpr LazyRE2 reProductExpiration = {"[0-9]{6}"}; | ||||||
| 
 | 
 | ||||||
|    std::stringstream ugcStream; |    std::stringstream ugcStream; | ||||||
|    for (auto& line : ugcString) |    for (auto& line : ugcString) | ||||||
|  | @ -131,7 +131,7 @@ bool Ugc::Parse(const std::vector<std::string>& ugcString) | ||||||
|    for (auto& token : tokens) |    for (auto& token : tokens) | ||||||
|    { |    { | ||||||
|       // Product Expiration is the final token
 |       // Product Expiration is the final token
 | ||||||
|       if (std::regex_match(token, reProductExpiration)) |       if (RE2::FullMatch(token, *reProductExpiration)) | ||||||
|       { |       { | ||||||
|          p->productExpiration_ = token; |          p->productExpiration_ = token; | ||||||
|          dataValid             = true; |          dataValid             = true; | ||||||
|  | @ -153,7 +153,7 @@ bool Ugc::Parse(const std::vector<std::string>& ugcString) | ||||||
| 
 | 
 | ||||||
|       // Look for the start of the UGC string (may be multiple per UGC string
 |       // Look for the start of the UGC string (may be multiple per UGC string
 | ||||||
|       // for multiple states, territories, or marine area)
 |       // for multiple states, territories, or marine area)
 | ||||||
|       if (std::regex_match(firstToken, reStart)) |       if (RE2::FullMatch(firstToken, *reStart)) | ||||||
|       { |       { | ||||||
|          currentState  = firstToken.substr(0, 2); |          currentState  = firstToken.substr(0, 2); | ||||||
|          currentFormat = ugcFormatMap_.right.at(firstToken.at(2)); |          currentFormat = ugcFormatMap_.right.at(firstToken.at(2)); | ||||||
|  | @ -167,7 +167,7 @@ bool Ugc::Parse(const std::vector<std::string>& ugcString) | ||||||
|       } |       } | ||||||
|       // Look for additional FIPS IDs in the UGC string
 |       // Look for additional FIPS IDs in the UGC string
 | ||||||
|       else if (!currentState.empty() && |       else if (!currentState.empty() && | ||||||
|                std::regex_match(firstToken, reAnyFipsId)) |                RE2::FullMatch(firstToken, *reAnyFipsId)) | ||||||
|       { |       { | ||||||
|          firstFipsId = firstToken; |          firstFipsId = firstToken; | ||||||
|       } |       } | ||||||
|  | @ -188,7 +188,8 @@ bool Ugc::Parse(const std::vector<std::string>& ugcString) | ||||||
|       { |       { | ||||||
|          std::string secondToken {(++tokenIt).current_token()}; |          std::string secondToken {(++tokenIt).current_token()}; | ||||||
| 
 | 
 | ||||||
|          if (std::regex_match(secondToken, reSpecificFipsId)) |          if (RE2::FullMatch(secondToken, *reSpecificFipsId) && | ||||||
|  |              secondToken != "000") | ||||||
|          { |          { | ||||||
|             secondFipsId = secondToken; |             secondFipsId = secondToken; | ||||||
|          } |          } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat