defining "in" What is the proper way in D2?

Steven Schveighoffer schveiguy at yahoo.com
Mon Sep 12 05:16:26 PDT 2011


On Sun, 11 Sep 2011 18:11:11 -0400, Timon Gehr <timon.gehr at gmx.ch> wrote:

> On 09/11/2011 11:12 PM, Jonathan M Davis wrote:
>> On Sunday, September 11, 2011 14:00:55 Charles Hixson wrote:
>>> On 09/11/2011 01:25 PM, Vladimir Panteleev wrote:
>>>> On Sun, 11 Sep 2011 23:02:37 +0300, Charles Hixson
>>>>
>>>> <charleshixsn at earthlink.net>  wrote:
>>>>> I can't figure it out from
>>>>> http://www.digitalmars.com/d/2.0/operatoroverloading.html#Binary
>>>>
>>>> // I assume your data structure looks like this
>>>> class Node(Key, Data)
>>>> {
>>>> Key k;
>>>> Node!(Key, Data) left, right;
>>>> int level;
>>>> // ...
>>>>
>>>> void opBinary!("in")(Key k)
>>>> {
>>>> if (level == 0) return false;
>>>> if (k<  key) return k in left;
>>>> if (key<  k) return k in right;
>>>> return true;
>>>> }
>>>> }
>>>
>>> VOID??  I'm going to presume that this should have been bool.
>>> Otherwise, thanks.  That was they syntax I couldn't figure out from the
>>> docs.
>>>
>>> And, yeah.  That's what it looks like.  My find code was wrong, because
>>> it should have referenced the node, so what I need to do is move the  
>>> cod
>>> into the node class.  But it was the syntax of defining the opBinary
>>> specialization that was hanging me up.  (For some reason I have a hard
>>> time wrapping my mind around template code.)
>>
>> The "in" operator normally returns a pointer to the value that you're  
>> trying
>> to find (and returns null if it's not there). Making it return bool may  
>> work,
>> but it's going to be a problem for generic code.
>
> -1
>
> I think the fact that "in" for AAs returns a pointer is a mistake and  
> ugly in the first place and any generic code that relies on any  
> container to return a raw internal pointer is flawed by itself imho.

That reminds me, I should write opIn for dcollections maps.  It will  
return a cursor (not a pointer).

Hm... probably have to overload cursor.opStar and opCast(bool) at that  
point too for the sake of generic code...

-Steve


More information about the Digitalmars-d-learn mailing list