diff --git a/cpp/word-count/word_count.cpp b/cpp/word-count/word_count.cpp index aa37f4b..47ca382 100644 --- a/cpp/word-count/word_count.cpp +++ b/cpp/word-count/word_count.cpp @@ -1,12 +1,73 @@ #include "word_count.h" +#include + + namespace word_count { using namespace std; -Words words(const string &str) + +Words words(const string &str, const locale &loc) { - return Words(); + Words result; + + enum { + + InsideWord, + OutsideWord + + } state(OutsideWord); + + + string::const_iterator begin, end, i; + i = begin = end = str.begin(); + + 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; + 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) { + + string word; + word.reserve(distance(begin, end)); + transform(begin, end, back_inserter(word), + [=](char c){return tolower(c, loc);}); + + result[word]++; + } + } + + break; + } + } + + return result; } } diff --git a/cpp/word-count/word_count.h b/cpp/word-count/word_count.h index dfa10cf..a0f8cf8 100644 --- a/cpp/word-count/word_count.h +++ b/cpp/word-count/word_count.h @@ -1,5 +1,8 @@ #pragma once +#define EXERCISM_RUN_ALL_TESTS + +#include #include #include @@ -7,6 +10,6 @@ namespace word_count { typedef std::map Words; -Words words(const std::string&); +Words words(const std::string&, const std::locale &loc = std::locale()); }