diff --git a/indexer/categories_holder.cpp b/indexer/categories_holder.cpp index 4078c09e8f..21e393cced 100644 --- a/indexer/categories_holder.cpp +++ b/indexer/categories_holder.cpp @@ -4,6 +4,7 @@ #include "../coding/multilang_utf8_string.hpp" #include "../coding/reader.hpp" +#include "../coding/reader_streambuf.hpp" #include "../base/string_utils.hpp" #include "../base/logging.hpp" @@ -29,7 +30,7 @@ enum State { } // unnamed namespace -size_t CategoriesHolder::LoadFromStream(string const & buffer) +size_t CategoriesHolder::LoadFromStream(istream & s) { m_categories.clear(); @@ -40,10 +41,9 @@ size_t CategoriesHolder::LoadFromStream(string const & buffer) Classificator const & c = classif(); - istringstream stream(buffer); - while (stream.good()) + while (s.good()) { - getline(stream, line); + getline(s, line); strings::SimpleTokenizer iter(line, ":|"); switch (state) @@ -123,10 +123,9 @@ CategoriesHolder::CategoriesHolder() { } -CategoriesHolder::CategoriesHolder(Reader const & reader) +CategoriesHolder::CategoriesHolder(Reader * reader) { - string buffer; - reader.ReadAsString(buffer); - LoadFromStream(buffer); + ReaderStreamBuf buffer(reader); + istream s(&buffer); + LoadFromStream(s); } - diff --git a/indexer/categories_holder.hpp b/indexer/categories_holder.hpp index b4458f6f75..78832996a9 100644 --- a/indexer/categories_holder.hpp +++ b/indexer/categories_holder.hpp @@ -3,6 +3,7 @@ #include "../std/vector.hpp" #include "../std/string.hpp" +#include "../std/fstream.hpp" #include "../std/algorithm.hpp" class Reader; @@ -30,10 +31,11 @@ public: typedef ContainerT::const_iterator const_iterator; CategoriesHolder(); - explicit CategoriesHolder(Reader const & reader); + /// Takes ownership of reader. + explicit CategoriesHolder(Reader * reader); - /// @return number of loaded categories or 0 if something goes wrong - size_t LoadFromStream(string const & buffer); + /// @return Number of loaded categories or 0 if something goes wrong. + size_t LoadFromStream(istream & s); template void ForEachCategory(ToDo toDo) const diff --git a/indexer/indexer_tests/categories_test.cpp b/indexer/indexer_tests/categories_test.cpp index 7dd8ccb78f..a7a00aad85 100644 --- a/indexer/indexer_tests/categories_test.cpp +++ b/indexer/indexer_tests/categories_test.cpp @@ -71,11 +71,11 @@ UNIT_TEST(LoadCategories) classificator::Load(); CategoriesHolder h; - string buffer = TEST_STRING; + istringstream buffer(TEST_STRING); TEST_GREATER(h.LoadFromStream(buffer), 0, ()); + size_t count = 0; Checker f(count); h.ForEachCategory(f); TEST_EQUAL(count, 2, ()); } - diff --git a/map/framework.cpp b/map/framework.cpp index 0da79781d2..d813a5be94 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -676,9 +676,9 @@ search::Engine * Framework::GetSearchEngine() { Platform & pl = GetPlatform(); - scoped_ptr pReader(pl.GetReader(SEARCH_CATEGORIES_FILE_NAME)); m_pSearchEngine.reset( - new search::Engine(&m_model.GetIndex(), new CategoriesHolder(*pReader), + new search::Engine(&m_model.GetIndex(), + new CategoriesHolder(pl.GetReader(SEARCH_CATEGORIES_FILE_NAME)), pl.GetReader(PACKED_POLYGONS_FILE), pl.GetReader(COUNTRIES_FILE), languages::CurrentLanguage()));