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