1 /**
2 * @file string_manip.h
3 * std::string helpers
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author Philippe Elie
9 * @author John Levon
10 */
11
12 #ifndef STRING_MANIP_H
13 #define STRING_MANIP_H
14
15 #include <string>
16 #include <vector>
17 #include <sstream>
18 #include <stdexcept>
19
20 /**
21 * @param str string
22 * @param ch the characterto search
23 *
24 * erase char from the begin of str to the last
25 * occurence of ch from and return the string
26 */
27 std::string erase_to_last_of(std::string const & str, char ch);
28
29 /// split string s by first occurence of char c, returning the second part.
30 /// s is set to the first part. Neither include the split character
31 std::string split(std::string & s, char c);
32
33 /// return true if "prefix" is a prefix of "s", behavior is undefined
34 /// if prefix is an empty string
35 bool is_prefix(std::string const & s, std::string const & prefix);
36
37 /**
38 * @param str the string to tokenize
39 * @param sep the separator_char
40 *
41 * separate fields in a string in a list of token; field are
42 * separated by the sep character, sep char can be escaped
43 * by '\\' to specify a sep char in a token, '\\' not followed
44 * by a sep is taken as it e.g. "\,\a" --> ",\a"
45 */
46 std::vector<std::string> separate_token(std::string const & str, char sep);
47
48 /// remove trim chars from start of input string return the new string
49 std::string ltrim(std::string const & str, std::string const & totrim = "\t ");
50 /// remove trim chars from end of input string return the new string
51 std::string rtrim(std::string const & str, std::string const & totrim = "\t ");
52 /// ltrim(rtrim(str))
53 std::string trim(std::string const & str, std::string const & totrim = "\t ");
54
55 /**
56 * format_percent - smart format of double percentage value
57 * @param value - the value
58 * @param int_width - the maximum integer integer width default to 2
59 * @param frac_width - the fractionnary width default to 4
60 * @param showpos - show + sign for positive values
61 *
62 * This formats a percentage into exactly the given width and returns
63 * it. If the integer part is larger than the given int_width, the
64 * returned string will be wider. The returned string is never
65 * shorter than (fract_with + int_width + 1)
66 *
67 */
68 std::string const
69 format_percent(double value, size_t int_width,
70 size_t frac_width, bool showpos = false);
71
72 /// prefered width to format percentage
73 static unsigned int const percent_int_width = 2;
74 static unsigned int const percent_fract_width = 4;
75 static unsigned int const percent_width = percent_int_width + percent_fract_width + 1;
76
77
78 /**
79 * @param src input parameter
80 * convert From src to a T through an istringstream.
81 *
82 * Throws invalid_argument if conversion fail.
83 *
84 * Note that this is not as foolproof as boost's lexical_cast
85 */
86 template <typename To, typename From>
op_lexical_cast(From const & src)87 To op_lexical_cast(From const & src)
88 {
89 std::ostringstream in;
90 if (!(in << src))
91 throw std::invalid_argument("op_lexical_cast<T>()");
92 std::istringstream out(in.str());
93 To value;
94 if (!(out >> value)) {
95 throw std::invalid_argument("op_lexical_cast<T>(\"" +
96 in.str() +"\")");
97 }
98 return value;
99 }
100
101 // specialization accepting hexadecimal and octal number in input. Note that
102 // op_lexical_cast<unsigned int>("0x23"); will fail because it call the
103 // non specialized template.
104 template <>
105 unsigned int op_lexical_cast<unsigned int>(std::string const & str);
106
107 #endif /* !STRING_MANIP_H */
108