aboutsummaryrefslogtreecommitdiff
path: root/src/codepoint_iterator.h
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_