How to iterate over const(RedBlackTree)?
monarch_dodra via Digitalmars-d
digitalmars-d at puremagic.com
Fri Oct 17 07:22:26 PDT 2014
On Friday, 17 October 2014 at 01:09:00 UTC, John McFarlane wrote:
> On Friday, 3 January 2014 at 07:22:32 UTC, monarch_dodra wrote:
>> On Thursday, 2 January 2014 at 14:59:55 UTC, Adam D. Ruppe
>> wrote:
>>> On Thursday, 2 January 2014 at 13:30:06 UTC, monarch_dodra
>>> wrote:
>>>> Currently, this is not possible. Or if it was, it would have
>>>> a
>>>> *very* high code cost inside RBT.
>>>
>>> It is possible in theory; RBT returns a separate Range type
>>> with opSlice that is implemented in terms of pointers to
>>> node. (This is hidden by an alias RBNode!Elem* Node, which
>>> gets in the way, but if those were inout(RBNode)* or const()*
>>> it'd work).
>>>
>>> We can have mutable pointers to const data, which would work
>>> with the range. So opSlice returns a mutable range that
>>> points back to const data.
>>>
>>>
>>> But in this case, none of the functions in rbtree use const
>>> nor inout, and there's some caching (e.g. _left and _right)
>>> that I'm not sure can work with it at all anyway. In a const
>>> node, the left and right properties won't work..
>>
>> Right. Doable, but not trivially so :/
>>
>> Array might be able to pull it off more easily.
>>
>> That said, it would only solve the "const container => Range"
>> issue, but the "const range" problem itself would remain :(
>
> I'm trying to get to grips with D, coming from a C++ background
> and const correctness is tough thing to get comfortable with.
> I've got a member variable that's RedBlackTree and I'd like to
> examine its contents inside an invariants() block. Is this
> possible at all right now? Obviously, this would be trivial to
> achieve using std::set::const_iterator so is it the language or
> the library that poses the difficulty for me? Thanks.
Currently, D containers don't offer "ConstRange opSlice() const"
(which would be the equivalent of const_iterator). This could be
a good solution the the issue.
But to answer your question: Both the language and library that
are making your life difficult. For starters, the D language does
not use const the way C++ does, so this usually confuses the
zealous newcomers that want to be "const correct". The library is
also getting in your way in that it does not provide support for
"const(container/range)" nor "container of const".
More information about the Digitalmars-d
mailing list