diff --git a/generator/dumper.cpp b/generator/dumper.cpp index 7161e22080..d1f7527cdb 100644 --- a/generator/dumper.cpp +++ b/generator/dumper.cpp @@ -41,9 +41,8 @@ namespace feature } }; - typedef pair, size_t> stats_elem_type; - static bool SortFunc(stats_elem_type const & first, - stats_elem_type const & second) + template + static bool SortFunc(T const & first, T const & second) { return first.second > second.second; } @@ -53,9 +52,10 @@ namespace feature TypesCollector doClass; feature::ForEachFromDat(fPath, doClass); + typedef pair, size_t> stats_elem_type; typedef vector vec_to_sort; vec_to_sort vecToSort(doClass.m_stats.begin(), doClass.m_stats.end()); - sort(vecToSort.begin(), vecToSort.end(), SortFunc); + sort(vecToSort.begin(), vecToSort.end(), &SortFunc); for (vec_to_sort::iterator it = vecToSort.begin(); it != vecToSort.end(); ++it) { @@ -67,4 +67,54 @@ namespace feature cout << "Total features: " << doClass.m_totalCount << endl; cout << "Features with names: " << doClass.m_namesCount << endl; } + + class NamesCollector + { + typedef unordered_map NamesContainerT; + + class LangsFunctor + { + public: + vector m_names; + bool operator()(signed char, string const & name) + { + m_names.push_back(name); + return true; + } + }; + + public: + NamesContainerT m_stats; + void operator()(FeatureType & f, uint32_t) + { + LangsFunctor doLangs; + f.ForEachNameRef(doLangs); + for (size_t i = 0; i < doLangs.m_names.size(); ++i) + { + strings::SimpleTokenizer tok(doLangs.m_names[i], " "); + while (tok) + { + pair found = m_stats.insert(make_pair(*tok, 1)); + if (!found.second) + found.first->second++; + ++tok; + } + } + } + }; + + typedef pair NameElemT; + void DumpNames(string const & fPath) + { + NamesCollector doClass; + feature::ForEachFromDat(fPath, doClass); + + typedef vector VecToSortT; + VecToSortT vecToSort(doClass.m_stats.begin(), doClass.m_stats.end()); + sort(vecToSort.begin(), vecToSort.end(), &SortFunc); + + for (VecToSortT::iterator it = vecToSort.begin(); it != vecToSort.end(); ++it) + cout << it->second << " " << it->first << endl; + } + } diff --git a/generator/dumper.hpp b/generator/dumper.hpp index 01d852a7b3..665694e48d 100644 --- a/generator/dumper.hpp +++ b/generator/dumper.hpp @@ -5,4 +5,5 @@ namespace feature { void DumpTypes(string const & fPath); + void DumpNames(string const & fPath); } diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index 3008ed9037..2256516b4d 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -220,6 +220,7 @@ int main(int argc, char ** argv) if (FLAGS_dump_types) { + feature::DumpNames(path + FLAGS_output + ".mwm"); feature::DumpTypes(path + FLAGS_output + ".mwm"); }