dcollections 1.0 and 2.0a beta released

Michel Fortin michel.fortin at michelf.com
Thu May 20 07:44:30 PDT 2010


On 2010-05-20 09:22:27 -0400, Steven Schveighoffer <schveiguy at yahoo.com> said:

> Michel Fortin Wrote:
> 
>> On 2010-05-20 06:34:42 -0400, Steven Schveighoffer <schveiguy at yahoo.com> said:
>> 
>>> I understand these points, but I'm already using interfaces to copy
>>> data between containers.  I don't have to, I could have used generic
>>> code, but this way, only one function is instantiated to copy data from
>>> all the other containers.  The problem with using generic code is that
>>> the compiler will needlessly duplicate functions that are identical.
>> 
>> One question. Have you calculated the speed difference between using an
>> interface and using generic code? Surely going through all those
>> virtual calls slows things down a lot.
>> 
>> I do like interfaces in principle, but I fear it'll make things much
>> slower when people implement things in term of interfaces. That's why
>> I'm not sure it's a good idea to offer container interfaces in the
>> standard library.
> 
> It's not that much slower.  You get a much higher speedup when things 
> can be inlined than virtual vs. non-virtual.

Yes, but that was part of the equation: a call to a template function 
can be inlined, not a virtual call (most of the time).

> However, I should probably make all the functions in the concrete 
> implementations final.  I made several of them final, but I should do 
> it across the board.

Yeah, probably.

> One thing I just thought of -- in dcollections, similar types can be 
> compared to one another.  For example, you can check to see if a 
> HashSet is equal to a TreeSet.  But that would not be possible without 
> interfaces.

I'm not sure of what you're saying here. Are you saying it can be done 
with an interface but not with a template type? Why can't this work:

	class TreeSet {
		bool opEquals(T)(T t) if (IsSet!T) {
			if (t.length != this.length)
				return false;
			foreach (element; this) {
				if (!t.has(element))
					return false;
			}
			return true;
		}
	}

	TreeSet a = new TreeSet;
	HashSet b = new HashSet;
	assert(a == b);

(sorry, I still have to start using the new operator overloading syntax.)

-- 
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/



More information about the Digitalmars-d-announce mailing list