Overriding in operator

2011-03-04 Thread Magnus Lie Hetland
I'm writing a collection with functionality for membership checking. I 
thought it would be nice to use the in operator. In the docs for 
std.collections I surmise that this is the standard way to go. From the 
source code, I see there's no special opIn, but that it can be done 
with the more general...


   bool opBinary(string op)(T k) if (op == in) {
   ...
   }

Here T is, of course, a compile-time argument of the surrounding struct 
or class.


So ... this is used in the the Phobos source in the DMD 2.052 distro 
(if I'm not mistaken), but I can't get dmd 2.052 to accept it? I keep 
getting the error message Error: rvalue of in expression must be an 
associative array, not Foo!(uint).


I guess either that this is a recent feature -- I didn't see it 
mentioned in Andrei's book -- and that my Phobos source is too recent 
for my dmd ... or that I'm doing something wrong elsewhere in my code, 
preventing the operator overloading to take force. 
Suggestions/solutions?-)


--
Magnus Lie Hetland
http://hetland.org



Re: Overriding in operator

2011-03-04 Thread Mafi

Am 04.03.2011 17:01, schrieb Magnus Lie Hetland:

I'm writing a collection with functionality for membership checking. I
thought it would be nice to use the in operator. In the docs for
std.collections I surmise that this is the standard way to go. From the
source code, I see there's no special opIn, but that it can be done with
the more general...

bool opBinary(string op)(T k) if (op == in) {
...
}

Here T is, of course, a compile-time argument of the surrounding struct
or class.

So ... this is used in the the Phobos source in the DMD 2.052 distro (if
I'm not mistaken), but I can't get dmd 2.052 to accept it? I keep
getting the error message Error: rvalue of in expression must be an
associative array, not Foo!(uint).

I guess either that this is a recent feature -- I didn't see it
mentioned in Andrei's book -- and that my Phobos source is too recent
for my dmd ... or that I'm doing something wrong elsewhere in my code,
preventing the operator overloading to take force. Suggestions/solutions?-)



If you try to use it in the manner of `something in 
classWhichDefinesThisOpBinary` then it doesn't work because operator 
overloading normally overloads on the left operand (ie something). Use 
opBinaryRight(string op)(...) if(...) to get it working.


Mafi


Re: Overriding in operator

2011-03-04 Thread Magnus Lie Hetland

On 2011-03-04 17:06:29 +0100, Mafi said:

If you try to use it in the manner of `something in 
classWhichDefinesThisOpBinary` then it doesn't work because operator 
overloading normally overloads on the left operand (ie something). Use 
opBinaryRight(string op)(...) if(...) to get it working.


Aaah. That makes sense. And works.

*But*: I copied my code from Phobos :D If you search for in, with the 
quotes, in std/container.d, you'll find two occurrences. The actual 
live use (in RedBlackTree) is opBinaryRight (which makes sense), but in 
the dummy class, TotalContainer, which is described as an 
unimplemented container that illustrates a host of primitives that a 
container may define, uses just opBinary. The doc-comment says that 
$(D k in container) returns true if the given key is in the container.


So ... a bug, I guess? (One that isn't really executed -- but 
still...) Worth reporting?


Anwyay: Thanks for the clarification :)

--
Magnus Lie Hetland
http://hetland.org



Re: Overriding in operator

2011-03-04 Thread Simen kjaeraas

Magnus Lie Hetland mag...@hetland.org wrote:


On 2011-03-04 17:06:29 +0100, Mafi said:

If you try to use it in the manner of `something in  
classWhichDefinesThisOpBinary` then it doesn't work because operator  
overloading normally overloads on the left operand (ie something). Use  
opBinaryRight(string op)(...) if(...) to get it working.


Aaah. That makes sense. And works.

*But*: I copied my code from Phobos :D If you search for in, with the  
quotes, in std/container.d, you'll find two occurrences. The actual live  
use (in RedBlackTree) is opBinaryRight (which makes sense), but in the  
dummy class, TotalContainer, which is described as an unimplemented  
container that illustrates a host of primitives that a container may  
define, uses just opBinary. The doc-comment says that $(D k in  
container) returns true if the given key is in the container.


So ... a bug, I guess? (One that isn't really executed -- but  
still...) Worth reporting?


Anwyay: Thanks for the clarification :)


Definitely report it.


--
Simen


Re: Overriding in operator

2011-03-04 Thread spir

On 03/04/2011 05:01 PM, Magnus Lie Hetland wrote:

I'm writing a collection with functionality for membership checking. I thought
it would be nice to use the in operator. In the docs for std.collections I
surmise that this is the standard way to go. From the source code, I see
there's no special opIn, but that it can be done with the more general...

bool opBinary(string op)(T k) if (op == in) {
...
}

Here T is, of course, a compile-time argument of the surrounding struct or 
class.

So ... this is used in the the Phobos source in the DMD 2.052 distro (if I'm
not mistaken), but I can't get dmd 2.052 to accept it? I keep getting the error
message Error: rvalue of in expression must be an associative array, not
Foo!(uint).

I guess either that this is a recent feature -- I didn't see it mentioned in
Andrei's book -- and that my Phobos source is too recent for my dmd ... or that
I'm doing something wrong elsewhere in my code, preventing the operator
overloading to take force. Suggestions/solutions?-)


Didn't even know 'in' can be defined with opBinary...
I use opIn_r ('r' for right side, since the container stand on the right of the 
expression) everywhere, and it works fine.


Denis
--
_
vita es estrany
spir.wikidot.com



Re: Overriding in operator

2011-03-04 Thread Magnus Lie Hetland

On 2011-03-04 18:08:08 +0100, spir said:


Didn't even know 'in' can be defined with opBinary...
I use opIn_r ('r' for right side, since the container stand on the 
right of the expression) everywhere, and it works fine.


Huh. Cool. Works like a charm. Seems cleaner like the opBinaryRight 
solution, really. I just didn't know of it :)


--
Magnus Lie Hetland
http://hetland.org



Re: Overriding in operator

2011-03-04 Thread Ali Çehreli

On 03/04/2011 10:41 AM, Magnus Lie Hetland wrote:

On 2011-03-04 18:08:08 +0100, spir said:


Didn't even know 'in' can be defined with opBinary...
I use opIn_r ('r' for right side, since the container stand on the
right of the expression) everywhere, and it works fine.


Huh. Cool. Works like a charm. Seems cleaner like the opBinaryRight
solution, really. I just didn't know of it :)



It can be seen on the D1 documentation:

  http://www.digitalmars.com/d/1.0/operatoroverloading.html

That is (or will be) deprecated in D2.

Ali