On Tuesday, 15 January 2013 at 17:14:32 UTC, Andrei Alexandrescu wrote:
On 1/15/13 12:03 PM, Phil Lavoie wrote:
Pseudo:
original = range.save
resPos = range.retro.find
return Range.merge( resPos, original ) //DOES NOT WORK

The problem with this solution is that:
Retro returns a different range type and it would be more complicated to
have the merge function work with this type.

This would be difficult to implement safely, which is an important disadvantage.

An addition to this solution could be another new primitive: reverse:

Pseudo:
original = range.save
reversed = range.reverse //Permanently invert start an end. I think this is feasible for all bidirectional ranges. Still a bidirectional range.
reversed.find( needle ) //In haystack :)
return Range.merge( reversed, original ) //Ok, start of reversed is on needle and end of original hasn't moved. The order of the range returned
is the same as the one received.

This is just a suggestion and any primitive could be renamed. However, I
think reverse is a good place to start.

Reverse is really cool and immediate to implement safely for a lot of ranges I can think of. How would you define rfind assuming reverse?


Andrei

Ok then, imagine we use @reverse, @reversed and @merge primitives:

auto rfind( Range, E )( Range r , E e ) if( blablabla... ) {
  auto original = r.save;
  auto reversed = r.reverse;
  auto found = find( reversed, e );
  auto res = Range.merge( found, original );
  return original.reversed ? res : res.reverse;
}

And correcting what I said previously:

void reverse() {
 _reversed = !reversed;
}

Reply via email to