On 3/12/2018 15:15, Jorg Brown wrote:
"distance(begin, end)" isn't O(1) for many types of containers, which is why P1227 defines ssize() as the static_casted result of size().
Of course, for many containers, size() is implemented as the subtraction of two pointers, static_casted to size_t. (See https://github.com/llvm-mirror/libcxx/blob/master/include/vector for example) In those cases, it would make more sense to define ssize() as simply the subtraction of those two pointers.
Which is why I added the "moral equivalent" clause. :)
""better" in that it allows a container intended exclusively for small sizes to use a difference_type smaller than ptrdiff_t."
I applaud your use of quotation marks around better, since such a difference_type is often inefficient in that the caller is often forced to immediately promote it to larger size, before the processor can work with it.
True. But it also in theory allows for more esoteric indexing, such as indexing by an enum or a complex value or some other UDT. (Technically that doesn't meet the requirements of Container, but provided the type behaves sufficiently like an integer then most algorithms would still work.) Whether that's "better" or not might be another argument. :) And AFAIK all the standard container types use ptrdiff_t as their difference_type anyway, so it seems reasonable to use that instead of mandating ptrdiff_t.
I'm curious about whether you've considered using 0 and size() - 1 as the indices for the special bins?
IIRC, Hans stated that another library does this and it makes it more awkward to use, since (he says) mostly you ignore the extra bins and turning them on or off changes the indexing of the regular bins.