moveAt vs opIndex
Jonathan M Davis
jmdavisProg at gmx.com
Fri May 18 11:50:31 PDT 2012
On Friday, May 18, 2012 14:21:23 maarten van damme wrote:
> I am trying to write a randomaccessinfinite range that returns primes
> using the sieve of aristotle. I am however having problems
> understanding the difference between moveAt and opIndex;
>
> according to dlang;
> ElementType opIndex(size_t n);
> Returns the nth element in the composite range. Defined if all ranges
> offer random access.
>
> ElementType moveAt(size_t n);
> Destructively reads the nth element in the composite range. Defined if
> all ranges offer random access.
>
> Whats the difference between destructively reading and returning?
>
> And why would I need to define moveFront and front when I already
> defined opIndex?
The fact that you define opIndex has no effect on front. It's not like front is
going to be magically defined just because you defined opIndex. The same goes
with any other range function. If you don't define that specific function, then
it's not there. Functions are never generated just because you happen to have
one which could be used to implement another one. For a range to be a random
access range, it must implement all of the primitives of a bidirectional range
in addition to opIndex, which means front, back, popFront, popBack, and save.
If any of those aren't implemented, then your type isn't a random access
range.
moveFront is used to move the front of a range for stuff like swap, when simply
copying elements is too expensive. It's "destructive" in that the element
isn't there anymore when you do that. I'm not quite sure what really uses it
other than swap though. moveAt is the same except that it's for the given
index instead of front.
There was some talk of getting rid of the moveX primitives and just assuming
that structs are cheap to copy, but I don't know quite where that stands. But
AFAIK, the only reason to implement the moveX primitives (per
std.range.hasMobileElements) is if you're concerned about having elements
which are structs which have posblits which aren't O(1). If you're generating
primes, that shouldn't be an issue at all.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list