[iter] Add hb_unzip()
diff --git a/src/hb-iter.hh b/src/hb-iter.hh
index c3dac6d..05f6457 100644
--- a/src/hb-iter.hh
+++ b/src/hb-iter.hh
@@ -478,6 +478,8 @@
{ return hb_sink_t<Sink&> (*s); }
} hb_sink HB_UNUSED;
+/* hb-drain: hb_sink to void / blackhole / /dev/null. */
+
static const struct
{
template <typename Iter,
@@ -490,6 +492,42 @@
}
} hb_drain HB_UNUSED;
+/* hb_unzip(): unzip and sink to two sinks. */
+
+template <typename Sink1, typename Sink2>
+struct hb_unzip_t
+{
+ hb_unzip_t (Sink1&& s1, Sink2&& s2) : s1 (s1), s2 (s2) {}
+
+ template <typename Iter,
+ hb_enable_if (hb_is_iterator (Iter))>
+ void
+ operator () (Iter it) const
+ {
+ for (; it; ++it)
+ {
+ const auto &v = *it;
+ s1 << v.first;
+ s2 << v.second;
+ }
+ }
+
+ private:
+ Sink1 s1;
+ Sink2 s2;
+};
+static const struct
+{
+ template <typename Sink1, typename Sink2> hb_unzip_t<Sink1, Sink2>
+ operator () (Sink1&& s1, Sink2&& s2) const
+ { return hb_unzip_t<Sink1, Sink2> (s1, s2); }
+
+ template <typename Sink1, typename Sink2> hb_unzip_t<Sink1&, Sink2&>
+ operator () (Sink1 *s1, Sink2 *s2) const
+ { return hb_unzip_t<Sink1&, Sink2&> (*s1, *s2); }
+} hb_unzip HB_UNUSED;
+
+
/* hb-all, hb-any, hb-none. */
static const struct