blob: 77600b70d16ecc68c0eb50274aeab5bde16b59f6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#ifndef CODEPOINT_ITERATOR_H_
#define CODEPOINT_ITERATOR_H_
#include <iterator>
#include <string>
#include <exception>
namespace UTF8 {
class CodepointIterator : public std::iterator<std::bidirectional_iterator_tag,
char32_t,
std::string::difference_type> {
static_assert(
sizeof(std::string::value_type) == 1,
"CodepointIterator only supports single-byte UTF-8 encoded input"
);
public:
CodepointIterator(std::string::const_iterator);
CodepointIterator(const CodepointIterator&);
CodepointIterator& operator=(const CodepointIterator&);
bool operator==(const CodepointIterator&) const;
bool operator==(const std::string::const_iterator&) const;
bool operator!=(const CodepointIterator&) const;
bool operator!=(const std::string::const_iterator&) const;
std::ptrdiff_t operator-(const std::string::const_iterator&) const;
char32_t operator*();
CodepointIterator& operator++();
CodepointIterator& operator--();
CodepointIterator operator++(int);
CodepointIterator operator--(int);
private:
std::string::const_iterator iterator_;
};
class codepoint_invalid: public std::exception {
virtual const char* what() const throw() {
return "codepoint_invalid";
}
};
}
#endif // CODEPOINT_ITERATOR_H_
|