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