From 1733e4702c4f4f8058e69500008d050cf9df0318 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 9 Jan 2019 11:15:49 -0800 Subject: [PATCH] [iter] Add hb_map() Untested. --- src/hb-iter.hh | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index de195c5c3..334f23d28 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -198,6 +198,48 @@ struct hb_is_iterator_of { enum { * Adaptors, combiners, etc. */ +/* hb_map(), hb_filter(), hb_reduce() */ + +template +struct hb_map_iter_t : + hb_iter_t, decltype (f (*hb_declval (typename Iter::item_t)))> +{ + hb_map_iter_t (const Iter& it, Proj f) : it (it), f (f) {} + + typedef decltype (f (*hb_declval (typename Iter::item_t))) __item_t__; + enum { is_random_access_iterator = Iter::is_random_access_iterator }; + __item_t__ __item__ () const { return f (*it); } + __item_t__ __item_at__ (unsigned i) const { return f (it[i]); } + bool __more__ () const { return it; } + unsigned __len__ () const { return it.len (); } + void __next__ () { ++it; } + void __forward__ (unsigned n) { it += n; } + void __prev__ () { --it; } + void __rewind__ (unsigned n) { it -= n; } + + private: + Iter it; + Proj f; +}; +template +struct hb_map_iter_factory_t +{ + hb_map_iter_factory_t (Proj f) : f (f) {} + + template + hb_map_iter_t operator () (const Iterable &c) + { return hb_map_iter_t (c.iter (), f); } + + private: + Proj f; +}; +template +inline hb_map_iter_factory_t +hb_map (Proj f) +{ return hb_map_iter_factory_t (f); } + /* hb_zip() */ @@ -228,7 +270,6 @@ struct hb_zip_iter_t : A a; B b; }; - template inline hb_zip_iter_t