C++程序  |  108行  |  3.33 KB

/**
 * @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 */