Branch data Line data Source code
1 : : // ***************************************************************************** 2 : : /*! 3 : : \file src/string_util.cpp 4 : : \copyright 2022-2025 J. Bakosi, 5 : : All rights reserved. See the LICENSE file for details. 6 : : \brief Piac string utilities 7 : : */ 8 : : // ***************************************************************************** 9 : : 10 : : #include <regex> 11 : : 12 : : #include "string_util.hpp" 13 : : 14 : : void 15 : 67 : piac::trim( std::string& s ) 16 : : // **************************************************************************** 17 : : // Trim a string to remove white space from front and back 18 : : //! \param[in,out] s String to remove white spaces from 19 : : // **************************************************************************** 20 : : { 21 [ + - ]: 134 : const std::string WHITESPACE( " \n\r\t\f\v" ); 22 : 67 : auto p = s.find_first_not_of( WHITESPACE ); 23 [ + + ][ + - ]: 67 : s = p == std::string::npos ? "" : s.substr( p ); [ + - ][ + + ] 24 : 67 : p = s.find_last_not_of( WHITESPACE ); 25 [ + + ][ + - ]: 67 : s = p == std::string::npos ? "" : s.substr( 0, p + 1 ); [ + - ][ + + ] 26 : 67 : } 27 : : 28 : : std::vector< std::string > 29 : 58 : piac::tokenize( const std::string& s ) 30 : : // **************************************************************************** 31 : : // Tokenize, i.e., break up, a string along white space into words 32 : : //! \param[in] s String to tokenize 33 : : //! \return Tokenized string 34 : : // **************************************************************************** 35 : : { 36 [ - + ]: 58 : if (s.empty()) return {}; 37 : : using std::regex; 38 : : using std::string; 39 : : using std::sregex_token_iterator; 40 [ + - ]: 116 : regex re( "[ \n\r\t\f\v]" ); 41 [ + - ]: 116 : sregex_token_iterator it( begin(s), end(s), re, -1 ); 42 [ + - ]: 116 : sregex_token_iterator reg_end; 43 : 116 : std::vector< std::string > tokens; 44 [ + - ][ + + ]: 179 : for (; it != reg_end; ++it) tokens.push_back( it->str() ); [ + - ][ + - ] [ + - ] 45 : 58 : return tokens; 46 : : } 47 : : 48 : : [[nodiscard]] int 49 : 15 : piac::wordcount( const std::string& s ) 50 : : // **************************************************************************** 51 : : // Count the number of words in a string 52 : : //! \param[in] s String to count words in 53 : : //! \return Number of words found in string 54 : : // **************************************************************************** 55 : : { 56 : 15 : auto str = s.data(); 57 [ - + ]: 15 : if (str == nullptr) return 0; 58 : 15 : bool inSpaces = true; 59 : 15 : int numWords = 0; 60 [ + + ]: 2555 : while (*str != '\0') { 61 [ + + ]: 2540 : if (std::isspace(*str)) { 62 : 359 : inSpaces = true; 63 [ + + ]: 2181 : } else if (inSpaces) { 64 : 374 : numWords++; 65 : 374 : inSpaces = false; 66 : : } 67 : 2540 : ++str; 68 : : } 69 : 15 : return numWords; 70 : : } 71 : : 72 : : [[nodiscard]] std::pair< std::string, std::string > 73 : 3 : piac::split( std::string s, const std::string& delim ) 74 : : // **************************************************************************** 75 : : // Split string into two substrings at delimiter 76 : : //! \param[in] s String to split 77 : : //! \param[in] delim Delimiter at which to split 78 : : // **************************************************************************** 79 : : { 80 : 3 : trim( s ); 81 : 3 : auto p = s.find_last_of( delim ); 82 [ - + ][ - - ]: 3 : return { s.substr(0,p), p == std::string::npos ? "" : s.substr(p+1) }; [ + - ][ - + ] 83 : : }