• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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