word count: state enum is removed
This commit is contained in:
parent
fb546d1f29
commit
6f5bbd1460
1 changed files with 16 additions and 38 deletions
|
|
@ -12,47 +12,26 @@ Words words(const string &str, const locale &loc)
|
|||
{
|
||||
Words result;
|
||||
|
||||
enum {
|
||||
|
||||
InsideWord,
|
||||
OutsideWord
|
||||
|
||||
} state(OutsideWord);
|
||||
|
||||
|
||||
string::const_iterator begin, end, i;
|
||||
i = begin = end = str.begin();
|
||||
i = end = str.begin();
|
||||
begin = str.end();
|
||||
|
||||
for (; i != str.end(); ++i) {
|
||||
|
||||
bool is_alpha_or_digit = isalpha(*i, loc) || isdigit(*i, loc);
|
||||
bool is_word_char = is_alpha_or_digit || *i == '\'';
|
||||
|
||||
switch (state) {
|
||||
|
||||
case OutsideWord:
|
||||
|
||||
if (is_alpha_or_digit) {
|
||||
|
||||
state = InsideWord;
|
||||
if (begin > end)
|
||||
begin = i;
|
||||
end = next(i);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case InsideWord:
|
||||
|
||||
if (is_alpha_or_digit) {
|
||||
|
||||
end = next(i);
|
||||
}
|
||||
|
||||
if (!is_word_char || next(i) == str.end()) {
|
||||
|
||||
state = OutsideWord;
|
||||
|
||||
if (begin != end) {
|
||||
if (begin < end) {
|
||||
|
||||
string word;
|
||||
word.reserve(distance(begin, end));
|
||||
|
|
@ -60,10 +39,9 @@ Words words(const string &str, const locale &loc)
|
|||
[=](char c){return tolower(c, loc);});
|
||||
|
||||
result[word]++;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
begin = str.end();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue