On Fri, 04 Mar 2011 12:13:34 -0500, spir <denis.s...@gmail.com> wrote:
On 03/04/2011 05:43 PM, Steven Schveighoffer wrote:
But with the current compiler, you can use opApply to achieve that
behavior.
opApply should work but it is supposed to be slower.
It depends on the application and aggregate you are trying to iterate.
If inlining is possible, ranges can be extremely fast. However, there are
certain applications that are better suited or only work with opApply:
* iterating polymorphic types (i.e. classes or interfaces)
* iterating non-linearly (e.g. iterating a tree)
* iterating multiple items in foreach (i.e. foreach(i, v; arr) )
In addition, LDC is able to inline opApply delegates that are
compiler-generated, making opApply pretty much as fast as a range
iteration. I hope some day dmd can do this too.
Defining range primitives directly on the object/container cannot work
as of now, unfortunately, because of a pair of bugs (conflicts in
formatValue template definitions between struct/class on one hand and
ranges on the other).
It is not a good idea to define range primitives on a container. This
would mean that iterating the container destroys the data. What you want
is a range on the container, and to iterate that range. Think of a range
as a view of the data in the container. Think of the container as the
owner of the data. A confusing aspect is that builtin arrays are often
thought of as containers. They are not containers, they are ranges. The
owner of the data is actually the GC.
-Steve