@@ -13,6 +13,7 @@ $(T2 FlattenedIterator, $(SUBREF topology, flattened))
13
13
$(T2 IndexIterator, $(SUBREF topology, indexed))
14
14
$(T2 IotaIterator, $(SUBREF topology, iota))
15
15
$(T2 MapIterator, $(SUBREF topology, map))
16
+ $(T2 MemberIterator, $(SUBREF topology, member))
16
17
$(T2 RetroIterator, $(SUBREF topology, retro))
17
18
$(T2 SliceIterator, $(SUBREF topology, map) in composition with $(LREF MapIterator) for packed slices.)
18
19
$(T2 SlideIterator, $(SUBREF topology, diff), $(SUBREF topology, pairwise), and $(SUBREF topology, slide).)
@@ -864,6 +865,58 @@ auto mapIterator(alias fun, Iterator)(Iterator iterator)
864
865
assert (y == result);
865
866
}
866
867
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
+
867
920
/+ +
868
921
`BytegroupIterator` is used by $(SUBREF topology, Bytegroup) and $(SUBREF topology, bytegroup).
869
922
+/
0 commit comments