1 | |
---|
2 | #ifndef STRINGFORMAT_H_ |
---|
3 | #define STRINGFORMAT_H_ |
---|
4 | |
---|
5 | #include "boost/xpressive/xpressive.hpp" |
---|
6 | |
---|
7 | namespace ariba { |
---|
8 | namespace utility { |
---|
9 | namespace string_format { |
---|
10 | |
---|
11 | using boost::xpressive::sregex; |
---|
12 | |
---|
13 | class regex_nav { |
---|
14 | private: |
---|
15 | typedef boost::xpressive::smatch _match; |
---|
16 | typedef _match::nested_results_type nested_results; |
---|
17 | typedef nested_results::const_iterator nested_iterator; |
---|
18 | const _match& match; |
---|
19 | |
---|
20 | public: |
---|
21 | regex_nav(const _match& match) : |
---|
22 | match(match) { |
---|
23 | } |
---|
24 | |
---|
25 | regex_nav() : |
---|
26 | match(*((const _match*) NULL)) { |
---|
27 | } |
---|
28 | |
---|
29 | bool matched() const { |
---|
30 | return &match != NULL; |
---|
31 | } |
---|
32 | |
---|
33 | regex_nav operator[] (const sregex& type) const { |
---|
34 | const nested_results& nr = match.nested_results(); |
---|
35 | for (nested_iterator i = nr.begin(); i != nr.end(); i++) { |
---|
36 | if (i->regex_id() == type.regex_id()) return regex_nav(*i); |
---|
37 | } |
---|
38 | return regex_nav(); |
---|
39 | } |
---|
40 | |
---|
41 | regex_nav operator[](int index) const { |
---|
42 | const nested_results& nr = match.nested_results(); |
---|
43 | for (nested_iterator i = nr.begin(); i != nr.end() && index >= 0; i++) { |
---|
44 | if (index == 0) return regex_nav(*i); |
---|
45 | index--; |
---|
46 | } |
---|
47 | return regex_nav(); |
---|
48 | } |
---|
49 | |
---|
50 | int size() const { |
---|
51 | return match.nested_results().size(); |
---|
52 | } |
---|
53 | |
---|
54 | std::string str() const { |
---|
55 | if (!matched()) return std::string("<no match>"); |
---|
56 | return match[0].str(); |
---|
57 | } |
---|
58 | }; |
---|
59 | |
---|
60 | // regex: string |
---|
61 | extern const sregex rstring; |
---|
62 | |
---|
63 | // regex: base64 encoding |
---|
64 | extern const sregex rbase64; |
---|
65 | |
---|
66 | // regex: raw alphabet |
---|
67 | extern const sregex rchars; |
---|
68 | |
---|
69 | // regex: integer |
---|
70 | extern const sregex rint; |
---|
71 | |
---|
72 | // regex: binary label |
---|
73 | extern const sregex rlabel; |
---|
74 | |
---|
75 | // regex: dot separated identifier |
---|
76 | extern const sregex rid; |
---|
77 | |
---|
78 | // regex: "leaf" data |
---|
79 | extern const sregex rdata; |
---|
80 | |
---|
81 | // regex: fields |
---|
82 | extern const sregex rfield_label; |
---|
83 | extern const sregex rfield; |
---|
84 | extern const sregex rfields; |
---|
85 | |
---|
86 | // regex: objects |
---|
87 | extern const sregex robject_data; |
---|
88 | extern const sregex robject_id; |
---|
89 | extern const sregex robject; |
---|
90 | extern const sregex robjects; |
---|
91 | |
---|
92 | }}} |
---|
93 | |
---|
94 | #endif /* STRINGFORMAT_H_ */ |
---|