xref: /MusicPlayer2/scintilla/lexlib/CharacterCategory.h (revision 8af74909132ed5e696cb05b6689ae4baf14c1c96)
1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang /** @file CharacterCategory.h
3*8af74909SZhong Yang  ** Returns the Unicode general category of a character.
4*8af74909SZhong Yang  **/
5*8af74909SZhong Yang // Copyright 2013 by Neil Hodgson <[email protected]>
6*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed.
7*8af74909SZhong Yang 
8*8af74909SZhong Yang #ifndef CHARACTERCATEGORY_H
9*8af74909SZhong Yang #define CHARACTERCATEGORY_H
10*8af74909SZhong Yang 
11*8af74909SZhong Yang namespace Scintilla {
12*8af74909SZhong Yang 
13*8af74909SZhong Yang enum CharacterCategory {
14*8af74909SZhong Yang 	ccLu, ccLl, ccLt, ccLm, ccLo,
15*8af74909SZhong Yang 	ccMn, ccMc, ccMe,
16*8af74909SZhong Yang 	ccNd, ccNl, ccNo,
17*8af74909SZhong Yang 	ccPc, ccPd, ccPs, ccPe, ccPi, ccPf, ccPo,
18*8af74909SZhong Yang 	ccSm, ccSc, ccSk, ccSo,
19*8af74909SZhong Yang 	ccZs, ccZl, ccZp,
20*8af74909SZhong Yang 	ccCc, ccCf, ccCs, ccCo, ccCn
21*8af74909SZhong Yang };
22*8af74909SZhong Yang 
23*8af74909SZhong Yang CharacterCategory CategoriseCharacter(int character);
24*8af74909SZhong Yang 
25*8af74909SZhong Yang // Common definitions of allowable characters in identifiers from UAX #31.
26*8af74909SZhong Yang bool IsIdStart(int character);
27*8af74909SZhong Yang bool IsIdContinue(int character);
28*8af74909SZhong Yang bool IsXidStart(int character);
29*8af74909SZhong Yang bool IsXidContinue(int character);
30*8af74909SZhong Yang 
31*8af74909SZhong Yang class CharacterCategoryMap {
32*8af74909SZhong Yang private:
33*8af74909SZhong Yang 	std::vector<unsigned char> dense;
34*8af74909SZhong Yang public:
35*8af74909SZhong Yang 	CharacterCategoryMap();
CategoryFor(int character)36*8af74909SZhong Yang 	CharacterCategory CategoryFor(int character) const {
37*8af74909SZhong Yang 		if (static_cast<size_t>(character) < dense.size()) {
38*8af74909SZhong Yang 			return static_cast<CharacterCategory>(dense[character]);
39*8af74909SZhong Yang 		} else {
40*8af74909SZhong Yang 			// binary search through ranges
41*8af74909SZhong Yang 			return CategoriseCharacter(character);
42*8af74909SZhong Yang 		}
43*8af74909SZhong Yang 	}
44*8af74909SZhong Yang 	int Size() const noexcept;
45*8af74909SZhong Yang 	void Optimize(int countCharacters);
46*8af74909SZhong Yang };
47*8af74909SZhong Yang 
48*8af74909SZhong Yang }
49*8af74909SZhong Yang 
50*8af74909SZhong Yang #endif
51