Thread overview
std.algorithm.skipOver broken / misbehaving?
Oct 05, 2012
Era Scarecrow
Oct 05, 2012
Era Scarecrow
Oct 09, 2012
Jesse Phillips
Oct 06, 2012
Ali Çehreli
Oct 06, 2012
Era Scarecrow
October 05, 2012
 Although this likely isn't the most efficient way to do this, it's cropped up and here's what I have so far. The idea is to drop all the unwanted pathname and only leave the filename (I'm sure there's a function there already, just not finding it off hand).

 Why is this failing?

[quote]
bool skipOver(alias pred = "a == b", R1, R2)(ref R1 r1, R2 r2);
    If startsWith(r1, r2), consume the corresponding elements off r1 and return true. Otherwise, leave r1 unchanged and return false.
[/quote]

[code]
import std.algorithm;
import std.stdio;

void main() {
  string filename = r"something/long\or short";
  bool skipped;
    do {
      skipped = false;
      //try to handle either slash in this case.
      skipped |= filename.skipOver('\\');
      skipped |= filename.skipOver('/');
      skipped |= filename.skipOver(r"\");
      skipped |= filename.skipOver(r"/");
    } while (skipped);

  //originally was: do {} while(filename.skipOver('\\'));

  //asserts, filename hasn't changed.
  assert(filename == "or short", filename);
}
[/code]
October 05, 2012
 Mmmm glancing at the notes again, maybe I misread it and it only skips if the beginning equals, rather than if it contains... Kinda annoying since it sounds like what I wanted would work...
October 06, 2012
On 10/05/2012 01:39 AM, Era Scarecrow wrote:
> Although this likely isn't the most efficient way to do this, it's
> cropped up and here's what I have so far. The idea is to drop all the
> unwanted pathname and only leave the filename (I'm sure there's a
> function there already, just not finding it off hand).
>
> Why is this failing?
>
> [quote]
> bool skipOver(alias pred = "a == b", R1, R2)(ref R1 r1, R2 r2);
> If startsWith(r1, r2), consume the corresponding elements off r1 and
> return true. Otherwise, leave r1 unchanged and return false.
> [/quote]
>
> [code]
> import std.algorithm;
> import std.stdio;
>
> void main() {
> string filename = r"something/long\or short";
> bool skipped;
> do {
> skipped = false;
> //try to handle either slash in this case.
> skipped |= filename.skipOver('\\');
> skipped |= filename.skipOver('/');
> skipped |= filename.skipOver(r"\");
> skipped |= filename.skipOver(r"/");
> } while (skipped);
>
> //originally was: do {} while(filename.skipOver('\\'));
>
> //asserts, filename hasn't changed.
> assert(filename == "or short", filename);
> }
> [/code]

There is the std.path module and especially the std.path.baseName function, but it considers either '/' or '\\' depending on the platform.

The following range magic works for both '/' and '\\':

import std.algorithm;
import std.stdio;
import std.range;

void main() {
  string filename = r"something/long\or short";

  auto firstPart = filename.retro.findAmong("/\\");
  filename = filename[firstPart.count .. $];

  assert(filename == "or short", filename);
}

Ali

P.S. I too am thinking about abandoning dmd's -property switch. With the -property switch, I would have to write retro() and count() with parentheses.
October 06, 2012
On Saturday, 6 October 2012 at 21:57:17 UTC, Ali Çehreli wrote:
> There is the std.path module and especially the std.path.baseName function, but it considers either '/' or '\\' depending on the platform.

 Yeah already found that. Easy to find it via grep in the html documentation.

> P.S. I too am thinking about abandoning dmd's -property switch. With the -property switch, I would have to write retro() and count() with parentheses.

 I'm not sure what to think regarding the -property switch. I've used it while tinkering with BitArray. I think libraries themselves should adhere to the stricter form, but user code can be more relaxed. If the calling is just user preference then it depends on how they see and understand the call based on the look of it. Maybe it will get thrown away...
October 09, 2012
On Friday, 5 October 2012 at 08:53:22 UTC, Era Scarecrow wrote:
>  Mmmm glancing at the notes again, maybe I misread it and it only skips if the beginning equals, rather than if it contains... Kinda annoying since it sounds like what I wanted would work...

Pretty sure the semantics you want are in, findSkip.