proper range usage

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Nov 3 14:36:20 PST 2015


On 11/03/2015 01:12 AM, Alex wrote:

 >> That problem is solved by the convention that 'end' is one beyond the
 >> last valid element. So, when there is only the element 42, then
 >> begin==42 and end==43. Only when the last element (42 in this case) is
 >> consumed, begin==end.
 >>
 > This part is dangerous, and I'm not sure how dangerous it is.

If I understand correctly, you are referring to 'end' being one beyond. 
It is not dangerous because nobody dereferences that index. The slice is 
simply empty when beg==end.

This is how C++'s iterators work and how D's number ranges work:

     foreach (i; 0 .. 3) {
         arr[i];    // i will not be 3
     }

 > Now, I
 > have to dive into my structure a little bit deeper:
 > Say, I have three classes:
 >
 >
 > class B //current structure
 > {
 >      M[] _ms;
 >      P[] _ps;
 >      P[M] assoc;
 > }
 >
 > struct M
 > {
 >      int id;
 >      alias id this;
 > }
 >
 > struct P
 > {
 >      int id;
 >      alias id this;
 >      int begin;
 >      int end;
 > }

 > The idea is, that P structs are disjunct (and contigous, if this does
 > matter) arrays of M's. And the question is, what happens, if I set the
 > end property of a P to a number, which belongs to another P.

That's fine. D's slices do that all the time: arr[0..3] and arr[3..$] 
seem to share index 3 but it is not the case: The first slice does not 
use it but the second one does.

Aside: If 'begin' and 'end' are indexes into an actual array (of Ms? I 
forgot), perhaps you can keep slices instead:

struct P
{
      int id;
      alias id this;
      M[] ms;    // <--
}

It would be almost as efficient but larger: Altough you use two ints 
(total 8 bytes), a slice is 16 bytes on a 64-bit system: a pointer and a 
size_t.

Ali



More information about the Digitalmars-d-learn mailing list