]> granicus.if.org Git - icinga2/blob - lib/base/string.hpp
Merge pull request #7185 from Icinga/bugfix/gelfwriter-wrong-log-facility
[icinga2] / lib / base / string.hpp
1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
3 #ifndef STRING_H
4 #define STRING_H
5
6 #include "base/i2-base.hpp"
7 #include "base/object.hpp"
8 #include <boost/range/iterator.hpp>
9 #include <string>
10 #include <iosfwd>
11
12 namespace icinga {
13
14 class Value;
15
16 /**
17  * String class.
18  *
19  * Rationale for having this: The std::string class has an ambiguous assignment
20  * operator when used in conjunction with the Value class.
21  */
22 class String
23 {
24 public:
25         typedef std::string::iterator Iterator;
26         typedef std::string::const_iterator ConstIterator;
27
28         typedef std::string::iterator iterator;
29         typedef std::string::const_iterator const_iterator;
30
31         typedef std::string::reverse_iterator ReverseIterator;
32         typedef std::string::const_reverse_iterator ConstReverseIterator;
33
34         typedef std::string::reverse_iterator reverse_iterator;
35         typedef std::string::const_reverse_iterator const_reverse_iterator;
36
37         typedef std::string::size_type SizeType;
38
39         String() = default;
40         String(const char *data);
41         String(std::string data);
42         String(String::SizeType n, char c);
43         String(const String& other);
44         String(String&& other);
45
46 #ifndef _MSC_VER
47         String(Value&& other);
48 #endif /* _MSC_VER */
49
50         template<typename InputIterator>
51         String(InputIterator begin, InputIterator end)
52                 : m_Data(begin, end)
53         { }
54
55         String& operator=(const String& rhs);
56         String& operator=(String&& rhs);
57         String& operator=(Value&& rhs);
58         String& operator=(const std::string& rhs);
59         String& operator=(const char *rhs);
60
61         const char& operator[](SizeType pos) const;
62         char& operator[](SizeType pos);
63
64         String& operator+=(const String& rhs);
65         String& operator+=(const char *rhs);
66         String& operator+=(const Value& rhs);
67         String& operator+=(char rhs);
68
69         bool IsEmpty() const;
70
71         bool operator<(const String& rhs) const;
72
73         operator const std::string&() const;
74
75         const char *CStr() const;
76
77         void Clear();
78
79         SizeType GetLength() const;
80
81         std::string& GetData();
82         const std::string& GetData() const;
83
84         SizeType Find(const String& str, SizeType pos = 0) const;
85         SizeType RFind(const String& str, SizeType pos = NPos) const;
86         SizeType FindFirstOf(const char *s, SizeType pos = 0) const;
87         SizeType FindFirstOf(char ch, SizeType pos = 0) const;
88         SizeType FindFirstNotOf(const char *s, SizeType pos = 0) const;
89         SizeType FindFirstNotOf(char ch, SizeType pos = 0) const;
90         SizeType FindLastOf(const char *s, SizeType pos = NPos) const;
91         SizeType FindLastOf(char ch, SizeType pos = NPos) const;
92
93         String SubStr(SizeType first, SizeType len = NPos) const;
94
95         std::vector<String> Split(const char *separators) const;
96
97         void Replace(SizeType first, SizeType second, const String& str);
98
99         String Trim() const;
100
101         String ToLower() const;
102
103         String ToUpper() const;
104
105         String Reverse() const;
106
107         void Append(int count, char ch);
108
109         bool Contains(const String& str) const;
110
111         void swap(String& str);
112
113         Iterator erase(Iterator first, Iterator last);
114
115         template<typename InputIterator>
116         void insert(Iterator p, InputIterator first, InputIterator last)
117         {
118                 m_Data.insert(p, first, last);
119         }
120
121         Iterator Begin();
122         ConstIterator Begin() const;
123         Iterator End();
124         ConstIterator End() const;
125         ReverseIterator RBegin();
126         ConstReverseIterator RBegin() const;
127         ReverseIterator REnd();
128         ConstReverseIterator REnd() const;
129
130         static const SizeType NPos;
131
132         static Object::Ptr GetPrototype();
133
134 private:
135         std::string m_Data;
136 };
137
138 std::ostream& operator<<(std::ostream& stream, const String& str);
139 std::istream& operator>>(std::istream& stream, String& str);
140
141 String operator+(const String& lhs, const String& rhs);
142 String operator+(const String& lhs, const char *rhs);
143 String operator+(const char *lhs, const String& rhs);
144
145 bool operator==(const String& lhs, const String& rhs);
146 bool operator==(const String& lhs, const char *rhs);
147 bool operator==(const char *lhs, const String& rhs);
148
149 bool operator<(const String& lhs, const char *rhs);
150 bool operator<(const char *lhs, const String& rhs);
151
152 bool operator>(const String& lhs, const String& rhs);
153 bool operator>(const String& lhs, const char *rhs);
154 bool operator>(const char *lhs, const String& rhs);
155
156 bool operator<=(const String& lhs, const String& rhs);
157 bool operator<=(const String& lhs, const char *rhs);
158 bool operator<=(const char *lhs, const String& rhs);
159
160 bool operator>=(const String& lhs, const String& rhs);
161 bool operator>=(const String& lhs, const char *rhs);
162 bool operator>=(const char *lhs, const String& rhs);
163
164 bool operator!=(const String& lhs, const String& rhs);
165 bool operator!=(const String& lhs, const char *rhs);
166 bool operator!=(const char *lhs, const String& rhs);
167
168 String::Iterator begin(String& x);
169 String::ConstIterator begin(const String& x);
170 String::Iterator end(String& x);
171 String::ConstIterator end(const String& x);
172 String::Iterator range_begin(String& x);
173 String::ConstIterator range_begin(const String& x);
174 String::Iterator range_end(String& x);
175 String::ConstIterator range_end(const String& x);
176
177 }
178
179 extern template class std::vector<icinga::String>;
180
181 namespace boost
182 {
183
184 template<>
185 struct range_mutable_iterator<icinga::String>
186 {
187         typedef icinga::String::Iterator type;
188 };
189
190 template<>
191 struct range_const_iterator<icinga::String>
192 {
193         typedef icinga::String::ConstIterator type;
194 };
195
196 }
197
198 #endif /* STRING_H */