| 41 | //! @note the checker class must have the default constructor and @c Check member function |
| 42 | template <typename TChecker> |
| 43 | class TCharFilter { |
| 44 | TWideToken Token; |
| 45 | TCharTemp Buffer; |
| 46 | TChecker Checker; |
| 47 | |
| 48 | private: |
| 49 | //! copies already verified data - characters and subtokens |
| 50 | wchar16* CopyData(const TWideToken& token, size_t n, size_t t, wchar16* const data) { |
| 51 | std::char_traits<wchar16>::copy(data, token.Token, n); // without current character |
| 52 | |
| 53 | Token.SubTokens.clear(); |
| 54 | for (size_t i = 0; i < t; ++i) { |
| 55 | Token.SubTokens.push_back(token.SubTokens[i]); |
| 56 | } |
| 57 | |
| 58 | return data + n; |
| 59 | } |
| 60 | |
| 61 | public: |
| 62 | explicit TCharFilter(size_t bufSize) |
| 63 | : Buffer(bufSize) |
| 64 | { |
| 65 | } |
| 66 | |
| 67 | //! removes accent characters from token |
| 68 | //! @return if there is no any accent character the function returns the source token |
| 69 | //! otherwise the function returns the internal token |
| 70 | const TWideToken& Filter(const TWideToken& token) { |
| 71 | if (token.SubTokens.empty()) |
| 72 | return FilterTokenNoSubtokens(token); |
| 73 | else |
| 74 | return FilterTokenWithSubtokens(token); |
| 75 | } |
| 76 | |
| 77 | static bool HasChars(const TWideToken& token) { |
| 78 | TChecker checker; |
| 79 | const TTokenStructure& subtokens = token.SubTokens; |
| 80 | const wchar16* const s = token.Token; // source character sequence |
| 81 | size_t i = 0; // the index of the current source character |
| 82 | size_t t = 0; // the index of the next source subtoken |
| 83 | |
| 84 | while (i < token.Leng) { |
| 85 | if (t < subtokens.size()) { |
| 86 | if (i >= subtokens[t].Pos && i < subtokens[t].EndPos()) { |
| 87 | // inside a token |
| 88 | if (checker.Check(s[i])) { |
| 89 | return true; |
| 90 | } |
| 91 | } |
| 92 | |
| 93 | ++i; |
| 94 | |
| 95 | if (i >= subtokens[t].EndPos()) { |
| 96 | ++t; |
| 97 | } |
| 98 | } else { |
| 99 | break; |
| 100 | } |