On Wed, 26 Mar 2014 17:32:30 -0000, monarch_dodra <[email protected]> wrote:

On Wednesday, 26 March 2014 at 16:55:48 UTC, Regan Heath wrote:
On Wed, 26 Mar 2014 16:38:57 -0000, monarch_dodra
Not only that, but it's also a performance criteria: If you are iterating on two ranges at once (think "copy"), then you *know* "range2" is longer than "range1", even if you don't know its length.

What guarantees range2 is longer than range1? The isArray case checks explicitly, but the generic one doesn't. Is it a property of being an output range that it will expand as required, or..

The interface: The target *shall* have enough room to accommodate origin. Failure to meet that criteria is an Error.

Ok.  So long as *something* is throwing that Error I am down with this.

Output ranges may or may not auto expand as required. Arguably, it's a design flaw I don't want to get started on.

:)

Why pay for "range2.empty", when you know it'll always be false? There is a noticeable performance difference if you *don't* check.

But aren't you instead paying for 2 checks in front and 2 in popFront, so 4 checks vs 1? Or is the argument that these 4 checks cannot be removed even if we mandate r.empty is called before r.front/popFront.

I don't know what checks you are talking about. Most ranges don't check anything on front or popFront. They merely assume they are in a state that where they can do their job. Failure to meet this condition prior to the call (note I didn't say "failure to check for"), means Error.

Ok.. but lets take a naive range of say int with a 1 element cache in the member variable "int cache;". The simplest possible front would just be "return cache;". But, if cache hasn't been populated yet it's not going to throw an Error, it's just going to be wrong.

So, presumably front has to check another boolean to verify it's been populated and throw an Error if not. That's one of the checks I meant. A typical loop over a range will call front one or more times, so you pay for that check 1 or more times per loop.

popFront in this example doesn't need to check anything, it just populates cache regardless, as does empty.

But, I imagine there are ranges which need some initial setup, and they have to do it somewhere, and they need to check they have done it in empty, front and popFront for every call. It's those checks we'd like to avoid if we can.

So.. if we mandate that empty MUST be called, then they could just be done in one place, empty.

However, in this situation nothing would be enforcing that requirement (in release anyway) and things could just go wrong. So, perhaps the checks always need to be there and we gain nothing by mandating empty is called first.

idunno.

It's really not much different from when doing an strcpy. "++p" and "*p" don't check anything. The fact that ranges *can* check doesn't always mean they should.

Sure. For performance reasons they might not, but isn't this just a tiny bit safer if we mandate empty must be called and do one check there..

R

--
Using Opera's revolutionary email client: http://www.opera.com/mail/

Reply via email to