[OT] Finding longest documents
Christopher Wright
dhasenan at gmail.com
Tue Oct 14 16:33:02 PDT 2008
bearophile wrote:
> Christopher Wright:
>> http://dsource.org/projects/tango/browser/trunk/tango/util/container/more/Heap.d?rev=3959
>
> Very nice, thank you. Few quick comments (no deep comments, I haven't used it nor read it carefully):
>
> In this lines:
> assert (other.pop is 4);
>
> I think it's better to use
> assert(other.pop == 4);
Any particular reason?
> This lines show that a bulk addition method may be useful, that accepts any lazy/eagar iterable:
> MaxHeap!(uint) h;
> h ~= 1;
> h ~= 3;
> h ~= 2;
> h ~= 4;
Agreed. The implementation that I submitted had a push method that took
an array. If I had given it more thought, I would've accepted any Tango
container, as well, and maybe have a vararg version. (Except, ugh, the
new containers are all structs. That means writing a template method for
the task rather than using an interface.)
> The following aliases can be moved just below their respective methods, with a /// ditto before them:
> alias pop remove;
> alias push opCatAssign;
That was changed after I submitted the code.
> This style of comments:
> /** Inserts all elements in the given array into the heap. */
>
> Can sometimes be replaced by:
> /// Inserts all elements in the given array into the heap.
And then it takes slightly more work to change it into a multiline comment.
> The class ddoc misses the explanation for the Min template argument:
> struct Heap(T, bool Min) {
The version I submitted didn't have the Min template argument; it had a
virtual comparison method instead. That method was documented. The added
argument was not documented.
> Some lines of comments are too much long, they may be broken at 80-95 chars long.
Dunno how that slipped by me.
> An optional 'key' callable can be added; it can be used as sorting key mapper (Swartz-style). If not specified it can be "null" that means the current behaviour.
I actually need this behavior.
The version I submitted had a virtual comparison method, so that would
have been reasonably simple to implement:
class ComparatorHeap (T, alias comparator) : Heap!(T)
{
override int comp (T left, T right) {
return comparator (left, right);
}
}
Or:
class HeapMap (TKey, TValue) : Heap!(KeyValuePair!(TKey, TValue))
{
// add methods for inserting a key and a value without having to
// construct a KeyValuePair
}
As it stands, you'd need to use composition and forward a lot of methods
to an internal struct -- that's just hideous.
Tango has been on a struct rampage. It's part of their campaign against
extensibility. I guess making everything private or final just wasn't
enough.
I jest. But it is a serious concern of mine. If I see anything labeled
"package" rather than "protected", my liver will burst. At the very
least, I'll write a script to change anything private to protected, and
anything protected or package to public.
> Few other handy methods may be added:
>
> A merge() (~ and ~=) method can be added, maybe.
>
> heapreplace(heap, item) (pop and return the smallest item from the heap, and also push the new item. The heap size doesn't change)
>
> heapify(iterable)
> nlargest(n, iterable)
> nsmallest(n, iterable)
>
>
> The following is not a critic, just a note, I think programs with such low code density are harder to read to me, they seem like fresh snow:
<snip>
> I'd write that as this, allowing me to have more code on the screen:
I use a large monitor. Whitespace makes things more readable for me.
Though the giant tabs are annoying; I use a tabstop of four. Still, this
is only a display issue.
> In the future FibonacciHeap too may be useful to be added to the Std libraries.
>
> Bye,
> bearophile
Thanks for pointing out those issues. I'll correct those I can, but even
after that, the Tango heap will not suffice for my needs.
More information about the Digitalmars-d
mailing list