Dear Kevin,

Thanks for the responses!  I will look into using the 'state' for the 
iterator that can be later dereferenced.  Indeed, one has to be careful 
that the iterator could point to a data item that has been changed or 
deleted.  In C++, for each container operation there is a specification of 
whether iterators are invalidated by the operation.

As for multiple ways to index, the example I have in mind is as follows: if 
m is the associative map, (k,v) is a key-value pair, and i is an iterator 
(the pointer kind, like in C++) to (k,v), then m[k] should return v, while 
m[i] should return (k,v).  But I am asking the forum whether a distinctive 
syntax is available for the second variant.

Finally, with regard to the third issue, perhaps I didn't express my 
question well.  Suppose someone uses my 2-3 trees and has a statement in 
his/her code such as 
      i = next(m,i)
where m is the map and i is an iterator (of the pointer kind).  This 
statement is supposed to advance to the next item according to the 
sort-order of keys.  My routine that gets invoked is as follows:

function nextloc{K,D}(t::BalancedTree{K,D}, i::Int)
    if i == 2
        error("Attempt to advance past end of balanced tree")
    end
    ii = i
    p = t.data[i].parent
    while true
        newp, newii = nextloc0(t, p, ii)
        if newii == 2 || t.data[newii].parent > 0
            return newii
        end
        p, ii = newp, newii
    end
end

Now, suppose instead the user writes:

    @inbounds i = next(m,i)

Then I would want a different (faster, less safe) version of 'nextloc' 
invoked.  In the different version, the preliminary safety-test whether 
i==2 is omitted, and the array subscript operations within my code are all 
prefixed by @inbounds.  So my question to the forum is whether my tree code 
can detect whether the user has put an @inbounds declaration in his/her 
code when it invokes my routines.

Thanks,
Steve


P.S. If you want to look at my code, please 
see: https://www.dropbox.com/s/021yc196j55d5yd/baltree.jl  This code is 
very preliminary and has not even been executed, except for insert and 
next.  (See the test routine test2(), which seems to work.)  The 'delete' 
code is currently a hack, and I need to write a proper delete code that 
shrinks the tree.

Reply via email to