Description
size_hint()
can sometimes allow for more efficient memory allocations, and other good performance things.
I intend to make a PR to implement the trivial / easy ones, at least. I've already made a PR for the first batch, #49201. The ones in that PR are omitted from this list.
This list will be updated as I sort through for false-positives.
Liballoc:
-
Range<'a, K, V>
(Add size_hints for btree iterators #49550)This is hard, but doable, and useful. -
RangeMut<'a, K, V>
(Add size_hints for btree iterators #49550)This is hard, but doable, and useful. -
MergeIter<K, V, I>
(Add size_hints for btree iterators #49550)This is hard, but doable, and useful. -
Range<'a, T>
(Add size_hints for btree iterators #49550)This is hard, but doable, and useful.
Libcore:
-
Impossible to provide upper or lower bounds.Pattern: $forward_iterator<'a, P>
-
Impossible to provide upper or lower bounds.Pattern: $reverse_iterator<'a, P>
Libfmt_macros:
-
Both impossible and irrelevant.Parser<'a>
Libproc_macro:
-
Implementation is not trivial. It would be nice to do it eventually, though.TokenTreeIter
Librustc:
-
NodesMatchingSuffix<'o, 'tcx>
-
EnumerateAndAdjust<I>
(Implement some trivial size_hints for various iterators #49201) -
TraitObligationStackList<'o, 'tcx>
-
Not trivial, and probably going to change.Ancestors
-
No way to define an upper bound.Elaborator<'cx, 'gcx, 'tcx>
-
No way to define an upper bound.SupertraitDefIds<'cx, 'gcx, 'tcx>
-
No way to define an upper bound.TypeWalker<'tcx>
-
Iter<'dom, Node>
-
Iter<'a, T>
-
Iter<'a>
-
Prefixes<'cx, 'gcx, 'tcx>
-
ValueIter
-
Autoderef<'a, 'gcx, 'tcx>
Librustdoc:
-
CodeBlocks<'a, I>
-
LinkReplacer<'a, 'b, I>
-
HeadingLinks<'a, 'b, I>
-
SummaryLine<'a, I>
-
Footnotes<'a, I>
-
Parser<T>
Libstd:
- fs
- io
- net
-
Depreciated.Lines<B>
-
There's no way to provide anything better thanIncoming<'a>
(1, None)
-
- path
-
Iter<'a>
(Implement size_hint on various sys iterators #49552) -
Writing aComponents<'a>
size_hint
for this is hard. But it would be useful; this is oftencollect()
-ed. -
Writing aAncestors<'a>
size_hint
for this is hard, and not very useful.
-
- sync
-
Inherently unbounded iterator.Iter<'a, T>
-
Inherently unbounded iterator.TryIter<'a, T>
-
Inherently unbounded iterator.IntoIter<T>
-
Impossible to write an upper bound.Packets
-
- sys
- cloudabi
-
ReadDir
(Implement size_hint on various sys iterators #49552)(implement size_hint on sys iterators #71308) -
LookupHost
(Implement size_hint on various sys iterators #49552)(implement size_hint on sys iterators #71308) -
SplitPaths<'a>
(Implement size_hint on various sys iterators #49552)(implement size_hint on sys iterators #71308)
-
- redox
- unix
-
No cheap way to do this.ReadDir
-
LookupHost
(Implement size_hint on various sys iterators #49552)
-
- wasm
-
ReadDir
(Implement size_hint on various sys iterators #49552)(implement size_hint on sys iterators #71308) -
LookupHost
(Implement size_hint on various sys iterators #49552)(implement size_hint on sys iterators #71308) -
SplitPaths<'a>
(Implement size_hint on various sys iterators #49552)(implement size_hint on sys iterators #71308) -
Env
(Implement size_hint on various sys iterators #49552)(implement size_hint on sys iterators #71308)
-
- windows
-
There's no cheap way to do this.ReadDir
-
There's no safe way to do this.Env
-
SplitPaths<'a>
(Implement size_hint on various sys iterators #49552)(implement size_hint on sys iterators #71308)
-
- cloudabi
- sys_common
-
There's no safe way to do this.LookupHost
-
- unicode
-
ToLowercase
(Implement size_hint for several unicode-based iterators. #50208) -
ToUppercase
(Implement size_hint for several unicode-based iterators. #50208) -
CaseMappingIter
(Implement size_hint for several unicode-based iterators. #50208) -
Utf8LossyChunksIter<'a>
(Implement size_hint for several unicode-based iterators. #50208) -
SplitWhitespace<'a>
(Implement size_hint for several unicode-based iterators. #50208)
-
Libsyntax:
Cargo:
rust-lang/cargo#5211
I found them by running grep -r -n "impl.*\bIterator for \|fn size_hint" src > size_hint_todo.txt
. Then, delete any pairs of an Iterator
line followed by a size_hint
line, and manually check the remaining Iterator
lines for false positives.
It may be a good idea to make a lint for implementing size_hint. It would be opt-in, of course. It's really easy to forget, even if you're trying to optimize performance.