This patch implements mozilla::NotNull, which is similar but not identicial to
gsl::not_null.
The current draft(?) implementation of gsl::not_null is at
https://github.com/Microsoft/GSL/blob/master/include/gsl.h.
The main difference is that not_null allows implicit conversion from T to
not_null<T>. In contrast, NotNull only allows explicit conversion from T to
NotNull<T> via WrapNotNull().
The rationale for this is that when converting from a less-constrained type to
a more constrained type, implicit conversion is undesirable. For example, if I
changed a function f from this:
f(int* aPtr);
to this:
f(gsl::not_null<int*> aPtr);
no call sites would have to be modified. But if I changed it to this:
f(mozilla::NotNull<int*> aPtr);
call sites *would* need to be modified. This is a good thing! It forces the
author to audit the call sites for non-nullness, and encourages them to
back-propagate NotNull throughout the code.
The other difference between not_null and NotNull is that not_null disables
pointer arithmetic, which means it cannot be used with array pointers. I have
not implemented this restriction for NotNull because it seems arbitrary and
unnecessary.
This patch:
- Adds MOZ_MUST_USE to AllocPolicy::checkSimulatedOOM().
- Adds MOZ_MUST_USE to LZ4::decompress() (both variants) and fixes their
comments.
- Changes the return type of SplayTree::insert() from bool to void, because it
always returns true and its callers don't check the return value.
- Changes the return type of SplayTree::finishInsertion() from T* to void,
because it makes things clearer -- it was just returning the aNew argument.
- Adds MOZ_MUST_USE to a Vector::growTo() (both variants).
--HG--
extra : rebase_source : 1547cdeb9ee71d0ecec608ab474ab5e75bfc4b42
It's an annotation that is used a lot, and should be used even more, so a
shorter name is better.
MozReview-Commit-ID: 1VS4Dney4WX
--HG--
extra : rebase_source : b26919c1b0fcb32e5339adeef5be5becae6032cf
This will allow MOZ_MUST_USE to be used for a different and more common case.
MozReview-Commit-ID: 4dQsdWjJfc6
--HG--
extra : rebase_source : 390ab56ef83d71eb6d28759a0195a79a78b153bd
The prohibition against returning a UniquePtr was based on
bugs in older compilers which required an explicit Move()
to properly transfer ownership. This is no longer the case
since we now have code returning this type directly.
--HG--
extra : rebase_source : 6190b3f14b650d448f18f7611a22576701657795
If the image load is from the same document that cached the image we are required to use the cached version. Otherwise we should be free to ignore the cached version.
Writing PopLastN in this way is probably a bit of a micro-optimization,
but at least it comes with tests and some comments for verifying the
goodness of the code.
The scheme in TestSegmentedVectors to use manually-annotated points and
magic numbers corresponding to those annotations works OK for small
numbers of operations. But for testing bulk push and pop, we're going
to be doing many more operations, so let's move to recording explicitly
in code the operations we expect to see, and checking those instead.