blob: 600463cf5db40903e3776f7aecd8e87056a80508 [file] [log] [blame]
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09001#ifndef STRUTIL_H_
2#define STRUTIL_H_
3
4#include <string>
5#include <vector>
6
7#include "string_piece.h"
8
9using namespace std;
10
11class WordScanner {
12 public:
13 struct Iterator {
14 Iterator& operator++();
15 StringPiece operator*() const;
16 bool operator!=(const Iterator& r) const {
17 return in != r.in || s != r.s || i != r.i;
18 }
19
20 const StringPiece* in;
21 int s;
22 int i;
23 };
24
25 explicit WordScanner(StringPiece in);
26
27 Iterator begin() const;
28 Iterator end() const;
29
30 private:
31 StringPiece in_;
32};
33
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090034class WordWriter {
35 public:
36 explicit WordWriter(string* o);
Shinichiro Hamaji37591ce2015-06-16 19:36:05 +090037 void MaybeAddWhitespace();
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090038 void Write(StringPiece s);
39
40 private:
41 string* out_;
42 bool needs_space_;
43};
44
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090045void InitSymtab();
46void QuitSymtab();
47StringPiece Intern(StringPiece s);
48
49template <class String>
50inline string JoinStrings(vector<String> v, const char* sep) {
51 string r;
52 for (StringPiece s : v) {
53 if (!r.empty()) {
54 r += sep;
55 }
56 r.append(s.begin(), s.end());
57 }
58 return r;
59}
60
Shinichiro Hamaji02fc55b2015-06-16 17:19:07 +090061void AppendString(StringPiece str, string* out);
62
63bool HasPrefix(StringPiece str, StringPiece prefix);
64
65bool HasSuffix(StringPiece str, StringPiece suffix);
66
67StringPiece TrimSuffix(StringPiece str, StringPiece suffix);
68
69void AppendSubstPattern(StringPiece str, StringPiece pat, StringPiece subst,
70 string* out);
71
72void AppendSubstRef(StringPiece str, StringPiece pat, StringPiece subst,
73 string* out);
74
Shinichiro Hamaji810fd032015-06-17 04:38:03 +090075string NoLineBreak(const string& s);
76
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090077#endif // STRUTIL_H_