custom opCmp for array sort

New d-devel at here.com
Fri Nov 28 06:42:44 PST 2008


Hello,

I originally posted this question to the wrong group, I am trying here as suggested.

I am new with D and am stuck with something I hope somebody can help me with it.
I am trying sort an array of paths which can take the two following forms:

/usr                ---> normal path
/bin=/other/bin     ---> a symlink

When I sort these paths, in the case of symlinks I want to ignore the right hand side and I just use the path before the "=" sign.

The array docs for DMD 2.0, say that can create a structure and create a opCmp function to cutomise the way sort works. I have tried this but calling .sort does not seem to pick-up my custom opCmp.

Any help would be very appreciated. I am including the code below

Thanks a lot
--------------------------------------------------------------------
Code cleaned up in d.lang group (my code was a bit messy)

import std.string: find, cmp;
import std.stdio: writefln;

struct Path {
  string thePath;

  int opCmp(Path other) {
    int pos;
    string a, b;

    pos = find(this.thePath, "=");
    if (pos > -1)
      a = this.thePath[0 .. pos];
    else
      a = this.thePath;

    pos = find(other.thePath, "=");
    if (pos > -1)
      b = other.thePath[0 .. pos];
    else
      b = other.thePath;

    return cmp(a, b);
  }
}

void main() {
  string[][Path] contents = [
    Path("/BBB=/other_dir"): ["aa","bb","cc","dd"],
    Path("/AAA"): ["aa","bb","cc","dd"],
    Path("/BB2=/hello") : ["aa","bb","cc","dd"]
                            ];

  foreach (item; contents.keys.sort)
    writefln(item.thePath);
}


More information about the Digitalmars-d-learn mailing list