From 50c3fe7cfabca4cdbdfed7e0bf19260ba83c260b Mon Sep 17 00:00:00 2001 From: vng Date: Mon, 12 Aug 2013 21:58:53 +0300 Subject: [PATCH] Changed str::Tokenizer semantics (pass functor instead of iterator). --- env/strings.hpp | 8 +++----- env/tests/env_tests.cpp | 3 ++- std/iterator.hpp | 18 ++++++++++++++++++ storage/storage_builder.cpp | 2 +- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/env/strings.hpp b/env/strings.hpp index b817534d..9fd25b34 100644 --- a/env/strings.hpp +++ b/env/strings.hpp @@ -18,8 +18,8 @@ void Trim(string & s); string MakeNormalizeAndLowerUtf8(string const & s); -template -IterT Tokenize(string const & s, char const * delims, IterT out) +template +void Tokenize(string const & s, char const * delims, ToDo toDo) { size_t i = 0; while (i < s.size()) @@ -29,14 +29,12 @@ IterT Tokenize(string const & s, char const * delims, IterT out) j = s.size(); if (j > i) { - *out++ = s.substr(i, j-i); + toDo(s.substr(i, j-i)); i = j+1; } else ++i; } - - return out; } } diff --git a/env/tests/env_tests.cpp b/env/tests/env_tests.cpp index 79a7a84a..d1a11f69 100644 --- a/env/tests/env_tests.cpp +++ b/env/tests/env_tests.cpp @@ -8,6 +8,7 @@ #include "../../std/algorithm.hpp" #include "../../std/vector.hpp" #include "../../std/array.hpp" +#include "../../std/iterator.hpp" /// @note Do not edit formatting here (SRC() test): @@ -86,7 +87,7 @@ TEST(Env, Tokenizer) string out[] = { "aaa", "bbb", "ccc" }; vector v; - str::Tokenize(in, " ,\t?", back_inserter(v)); + str::Tokenize(in, " ,\t?", MakeBackInserter(v)); EXPECT_TRUE(equal(out, out + ArraySize(out), v.begin())); } diff --git a/std/iterator.hpp b/std/iterator.hpp index 88a0081e..7f0bbd1f 100644 --- a/std/iterator.hpp +++ b/std/iterator.hpp @@ -4,3 +4,21 @@ using std::back_inserter; using std::distance; + +namespace impl +{ + template + class BackInserterFn + { + ContT & m_cont; + public: + BackInserterFn(ContT & cont) : m_cont(cont) {} + template void operator() (T const & t) { m_cont.push_back(t); } + }; +} + +template +impl::BackInserterFn MakeBackInserter(ContT & cont) +{ + return impl::BackInserterFn(cont); +} diff --git a/storage/storage_builder.cpp b/storage/storage_builder.cpp index 888669ca..d259c59f 100644 --- a/storage/storage_builder.cpp +++ b/storage/storage_builder.cpp @@ -27,7 +27,7 @@ void ProcessEntriesFile(string const & path, ToDo & toDo) continue; entries.clear(); - str::Tokenize(str, "\t ", back_inserter(entries)); + str::Tokenize(str, "\t ", MakeBackInserter(entries)); toDo(entries); }