On 3/7/20 5:58 AM, mark wrote:
change #1:

                 if (line.empty) {
                     if (deb != null && deb.valid)
                         debs.insert(deb);
                     else // report incomplete
                     deb = null;
                     continue;
                 }
                 if (deb == null)
                     deb = new Deb;

change #2: gets rid of most errors:

     bool opEquals(const Deb* other) const @safe pure nothrow {

     int opCmp(ref const Deb* other) const {

Just changed to pointers & moved to a separate file.

So now I just have one error in line 12 of model.d:

RedBlackTree!Deb* debs; // name-ordered list of deb packages LINE 12


Performing "debug" build using /home/mark/opt/ldc2-1.20.0-linux-x86_64/bin/ldc2 for x86_64.
gtk-d:gtkd 3.9.0: target for configuration "library" is up to date.
debfind ~master: building configuration "application"...
src/model.d(12,9): Error: template instance std.container.rbtree.RedBlackTree!(Deb) does not match template declaration RedBlackTree(T, alias less = "a < b", bool allowDuplicates = false)
   with T = Deb
   must satisfy the following constraint:
        is(typeof(binaryFun!less(T.init, T.init)))
/home/mark/opt/ldc2-1.20.0-linux-x86_64/bin/ldc2 failed with exit code 1.


Hm... I'd say:

1. Don't use a pointer for the element. Just use the struct directly. Using a pointer is bad because it's now going to compare pointers, and not the element data. Not only that, but RBNodes are stored as heap-allocated structs, so you are wasting a lot of memory by allocating another heap allocated thing to get stored inside there.

2. RedBlackTree allows you to identify the relationship that you consider unique by providing a "less" function. Instead of instrumenting your Deb type, which might affect other usages, just do:

RedBlackTree!(Deb, (a, b) => a.name < b.name)

No need to add opCmp and opEquals (if that doesn't make sense in other contexts).

-Steve

Reply via email to