| /** |
| * @file string_manip.h |
| * std::string helpers |
| * |
| * @remark Copyright 2002 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author Philippe Elie |
| * @author John Levon |
| */ |
| |
| #ifndef STRING_MANIP_H |
| #define STRING_MANIP_H |
| |
| #include <string> |
| #include <vector> |
| #include <sstream> |
| #include <stdexcept> |
| |
| /** |
| * @param str string |
| * @param ch the characterto search |
| * |
| * erase char from the begin of str to the last |
| * occurence of ch from and return the string |
| */ |
| std::string erase_to_last_of(std::string const & str, char ch); |
| |
| /// split string s by first occurence of char c, returning the second part. |
| /// s is set to the first part. Neither include the split character |
| std::string split(std::string & s, char c); |
| |
| /// return true if "prefix" is a prefix of "s", behavior is undefined |
| /// if prefix is an empty string |
| bool is_prefix(std::string const & s, std::string const & prefix); |
| |
| /** |
| * @param str the string to tokenize |
| * @param sep the separator_char |
| * |
| * separate fields in a string in a list of token; field are |
| * separated by the sep character, sep char can be escaped |
| * by '\\' to specify a sep char in a token, '\\' not followed |
| * by a sep is taken as it e.g. "\,\a" --> ",\a" |
| */ |
| std::vector<std::string> separate_token(std::string const & str, char sep); |
| |
| /// remove trim chars from start of input string return the new string |
| std::string ltrim(std::string const & str, std::string const & totrim = "\t "); |
| /// remove trim chars from end of input string return the new string |
| std::string rtrim(std::string const & str, std::string const & totrim = "\t "); |
| /// ltrim(rtrim(str)) |
| std::string trim(std::string const & str, std::string const & totrim = "\t "); |
| |
| /** |
| * format_percent - smart format of double percentage value |
| * @param value - the value |
| * @param int_width - the maximum integer integer width default to 2 |
| * @param frac_width - the fractionnary width default to 4 |
| * @param showpos - show + sign for positive values |
| * |
| * This formats a percentage into exactly the given width and returns |
| * it. If the integer part is larger than the given int_width, the |
| * returned string will be wider. The returned string is never |
| * shorter than (fract_with + int_width + 1) |
| * |
| */ |
| std::string const |
| format_percent(double value, size_t int_width, |
| size_t frac_width, bool showpos = false); |
| |
| /// prefered width to format percentage |
| static unsigned int const percent_int_width = 2; |
| static unsigned int const percent_fract_width = 4; |
| static unsigned int const percent_width = percent_int_width + percent_fract_width + 1; |
| |
| |
| /** |
| * @param src input parameter |
| * convert From src to a T through an istringstream. |
| * |
| * Throws invalid_argument if conversion fail. |
| * |
| * Note that this is not as foolproof as boost's lexical_cast |
| */ |
| template <typename To, typename From> |
| To op_lexical_cast(From const & src) |
| { |
| std::ostringstream in; |
| if (!(in << src)) |
| throw std::invalid_argument("op_lexical_cast<T>()"); |
| std::istringstream out(in.str()); |
| To value; |
| if (!(out >> value)) { |
| throw std::invalid_argument("op_lexical_cast<T>(\"" + |
| in.str() +"\")"); |
| } |
| return value; |
| } |
| |
| // specialization accepting hexadecimal and octal number in input. Note that |
| // op_lexical_cast<unsigned int>("0x23"); will fail because it call the |
| // non specialized template. |
| template <> |
| unsigned int op_lexical_cast<unsigned int>(std::string const & str); |
| |
| #endif /* !STRING_MANIP_H */ |