[iter] Implement hb_reduce
authorEbrahim Byagowi <ebrahim@gnu.org>
Sun, 31 Mar 2019 08:11:58 +0000 (12:41 +0430)
committerBehdad Esfahbod <behdad@behdad.org>
Mon, 1 Apr 2019 23:56:29 +0000 (16:56 -0700)
src/hb-iter.hh
src/test-iter.cc

index b212aa3..04261bd 100644 (file)
@@ -348,6 +348,34 @@ static const struct
   { return hb_filter_iter_factory_t<Pred, Proj> (p, f); }
 } hb_filter HB_UNUSED;
 
+template <typename Redu, typename TValue>
+struct hb_reduce_t
+{
+  hb_reduce_t (Redu r, TValue init_value) : r (r), init_value (init_value) {}
+
+  template <typename Iter,
+           hb_enable_if (hb_is_iterator (Iter))>
+  TValue
+  operator () (Iter it) const
+  {
+    TValue value = init_value;
+    for (; it; ++it)
+      value = r (*it, value);
+    return value;
+  }
+
+  private:
+  Redu r;
+  TValue init_value;
+};
+static const struct
+{
+  template <typename Redu, typename TValue> hb_reduce_t<Redu, TValue>
+  operator () (Redu&& r, TValue init_value) const
+  { return hb_reduce_t<Redu, TValue> (r, init_value); }
+} hb_reduce HB_UNUSED;
+
+
 /* hb_zip() */
 
 template <typename A, typename B>
index 205fd33..e142c56 100644 (file)
@@ -155,6 +155,11 @@ main (int argc, char **argv)
   ;
 
   + hb_iter (src)
+  | hb_map ([&] (int i) -> int { return 1; })
+  | hb_reduce ([&] (int acc, int cur) -> int { return acc + cur; }, 2)
+  ;
+
+  + hb_iter (src)
   | hb_drain
   ;