diff options
author | Neil <nyamatongwe@gmail.com> | 2024-03-08 17:11:54 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2024-03-08 17:11:54 +1100 |
commit | 212219da82d0a430dbf4eac1528056440f07940c (patch) | |
tree | e5a21da94492f4a65ebd9aad41cad7280830b37d | |
parent | 990e88a854ce05b86f4ce0b6f9b6975b6df4a282 (diff) | |
download | scintilla-mirror-212219da82d0a430dbf4eac1528056440f07940c.tar.gz |
Use noexcept in CharacterCategoryMap.
-rw-r--r-- | src/CharacterCategoryMap.cxx | 19 | ||||
-rw-r--r-- | src/CharacterCategoryMap.h | 12 |
2 files changed, 18 insertions, 13 deletions
diff --git a/src/CharacterCategoryMap.cxx b/src/CharacterCategoryMap.cxx index b8b20fee7..3ef5bb748 100644 --- a/src/CharacterCategoryMap.cxx +++ b/src/CharacterCategoryMap.cxx @@ -4050,12 +4050,17 @@ constexpr int maskCategory = 0x1F; // possibly for 0..0xff for most Western European text or 0..0xfff for most // alphabetic languages. -CharacterCategory CategoriseCharacter(int character) { +CharacterCategory CategoriseCharacter(int character) noexcept { if (character < 0 || character > maxUnicode) return ccCn; const int baseValue = character * (maskCategory+1) + maskCategory; - const int *placeAfter = std::lower_bound(catRanges, std::end(catRanges), baseValue); - return static_cast<CharacterCategory>(*(placeAfter-1) & maskCategory); + try { + // lower_bound will never throw with these args but its not marked noexcept so add catch to pretend. + const int *placeAfter = std::lower_bound(catRanges, std::end(catRanges), baseValue); + return static_cast<CharacterCategory>(*(placeAfter - 1) & maskCategory); + } catch (...) { + return ccCn; + } } // Implementation of character sets recommended for identifiers in Unicode Standard Annex #31. @@ -4158,7 +4163,7 @@ bool OmitXidContinue(int character) noexcept { // UAX #31 defines ID_Start as // [[:L:][:Nl:][:Other_ID_Start:]--[:Pattern_Syntax:]--[:Pattern_White_Space:]] -bool IsIdStart(int character) { +bool IsIdStart(int character) noexcept { if (IsIdPattern(character)) { return false; } @@ -4173,7 +4178,7 @@ bool IsIdStart(int character) { // UAX #31 defines ID_Continue as // [[:ID_Start:][:Mn:][:Mc:][:Nd:][:Pc:][:Other_ID_Continue:]--[:Pattern_Syntax:]--[:Pattern_White_Space:]] -bool IsIdContinue(int character) { +bool IsIdContinue(int character) noexcept { if (IsIdPattern(character)) { return false; } @@ -4187,7 +4192,7 @@ bool IsIdContinue(int character) { } // XID_Start is ID_Start modified for Normalization Form KC in UAX #31 -bool IsXidStart(int character) { +bool IsXidStart(int character) noexcept { if (OmitXidStart(character)) { return false; } else { @@ -4196,7 +4201,7 @@ bool IsXidStart(int character) { } // XID_Continue is ID_Continue modified for Normalization Form KC in UAX #31 -bool IsXidContinue(int character) { +bool IsXidContinue(int character) noexcept { if (OmitXidContinue(character)) { return false; } else { diff --git a/src/CharacterCategoryMap.h b/src/CharacterCategoryMap.h index b3b03eb5a..cd75ec29c 100644 --- a/src/CharacterCategoryMap.h +++ b/src/CharacterCategoryMap.h @@ -22,20 +22,20 @@ enum CharacterCategory { ccCc, ccCf, ccCs, ccCo, ccCn }; -CharacterCategory CategoriseCharacter(int character); +CharacterCategory CategoriseCharacter(int character) noexcept; // Common definitions of allowable characters in identifiers from UAX #31. -bool IsIdStart(int character); -bool IsIdContinue(int character); -bool IsXidStart(int character); -bool IsXidContinue(int character); +bool IsIdStart(int character) noexcept; +bool IsIdContinue(int character) noexcept; +bool IsXidStart(int character) noexcept; +bool IsXidContinue(int character) noexcept; class CharacterCategoryMap { private: std::vector<unsigned char> dense; public: CharacterCategoryMap(); - CharacterCategory CategoryFor(int character) const { + CharacterCategory CategoryFor(int character) const noexcept { if (static_cast<size_t>(character) < dense.size()) { return static_cast<CharacterCategory>(dense[character]); } else { |