From 50c3fe7cfabca4cdbdfed7e0bf19260ba83c260b Mon Sep 17 00:00:00 2001
From: vng <viktor.govako@gmail.com>
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 b817534..9fd25b3 100644
--- a/env/strings.hpp
+++ b/env/strings.hpp
@@ -18,8 +18,8 @@ void Trim(string & s);
 
 string MakeNormalizeAndLowerUtf8(string const & s);
 
-template <class IterT>
-IterT Tokenize(string const & s, char const * delims, IterT out)
+template <class ToDo>
+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 79a7a84..d1a11f6 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<string> 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 88a0081..7f0bbd1 100644
--- a/std/iterator.hpp
+++ b/std/iterator.hpp
@@ -4,3 +4,21 @@
 
 using std::back_inserter;
 using std::distance;
+
+namespace impl
+{
+  template <class ContT>
+  class BackInserterFn
+  {
+    ContT & m_cont;
+  public:
+    BackInserterFn(ContT & cont) : m_cont(cont) {}
+    template <class T> void operator() (T const & t) { m_cont.push_back(t); }
+  };
+}
+
+template <class ContT>
+impl::BackInserterFn<ContT> MakeBackInserter(ContT & cont)
+{
+  return impl::BackInserterFn<ContT>(cont);
+}
diff --git a/storage/storage_builder.cpp b/storage/storage_builder.cpp
index 888669c..d259c59 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);
   }