@@ -13,6 +13,7 @@ $(T2 FlattenedIterator, $(SUBREF topology, flattened))
1313$(T2 IndexIterator, $(SUBREF topology, indexed))
1414$(T2 IotaIterator, $(SUBREF topology, iota))
1515$(T2 MapIterator, $(SUBREF topology, map))
16+ $(T2 MemberIterator, $(SUBREF topology, member))
1617$(T2 RetroIterator, $(SUBREF topology, retro))
1718$(T2 SliceIterator, $(SUBREF topology, map) in composition with $(LREF MapIterator) for packed slices.)
1819$(T2 SlideIterator, $(SUBREF topology, diff), $(SUBREF topology, pairwise), and $(SUBREF topology, slide).)
@@ -864,6 +865,58 @@ auto mapIterator(alias fun, Iterator)(Iterator iterator)
864865 assert (y == result);
865866}
866867
868+ /+ +
869+ `MemberIterator` is used by $(SUBREF topology, member).
870+ +/
871+ struct MemberIterator (Iterator, string member)
872+ {
873+ @optmath:
874+ // /
875+ Iterator _iterator;
876+
877+ // /
878+ auto lightConst ()() const @property
879+ {
880+ return MemberIterator! (LightConstOf! Iterator, member)(.lightConst(_iterator));
881+ }
882+
883+ // /
884+ auto lightImmutable ()() immutable @property
885+ {
886+ return MemberIterator! (LightImmutableOf! Iterator, member)(.lightImmutable(_iterator));
887+ }
888+
889+ auto ref opUnary (string op : " *" )()
890+ {
891+ return __traits (getMember, * _iterator, member);
892+ }
893+
894+ auto ref opIndex ()(ptrdiff_t index)
895+ {
896+ return __traits (getMember, _iterator[index], member);
897+ }
898+
899+ static if (! __traits(compiles, &opIndex (ptrdiff_t .init)))
900+ {
901+ auto ref opIndexAssign (T)(auto ref T value, ptrdiff_t index)
902+ {
903+ return __traits (getMember, _iterator[index], member) = value;
904+ }
905+
906+ auto ref opIndexUnary (string op)(ptrdiff_t index)
907+ {
908+ return mixin (op ~ " __traits(getMember, _iterator[index], member)" );
909+ }
910+
911+ auto ref opIndexOpAssign (string op, T)(T value, ptrdiff_t index)
912+ {
913+ return mixin (" __traits(getMember, _iterator[index], member)" ~ op ~ " = value" );
914+ }
915+ }
916+
917+ mixin (std_ops);
918+ }
919+
867920/+ +
868921`BytegroupIterator` is used by $(SUBREF topology, Bytegroup) and $(SUBREF topology, bytegroup).
869922+/
0 commit comments