Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/locale/boundary/segment.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
15:663ca0da4350 | 16:2665513ce2d3 |
---|---|
1 // | |
2 // Copyright (c) 2009-2011 Artyom Beilis (Tonkikh) | |
3 // | |
4 // Distributed under the Boost Software License, Version 1.0. (See | |
5 // accompanying file LICENSE_1_0.txt or copy at | |
6 // http://www.boost.org/LICENSE_1_0.txt) | |
7 // | |
8 #ifndef BOOST_LOCALE_BOUNDARY_SEGMENT_HPP_INCLUDED | |
9 #define BOOST_LOCALE_BOUNDARY_SEGMENT_HPP_INCLUDED | |
10 #include <boost/locale/config.hpp> | |
11 #ifdef BOOST_MSVC | |
12 # pragma warning(push) | |
13 # pragma warning(disable : 4275 4251 4231 4660) | |
14 #endif | |
15 #include <locale> | |
16 #include <string> | |
17 #include <iosfwd> | |
18 #include <iterator> | |
19 | |
20 | |
21 namespace boost { | |
22 namespace locale { | |
23 namespace boundary { | |
24 /// \cond INTERNAL | |
25 namespace details { | |
26 template<typename LeftIterator,typename RightIterator> | |
27 int compare_text(LeftIterator l_begin,LeftIterator l_end,RightIterator r_begin,RightIterator r_end) | |
28 { | |
29 typedef LeftIterator left_iterator; | |
30 typedef RightIterator right_iterator; | |
31 typedef typename std::iterator_traits<left_iterator>::value_type char_type; | |
32 typedef std::char_traits<char_type> traits; | |
33 while(l_begin!=l_end && r_begin!=r_end) { | |
34 char_type lchar = *l_begin++; | |
35 char_type rchar = *r_begin++; | |
36 if(traits::eq(lchar,rchar)) | |
37 continue; | |
38 if(traits::lt(lchar,rchar)) | |
39 return -1; | |
40 else | |
41 return 1; | |
42 } | |
43 if(l_begin==l_end && r_begin==r_end) | |
44 return 0; | |
45 if(l_begin==l_end) | |
46 return -1; | |
47 else | |
48 return 1; | |
49 } | |
50 | |
51 | |
52 template<typename Left,typename Right> | |
53 int compare_text(Left const &l,Right const &r) | |
54 { | |
55 return compare_text(l.begin(),l.end(),r.begin(),r.end()); | |
56 } | |
57 | |
58 template<typename Left,typename Char> | |
59 int compare_string(Left const &l,Char const *begin) | |
60 { | |
61 Char const *end = begin; | |
62 while(*end!=0) | |
63 end++; | |
64 return compare_text(l.begin(),l.end(),begin,end); | |
65 } | |
66 | |
67 template<typename Right,typename Char> | |
68 int compare_string(Char const *begin,Right const &r) | |
69 { | |
70 Char const *end = begin; | |
71 while(*end!=0) | |
72 end++; | |
73 return compare_text(begin,end,r.begin(),r.end()); | |
74 } | |
75 | |
76 } | |
77 /// \endcond | |
78 | |
79 /// | |
80 /// \addtogroup boundary | |
81 /// @{ | |
82 | |
83 /// | |
84 /// \brief a segment object that represents a pair of two iterators that define the range where | |
85 /// this segment exits and a rule that defines it. | |
86 /// | |
87 /// This type of object is dereferenced by the iterators of segment_index. Using a rule() member function | |
88 /// you can get a specific rule this segment was selected with. For example, when you use | |
89 /// word boundary analysis, you can check if the specific word contains Kana letters by checking (rule() & \ref word_kana)!=0 | |
90 /// For a sentence analysis you can check if the sentence is selected because a sentence terminator is found (\ref sentence_term) or | |
91 /// there is a line break (\ref sentence_sep). | |
92 /// | |
93 /// This object can be automatically converted to std::basic_string with the same type of character. It is also | |
94 /// valid range that has begin() and end() member functions returning iterators on the location of the segment. | |
95 /// | |
96 /// \see | |
97 /// | |
98 /// - \ref segment_index | |
99 /// - \ref boundary_point | |
100 /// - \ref boundary_point_index | |
101 /// | |
102 template<typename IteratorType> | |
103 class segment : public std::pair<IteratorType,IteratorType> { | |
104 public: | |
105 /// | |
106 /// The type of the underlying character | |
107 /// | |
108 typedef typename std::iterator_traits<IteratorType>::value_type char_type; | |
109 /// | |
110 /// The type of the string it is converted to | |
111 /// | |
112 typedef std::basic_string<char_type> string_type; | |
113 /// | |
114 /// The value that iterators return - the character itself | |
115 /// | |
116 typedef char_type value_type; | |
117 /// | |
118 /// The iterator that allows to iterate the range | |
119 /// | |
120 typedef IteratorType iterator; | |
121 /// | |
122 /// The iterator that allows to iterate the range | |
123 /// | |
124 typedef IteratorType const_iterator; | |
125 /// | |
126 /// The type that represent a difference between two iterators | |
127 /// | |
128 typedef typename std::iterator_traits<IteratorType>::difference_type difference_type; | |
129 | |
130 /// | |
131 /// Default constructor | |
132 /// | |
133 segment() {} | |
134 /// | |
135 /// Create a segment using two iterators and a rule that represents this point | |
136 /// | |
137 segment(iterator b,iterator e,rule_type r) : | |
138 std::pair<IteratorType,IteratorType>(b,e), | |
139 rule_(r) | |
140 { | |
141 } | |
142 /// | |
143 /// Set the start of the range | |
144 /// | |
145 void begin(iterator const &v) | |
146 { | |
147 this->first = v; | |
148 } | |
149 /// | |
150 /// Set the end of the range | |
151 /// | |
152 void end(iterator const &v) | |
153 { | |
154 this->second = v; | |
155 } | |
156 | |
157 /// | |
158 /// Get the start of the range | |
159 /// | |
160 IteratorType begin() const | |
161 { | |
162 return this->first; | |
163 } | |
164 /// | |
165 /// Set the end of the range | |
166 /// | |
167 IteratorType end() const | |
168 { | |
169 return this->second; | |
170 } | |
171 | |
172 /// | |
173 /// Convert the range to a string automatically | |
174 /// | |
175 template <class T, class A> | |
176 operator std::basic_string<char_type, T, A> ()const | |
177 { | |
178 return std::basic_string<char_type, T, A>(this->first, this->second); | |
179 } | |
180 | |
181 /// | |
182 /// Create a string from the range explicitly | |
183 /// | |
184 string_type str() const | |
185 { | |
186 return string_type(begin(),end()); | |
187 } | |
188 | |
189 /// | |
190 /// Get the length of the text chunk | |
191 /// | |
192 | |
193 size_t length() const | |
194 { | |
195 return std::distance(begin(),end()); | |
196 } | |
197 | |
198 /// | |
199 /// Check if the segment is empty | |
200 /// | |
201 bool empty() const | |
202 { | |
203 return begin() == end(); | |
204 } | |
205 | |
206 /// | |
207 /// Get the rule that is used for selection of this segment. | |
208 /// | |
209 rule_type rule() const | |
210 { | |
211 return rule_; | |
212 } | |
213 /// | |
214 /// Set a rule that is used for segment selection | |
215 /// | |
216 void rule(rule_type r) | |
217 { | |
218 rule_ = r; | |
219 } | |
220 | |
221 // make sure we override std::pair's operator== | |
222 | |
223 /// Compare two segments | |
224 bool operator==(segment const &other) | |
225 { | |
226 return details::compare_text(*this,other) == 0; | |
227 } | |
228 | |
229 /// Compare two segments | |
230 bool operator!=(segment const &other) | |
231 { | |
232 return details::compare_text(*this,other) != 0; | |
233 } | |
234 | |
235 private: | |
236 rule_type rule_; | |
237 | |
238 }; | |
239 | |
240 | |
241 /// Compare two segments | |
242 template<typename IteratorL,typename IteratorR> | |
243 bool operator==(segment<IteratorL> const &l,segment<IteratorR> const &r) | |
244 { | |
245 return details::compare_text(l,r) == 0; | |
246 } | |
247 /// Compare two segments | |
248 template<typename IteratorL,typename IteratorR> | |
249 bool operator!=(segment<IteratorL> const &l,segment<IteratorR> const &r) | |
250 { | |
251 return details::compare_text(l,r) != 0; | |
252 } | |
253 | |
254 /// Compare two segments | |
255 template<typename IteratorL,typename IteratorR> | |
256 bool operator<(segment<IteratorL> const &l,segment<IteratorR> const &r) | |
257 { | |
258 return details::compare_text(l,r) < 0; | |
259 } | |
260 /// Compare two segments | |
261 template<typename IteratorL,typename IteratorR> | |
262 bool operator<=(segment<IteratorL> const &l,segment<IteratorR> const &r) | |
263 { | |
264 return details::compare_text(l,r) <= 0; | |
265 } | |
266 /// Compare two segments | |
267 template<typename IteratorL,typename IteratorR> | |
268 bool operator>(segment<IteratorL> const &l,segment<IteratorR> const &r) | |
269 { | |
270 return details::compare_text(l,r) > 0; | |
271 } | |
272 /// Compare two segments | |
273 template<typename IteratorL,typename IteratorR> | |
274 bool operator>=(segment<IteratorL> const &l,segment<IteratorR> const &r) | |
275 { | |
276 return details::compare_text(l,r) >= 0; | |
277 } | |
278 | |
279 /// Compare string and segment | |
280 template<typename CharType,typename Traits,typename Alloc,typename IteratorR> | |
281 bool operator==(std::basic_string<CharType,Traits,Alloc> const &l,segment<IteratorR> const &r) | |
282 { | |
283 return details::compare_text(l,r) == 0; | |
284 } | |
285 /// Compare string and segment | |
286 template<typename CharType,typename Traits,typename Alloc,typename IteratorR> | |
287 bool operator!=(std::basic_string<CharType,Traits,Alloc> const &l,segment<IteratorR> const &r) | |
288 { | |
289 return details::compare_text(l,r) != 0; | |
290 } | |
291 | |
292 /// Compare string and segment | |
293 template<typename CharType,typename Traits,typename Alloc,typename IteratorR> | |
294 bool operator<(std::basic_string<CharType,Traits,Alloc> const &l,segment<IteratorR> const &r) | |
295 { | |
296 return details::compare_text(l,r) < 0; | |
297 } | |
298 /// Compare string and segment | |
299 template<typename CharType,typename Traits,typename Alloc,typename IteratorR> | |
300 bool operator<=(std::basic_string<CharType,Traits,Alloc> const &l,segment<IteratorR> const &r) | |
301 { | |
302 return details::compare_text(l,r) <= 0; | |
303 } | |
304 /// Compare string and segment | |
305 template<typename CharType,typename Traits,typename Alloc,typename IteratorR> | |
306 bool operator>(std::basic_string<CharType,Traits,Alloc> const &l,segment<IteratorR> const &r) | |
307 { | |
308 return details::compare_text(l,r) > 0; | |
309 } | |
310 /// Compare string and segment | |
311 template<typename CharType,typename Traits,typename Alloc,typename IteratorR> | |
312 bool operator>=(std::basic_string<CharType,Traits,Alloc> const &l,segment<IteratorR> const &r) | |
313 { | |
314 return details::compare_text(l,r) >= 0; | |
315 } | |
316 | |
317 /// Compare string and segment | |
318 template<typename Iterator,typename CharType,typename Traits,typename Alloc> | |
319 bool operator==(segment<Iterator> const &l,std::basic_string<CharType,Traits,Alloc> const &r) | |
320 { | |
321 return details::compare_text(l,r) == 0; | |
322 } | |
323 /// Compare string and segment | |
324 template<typename Iterator,typename CharType,typename Traits,typename Alloc> | |
325 bool operator!=(segment<Iterator> const &l,std::basic_string<CharType,Traits,Alloc> const &r) | |
326 { | |
327 return details::compare_text(l,r) != 0; | |
328 } | |
329 | |
330 /// Compare string and segment | |
331 template<typename Iterator,typename CharType,typename Traits,typename Alloc> | |
332 bool operator<(segment<Iterator> const &l,std::basic_string<CharType,Traits,Alloc> const &r) | |
333 { | |
334 return details::compare_text(l,r) < 0; | |
335 } | |
336 /// Compare string and segment | |
337 template<typename Iterator,typename CharType,typename Traits,typename Alloc> | |
338 bool operator<=(segment<Iterator> const &l,std::basic_string<CharType,Traits,Alloc> const &r) | |
339 { | |
340 return details::compare_text(l,r) <= 0; | |
341 } | |
342 /// Compare string and segment | |
343 template<typename Iterator,typename CharType,typename Traits,typename Alloc> | |
344 bool operator>(segment<Iterator> const &l,std::basic_string<CharType,Traits,Alloc> const &r) | |
345 { | |
346 return details::compare_text(l,r) > 0; | |
347 } | |
348 /// Compare string and segment | |
349 template<typename Iterator,typename CharType,typename Traits,typename Alloc> | |
350 bool operator>=(segment<Iterator> const &l,std::basic_string<CharType,Traits,Alloc> const &r) | |
351 { | |
352 return details::compare_text(l,r) >= 0; | |
353 } | |
354 | |
355 | |
356 /// Compare C string and segment | |
357 template<typename CharType,typename IteratorR> | |
358 bool operator==(CharType const *l,segment<IteratorR> const &r) | |
359 { | |
360 return details::compare_string(l,r) == 0; | |
361 } | |
362 /// Compare C string and segment | |
363 template<typename CharType,typename IteratorR> | |
364 bool operator!=(CharType const *l,segment<IteratorR> const &r) | |
365 { | |
366 return details::compare_string(l,r) != 0; | |
367 } | |
368 | |
369 /// Compare C string and segment | |
370 template<typename CharType,typename IteratorR> | |
371 bool operator<(CharType const *l,segment<IteratorR> const &r) | |
372 { | |
373 return details::compare_string(l,r) < 0; | |
374 } | |
375 /// Compare C string and segment | |
376 template<typename CharType,typename IteratorR> | |
377 bool operator<=(CharType const *l,segment<IteratorR> const &r) | |
378 { | |
379 return details::compare_string(l,r) <= 0; | |
380 } | |
381 /// Compare C string and segment | |
382 template<typename CharType,typename IteratorR> | |
383 bool operator>(CharType const *l,segment<IteratorR> const &r) | |
384 { | |
385 return details::compare_string(l,r) > 0; | |
386 } | |
387 /// Compare C string and segment | |
388 template<typename CharType,typename IteratorR> | |
389 bool operator>=(CharType const *l,segment<IteratorR> const &r) | |
390 { | |
391 return details::compare_string(l,r) >= 0; | |
392 } | |
393 | |
394 /// Compare C string and segment | |
395 template<typename Iterator,typename CharType> | |
396 bool operator==(segment<Iterator> const &l,CharType const *r) | |
397 { | |
398 return details::compare_string(l,r) == 0; | |
399 } | |
400 /// Compare C string and segment | |
401 template<typename Iterator,typename CharType> | |
402 bool operator!=(segment<Iterator> const &l,CharType const *r) | |
403 { | |
404 return details::compare_string(l,r) != 0; | |
405 } | |
406 | |
407 /// Compare C string and segment | |
408 template<typename Iterator,typename CharType> | |
409 bool operator<(segment<Iterator> const &l,CharType const *r) | |
410 { | |
411 return details::compare_string(l,r) < 0; | |
412 } | |
413 /// Compare C string and segment | |
414 template<typename Iterator,typename CharType> | |
415 bool operator<=(segment<Iterator> const &l,CharType const *r) | |
416 { | |
417 return details::compare_string(l,r) <= 0; | |
418 } | |
419 /// Compare C string and segment | |
420 template<typename Iterator,typename CharType> | |
421 bool operator>(segment<Iterator> const &l,CharType const *r) | |
422 { | |
423 return details::compare_string(l,r) > 0; | |
424 } | |
425 /// Compare C string and segment | |
426 template<typename Iterator,typename CharType> | |
427 bool operator>=(segment<Iterator> const &l,CharType const *r) | |
428 { | |
429 return details::compare_string(l,r) >= 0; | |
430 } | |
431 | |
432 | |
433 | |
434 | |
435 | |
436 | |
437 typedef segment<std::string::const_iterator> ssegment; ///< convenience typedef | |
438 typedef segment<std::wstring::const_iterator> wssegment; ///< convenience typedef | |
439 #ifdef BOOST_HAS_CHAR16_T | |
440 typedef segment<std::u16string::const_iterator> u16ssegment;///< convenience typedef | |
441 #endif | |
442 #ifdef BOOST_HAS_CHAR32_T | |
443 typedef segment<std::u32string::const_iterator> u32ssegment;///< convenience typedef | |
444 #endif | |
445 | |
446 typedef segment<char const *> csegment; ///< convenience typedef | |
447 typedef segment<wchar_t const *> wcsegment; ///< convenience typedef | |
448 #ifdef BOOST_HAS_CHAR16_T | |
449 typedef segment<char16_t const *> u16csegment; ///< convenience typedef | |
450 #endif | |
451 #ifdef BOOST_HAS_CHAR32_T | |
452 typedef segment<char32_t const *> u32csegment; ///< convenience typedef | |
453 #endif | |
454 | |
455 | |
456 | |
457 | |
458 | |
459 /// | |
460 /// Write the segment to the stream character by character | |
461 /// | |
462 template<typename CharType,typename TraitsType,typename Iterator> | |
463 std::basic_ostream<CharType,TraitsType> &operator<<( | |
464 std::basic_ostream<CharType,TraitsType> &out, | |
465 segment<Iterator> const &tok) | |
466 { | |
467 for(Iterator p=tok.begin(),e=tok.end();p!=e;++p) | |
468 out << *p; | |
469 return out; | |
470 } | |
471 | |
472 /// @} | |
473 | |
474 } // boundary | |
475 } // locale | |
476 } // boost | |
477 | |
478 #ifdef BOOST_MSVC | |
479 #pragma warning(pop) | |
480 #endif | |
481 | |
482 #endif | |
483 | |
484 // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 |