diff options
-rw-r--r-- | src/CharClassify.cxx | 16 | ||||
-rw-r--r-- | src/CharClassify.h | 15 | ||||
-rw-r--r-- | src/Document.cxx | 50 | ||||
-rw-r--r-- | src/Document.h | 6 | ||||
-rw-r--r-- | src/Editor.cxx | 12 | ||||
-rw-r--r-- | test/unit/testCharClassify.cxx | 28 |
6 files changed, 64 insertions, 63 deletions
diff --git a/src/CharClassify.cxx b/src/CharClassify.cxx index b5e2870f3..f82fe75a6 100644 --- a/src/CharClassify.cxx +++ b/src/CharClassify.cxx @@ -21,29 +21,29 @@ CharClassify::CharClassify() : charClass{} { void CharClassify::SetDefaultCharClasses(bool includeWordClass) { // Initialize all char classes to default values - for (int ch = 0; ch < 256; ch++) { + for (int ch = 0; ch < maxChar; ch++) { if (ch == '\r' || ch == '\n') - charClass[ch] = ccNewLine; + charClass[ch] = CharacterClass::newLine; else if (ch < 0x20 || ch == ' ') - charClass[ch] = ccSpace; + charClass[ch] = CharacterClass::space; else if (includeWordClass && (ch >= 0x80 || IsAlphaNumeric(ch) || ch == '_')) - charClass[ch] = ccWord; + charClass[ch] = CharacterClass::word; else - charClass[ch] = ccPunctuation; + charClass[ch] = CharacterClass::punctuation; } } -void CharClassify::SetCharClasses(const unsigned char *chars, cc newCharClass) { +void CharClassify::SetCharClasses(const unsigned char *chars, CharacterClass newCharClass) { // Apply the newCharClass to the specified chars if (chars) { while (*chars) { - charClass[*chars] = static_cast<unsigned char>(newCharClass); + charClass[*chars] = newCharClass; chars++; } } } -int CharClassify::GetCharsOfClass(cc characterClass, unsigned char *buffer) const noexcept { +int CharClassify::GetCharsOfClass(CharacterClass characterClass, unsigned char *buffer) const noexcept { // Get characters belonging to the given char class; return the number // of characters (if the buffer is NULL, don't write to it). int count = 0; diff --git a/src/CharClassify.h b/src/CharClassify.h index 36cc34558..1fcdb9d5d 100644 --- a/src/CharClassify.h +++ b/src/CharClassify.h @@ -10,20 +10,21 @@ namespace Scintilla { +enum class CharacterClass : unsigned char { space, newLine, word, punctuation }; + class CharClassify { public: CharClassify(); - enum cc { ccSpace, ccNewLine, ccWord, ccPunctuation }; void SetDefaultCharClasses(bool includeWordClass); - void SetCharClasses(const unsigned char *chars, cc newCharClass); - int GetCharsOfClass(cc characterClass, unsigned char *buffer) const noexcept; - cc GetClass(unsigned char ch) const noexcept { return static_cast<cc>(charClass[ch]);} - bool IsWord(unsigned char ch) const noexcept { return static_cast<cc>(charClass[ch]) == ccWord;} + void SetCharClasses(const unsigned char *chars, CharacterClass newCharClass); + int GetCharsOfClass(CharacterClass characterClass, unsigned char *buffer) const noexcept; + CharacterClass GetClass(unsigned char ch) const noexcept { return charClass[ch];} + bool IsWord(unsigned char ch) const noexcept { return charClass[ch] == CharacterClass::word;} private: - enum { maxChar=256 }; - unsigned char charClass[maxChar]; // not type cc to save space + static constexpr int maxChar=256; + CharacterClass charClass[maxChar]; }; } diff --git a/src/Document.cxx b/src/Document.cxx index 4548064b5..0a4c8ca0b 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -1731,7 +1731,7 @@ Sci::Position Document::ParaDown(Sci::Position pos) const { return LineEnd(line-1); } -CharClassify::cc Document::WordCharacterClass(unsigned int ch) const { +CharacterClass Document::WordCharacterClass(unsigned int ch) const { if (dbcsCodePage && (!UTF8IsAscii(ch))) { if (SC_CP_UTF8 == dbcsCodePage) { // Use hard coded Unicode class @@ -1741,7 +1741,7 @@ CharClassify::cc Document::WordCharacterClass(unsigned int ch) const { // Separator, Line/Paragraph case ccZl: case ccZp: - return CharClassify::ccNewLine; + return CharacterClass::newLine; // Separator, Space case ccZs: @@ -1751,7 +1751,7 @@ CharClassify::cc Document::WordCharacterClass(unsigned int ch) const { case ccCs: case ccCo: case ccCn: - return CharClassify::ccSpace; + return CharacterClass::space; // Letter case ccLu: @@ -1767,7 +1767,7 @@ CharClassify::cc Document::WordCharacterClass(unsigned int ch) const { case ccMn: case ccMc: case ccMe: - return CharClassify::ccWord; + return CharacterClass::word; // Punctuation case ccPc: @@ -1782,12 +1782,12 @@ CharClassify::cc Document::WordCharacterClass(unsigned int ch) const { case ccSc: case ccSk: case ccSo: - return CharClassify::ccPunctuation; + return CharacterClass::punctuation; } } else { // Asian DBCS - return CharClassify::ccWord; + return CharacterClass::word; } } return charClass.GetClass(static_cast<unsigned char>(ch)); @@ -1798,7 +1798,7 @@ CharClassify::cc Document::WordCharacterClass(unsigned int ch) const { * Finds the start of word at pos when delta < 0 or the end of the word when delta >= 0. */ Sci::Position Document::ExtendWordSelect(Sci::Position pos, int delta, bool onlyWordCharacters) const { - CharClassify::cc ccStart = CharClassify::ccWord; + CharacterClass ccStart = CharacterClass::word; if (delta < 0) { if (!onlyWordCharacters) { const CharacterExtracted ce = CharacterBefore(pos); @@ -1836,13 +1836,13 @@ Sci::Position Document::NextWordStart(Sci::Position pos, int delta) const { if (delta < 0) { while (pos > 0) { const CharacterExtracted ce = CharacterBefore(pos); - if (WordCharacterClass(ce.character) != CharClassify::ccSpace) + if (WordCharacterClass(ce.character) != CharacterClass::space) break; pos -= ce.widthBytes; } if (pos > 0) { CharacterExtracted ce = CharacterBefore(pos); - const CharClassify::cc ccStart = WordCharacterClass(ce.character); + const CharacterClass ccStart = WordCharacterClass(ce.character); while (pos > 0) { ce = CharacterBefore(pos); if (WordCharacterClass(ce.character) != ccStart) @@ -1852,7 +1852,7 @@ Sci::Position Document::NextWordStart(Sci::Position pos, int delta) const { } } else { CharacterExtracted ce = CharacterAfter(pos); - const CharClassify::cc ccStart = WordCharacterClass(ce.character); + const CharacterClass ccStart = WordCharacterClass(ce.character); while (pos < LengthNoExcept()) { ce = CharacterAfter(pos); if (WordCharacterClass(ce.character) != ccStart) @@ -1861,7 +1861,7 @@ Sci::Position Document::NextWordStart(Sci::Position pos, int delta) const { } while (pos < LengthNoExcept()) { ce = CharacterAfter(pos); - if (WordCharacterClass(ce.character) != CharClassify::ccSpace) + if (WordCharacterClass(ce.character) != CharacterClass::space) break; pos += ce.widthBytes; } @@ -1880,8 +1880,8 @@ Sci::Position Document::NextWordEnd(Sci::Position pos, int delta) const { if (delta < 0) { if (pos > 0) { CharacterExtracted ce = CharacterBefore(pos); - const CharClassify::cc ccStart = WordCharacterClass(ce.character); - if (ccStart != CharClassify::ccSpace) { + const CharacterClass ccStart = WordCharacterClass(ce.character); + if (ccStart != CharacterClass::space) { while (pos > 0) { ce = CharacterBefore(pos); if (WordCharacterClass(ce.character) != ccStart) @@ -1891,7 +1891,7 @@ Sci::Position Document::NextWordEnd(Sci::Position pos, int delta) const { } while (pos > 0) { ce = CharacterBefore(pos); - if (WordCharacterClass(ce.character) != CharClassify::ccSpace) + if (WordCharacterClass(ce.character) != CharacterClass::space) break; pos -= ce.widthBytes; } @@ -1899,13 +1899,13 @@ Sci::Position Document::NextWordEnd(Sci::Position pos, int delta) const { } else { while (pos < LengthNoExcept()) { const CharacterExtracted ce = CharacterAfter(pos); - if (WordCharacterClass(ce.character) != CharClassify::ccSpace) + if (WordCharacterClass(ce.character) != CharacterClass::space) break; pos += ce.widthBytes; } if (pos < LengthNoExcept()) { CharacterExtracted ce = CharacterAfter(pos); - const CharClassify::cc ccStart = WordCharacterClass(ce.character); + const CharacterClass ccStart = WordCharacterClass(ce.character); while (pos < LengthNoExcept()) { ce = CharacterAfter(pos); if (WordCharacterClass(ce.character) != ccStart) @@ -1926,10 +1926,10 @@ bool Document::IsWordStartAt(Sci::Position pos) const { return false; if (pos > 0) { const CharacterExtracted cePos = CharacterAfter(pos); - const CharClassify::cc ccPos = WordCharacterClass(cePos.character); + const CharacterClass ccPos = WordCharacterClass(cePos.character); const CharacterExtracted cePrev = CharacterBefore(pos); - const CharClassify::cc ccPrev = WordCharacterClass(cePrev.character); - return (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) && + const CharacterClass ccPrev = WordCharacterClass(cePrev.character); + return (ccPos == CharacterClass::word || ccPos == CharacterClass::punctuation) && (ccPos != ccPrev); } return true; @@ -1944,10 +1944,10 @@ bool Document::IsWordEndAt(Sci::Position pos) const { return false; if (pos < LengthNoExcept()) { const CharacterExtracted cePos = CharacterAfter(pos); - const CharClassify::cc ccPos = WordCharacterClass(cePos.character); + const CharacterClass ccPos = WordCharacterClass(cePos.character); const CharacterExtracted cePrev = CharacterBefore(pos); - const CharClassify::cc ccPrev = WordCharacterClass(cePrev.character); - return (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) && + const CharacterClass ccPrev = WordCharacterClass(cePrev.character); + return (ccPrev == CharacterClass::word || ccPrev == CharacterClass::punctuation) && (ccPrev != ccPos); } return true; @@ -2186,11 +2186,11 @@ void Document::SetDefaultCharClasses(bool includeWordClass) { charClass.SetDefaultCharClasses(includeWordClass); } -void Document::SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass) { +void Document::SetCharClasses(const unsigned char *chars, CharacterClass newCharClass) { charClass.SetCharClasses(chars, newCharClass); } -int Document::GetCharsOfClass(CharClassify::cc characterClass, unsigned char *buffer) const { +int Document::GetCharsOfClass(CharacterClass characterClass, unsigned char *buffer) const { return charClass.GetCharsOfClass(characterClass, buffer); } @@ -2528,7 +2528,7 @@ static bool IsASCIIPunctuationCharacter(unsigned int ch) noexcept { } bool Document::IsWordPartSeparator(unsigned int ch) const { - return (WordCharacterClass(ch) == CharClassify::ccWord) && IsASCIIPunctuationCharacter(ch); + return (WordCharacterClass(ch) == CharacterClass::word) && IsASCIIPunctuationCharacter(ch); } Sci::Position Document::WordPartLeft(Sci::Position pos) const { diff --git a/src/Document.h b/src/Document.h index 91163713b..e2d9eddce 100644 --- a/src/Document.h +++ b/src/Document.h @@ -448,8 +448,8 @@ public: Sci::Line LinesTotal() const noexcept; void SetDefaultCharClasses(bool includeWordClass); - void SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass); - int GetCharsOfClass(CharClassify::cc characterClass, unsigned char *buffer) const; + void SetCharClasses(const unsigned char *chars, CharacterClass newCharClass); + int GetCharsOfClass(CharacterClass characterClass, unsigned char *buffer) const; void SetCharacterCategoryOptimization(int countCharacters); int CharacterCategoryOptimization() const noexcept; void SCI_METHOD StartStyling(Sci_Position position) override; @@ -492,7 +492,7 @@ public: bool AddWatcher(DocWatcher *watcher, void *userData); bool RemoveWatcher(DocWatcher *watcher, void *userData); - CharClassify::cc WordCharacterClass(unsigned int ch) const; + CharacterClass WordCharacterClass(unsigned int ch) const; bool IsWordPartSeparator(unsigned int ch) const; Sci::Position WordPartLeft(Sci::Position pos) const; Sci::Position WordPartRight(Sci::Position pos) const; diff --git a/src/Editor.cxx b/src/Editor.cxx index 4f1add2c3..dcaa6fc6b 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -6294,33 +6294,33 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { break; case SCI_GETWORDCHARS: - return pdoc->GetCharsOfClass(CharClassify::ccWord, UCharPtrFromSPtr(lParam)); + return pdoc->GetCharsOfClass(CharacterClass::word, UCharPtrFromSPtr(lParam)); case SCI_SETWORDCHARS: { pdoc->SetDefaultCharClasses(false); if (lParam == 0) return 0; - pdoc->SetCharClasses(ConstUCharPtrFromSPtr(lParam), CharClassify::ccWord); + pdoc->SetCharClasses(ConstUCharPtrFromSPtr(lParam), CharacterClass::word); } break; case SCI_GETWHITESPACECHARS: - return pdoc->GetCharsOfClass(CharClassify::ccSpace, UCharPtrFromSPtr(lParam)); + return pdoc->GetCharsOfClass(CharacterClass::space, UCharPtrFromSPtr(lParam)); case SCI_SETWHITESPACECHARS: { if (lParam == 0) return 0; - pdoc->SetCharClasses(ConstUCharPtrFromSPtr(lParam), CharClassify::ccSpace); + pdoc->SetCharClasses(ConstUCharPtrFromSPtr(lParam), CharacterClass::space); } break; case SCI_GETPUNCTUATIONCHARS: - return pdoc->GetCharsOfClass(CharClassify::ccPunctuation, UCharPtrFromSPtr(lParam)); + return pdoc->GetCharsOfClass(CharacterClass::punctuation, UCharPtrFromSPtr(lParam)); case SCI_SETPUNCTUATIONCHARS: { if (lParam == 0) return 0; - pdoc->SetCharClasses(ConstUCharPtrFromSPtr(lParam), CharClassify::ccPunctuation); + pdoc->SetCharClasses(ConstUCharPtrFromSPtr(lParam), CharacterClass::punctuation); } break; diff --git a/test/unit/testCharClassify.cxx b/test/unit/testCharClassify.cxx index c44a7e973..e329c0378 100644 --- a/test/unit/testCharClassify.cxx +++ b/test/unit/testCharClassify.cxx @@ -27,13 +27,13 @@ protected: pcc.reset(new CharClassify()); for (int ch = 0; ch < 256; ch++) { if (ch == '\r' || ch == '\n') - charClass[ch] = CharClassify::ccNewLine; + charClass[ch] = CharacterClass::newLine; else if (ch < 0x20 || ch == ' ') - charClass[ch] = CharClassify::ccSpace; + charClass[ch] = CharacterClass::space; else if (ch >= 0x80 || isalnum(ch) || ch == '_') - charClass[ch] = CharClassify::ccWord; + charClass[ch] = CharacterClass::word; else - charClass[ch] = CharClassify::ccPunctuation; + charClass[ch] = CharacterClass::punctuation; } } @@ -41,15 +41,15 @@ protected: } std::unique_ptr<CharClassify> pcc; - CharClassify::cc charClass[256]; + CharacterClass charClass[256]; - static const char* GetClassName(CharClassify::cc charClass) { + static const char* GetClassName(CharacterClass charClass) { switch(charClass) { - #define CASE(c) case CharClassify::c: return #c - CASE(ccSpace); - CASE(ccNewLine); - CASE(ccWord); - CASE(ccPunctuation); + #define CASE(c) case CharacterClass::c: return #c + CASE(space); + CASE(newLine); + CASE(word); + CASE(punctuation); #undef CASE default: return "<unknown>"; @@ -71,7 +71,7 @@ TEST_CASE_METHOD(CharClassifyTest, "Defaults") { TEST_CASE_METHOD(CharClassifyTest, "Custom") { unsigned char buf[2] = {0, 0}; for (int i = 0; i < 256; i++) { - CharClassify::cc thisClass = CharClassify::cc(i % 4); + CharacterClass thisClass = CharacterClass(i % 4); buf[0] = i; pcc->SetCharClasses(buf, thisClass); charClass[i] = thisClass; @@ -89,13 +89,13 @@ TEST_CASE_METHOD(CharClassifyTest, "Custom") { TEST_CASE_METHOD(CharClassifyTest, "CharsOfClass") { unsigned char buf[2] = {0, 0}; for (int i = 1; i < 256; i++) { - CharClassify::cc thisClass = CharClassify::cc(i % 4); + CharacterClass thisClass = CharacterClass(i % 4); buf[0] = i; pcc->SetCharClasses(buf, thisClass); charClass[i] = thisClass; } for (int classVal = 0; classVal < 4; ++classVal) { - CharClassify::cc thisClass = CharClassify::cc(classVal % 4); + CharacterClass thisClass = CharacterClass(classVal % 4); int size = pcc->GetCharsOfClass(thisClass, NULL); std::vector<unsigned char> buffer(size+1); pcc->GetCharsOfClass(thisClass, &buffer[0]); |