/**
* \file string.hh
- * Functions related to string manipulations.
+ * Functions and classes related to string manipulation.
*/
#include <string>
+#include <boost/noncopyable.hpp>
+
namespace moof {
string wide_to_multi(const wstring& wide);
-} // namespace moof
+/**
+ * Class exposing the pattern-matching and substitution methods used in
+ * Lua.
+ */
+class regex : public boost::noncopyable
+{
+public:
+
+ /**
+ * Construct a regex object.
+ */
+ regex() {}
+
+ /**
+ * Construct a regex object with a pattern.
+ * \param pattern The pattern.
+ */
+ regex(const string& pattern);
+
+ /**
+ * Construct a regex object with a pattern and source to match.
+ * \param pattern The pattern.
+ * \param source The source string.
+ */
+ regex(const string& pattern, const string& source);
+
+ /**
+ * Deconstruct the regex.
+ */
+ ~regex();
+
+
+ /**
+ * Get the regex pattern.
+ */
+ string pattern() const;
+
+ /**
+ * Set the regex pattern.
+ */
+ void pattern(const string& pattern);
+
+
+ /**
+ * Match a string against the pattern iteratively.
+ * \param source The source string.
+ */
+ void match(const string& source);
+
+ /**
+ * Get the next match. If the pattern contains captures, this version
+ * will only get the first capture.
+ * \param match Reference to a string to be assigned the match.
+ * \return True if there was a match to get, false otherwise.
+ */
+ bool get(string& match);
+
+ /**
+ * Get the next match. Use this version if the pattern contains more
+ * than one capture to get all of the captures.
+ * \param captures Reference to a vector of strings to hold the result.
+ * \return True if there was a match to get, false otherwise.
+ */
+ bool get(std::vector<string>& captures);
+
+
+ /**
+ * Match a string against a pattern all at one time.
+ * \param pattern The pattern.
+ * \param source The source string.
+ * \param position The index of the first character of source to match.
+ * \return The match.
+ */
+ static string match(const string& pattern,
+ const string& source,
+ int position = 0)
+ {
+ string match;
+ regex::match(match, pattern, source, position);
+ return match;
+ }
+
+ /**
+ * Match a string against a pattern all at one time.
+ * \param match A reference to a string to be assigned the match.
+ * \param pattern The pattern.
+ * \param source The source string.
+ * \param position The index of the first character of source to match.
+ * \return True if a match was made, false otherwise.
+ */
+ static bool match(string& match,
+ const string& pattern,
+ const string& source,
+ int position = 0);
+
+ /**
+ * Match a string against a pattern all at one time. If the pattern
+ * contains captures, the resulting vector will contain all of the
+ * captures.
+ * \param captures A reference to a vector of strings to contain the
+ * result.
+ * \param pattern The pattern.
+ * \param source The source string.
+ * \param position The index of the first character of source to match.
+ * \return True if a match was made, false otherwise.
+ */
+ static bool match(std::vector<string>& captures,
+ const string& pattern,
+ const string& source,
+ int position = 0);
+
+
+ /**
+ * Substitute a string using a pattern and replacement string.
+ * \param pattern The pattern.
+ * \param source The source string.
+ * \param replacement The replacement string; may also contain
+ * references to captures.
+ * \return The string with any substitutions made.
+ */
+ static string sub(const string& pattern,
+ const string& source,
+ const string& replacement)
+ {
+ string substitution;
+ regex::sub(substitution, pattern, source, replacement);
+ return substitution;
+ }
+
+ /**
+ * Substitute a string using a pattern and replacement string.
+ * \param substitution A reference to a string to contain the result.
+ * \param pattern The pattern.
+ * \param source The source string.
+ * \param replacement The replacement string; may also contain
+ * references to captures.
+ * \return The number of substitutions made.
+ */
+ static int sub(string& substitution,
+ const string& pattern,
+ const string& source,
+ const string& replacement);
+};
+
+} // namespace moof
#endif // _MOOF_STRINGTOOLS_HH_