C++'s "defaulted comparison operators" proposal

2014-06-17 Thread Ali Çehreli via Digitalmars-d-learn

Can you come up with a D library solution to the following C++11 proposal:

  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3950.html

The idea is to be able to have standard comparison behavior for structs 
without boilerplate. For example, if the ordering should consider all 
members of the following struct one after the other (first 'i', then 
'l', and finally 's'):


struct S
{
int i;
long l;
string s;

mixin DefaultComparisons!();// something like this?
}

Or perhaps with an explicit comparison order? For example, to use 'l' as 
the primary key instead, and 'i' as the secondary key, and to ignore 
'buffer' altogether:


struct S
{
@Order(2)int i;
@Order(1)long l;
@OrderIgnore string buffer;

mixin DefaultComparisons!();// ?
}

Thank you,
Ali


Re: C++'s "defaulted comparison operators" proposal

2014-06-18 Thread Artur Skawina via Digitalmars-d-learn
On 06/18/14 07:49, Ali Çehreli via Digitalmars-d-learn wrote:

> The idea is to be able to have standard comparison behavior for structs 
> without boilerplate. For example, if the ordering should consider all members 
> of the following struct one after the other (first 'i', then 'l', and finally 
> 's'):

Isn't this already implicitly done? (I thought it was just my old compiler
version that did not yet support this)

Anyway, something like this wrapped in an appropriate template
should do:

   int opCmp()(const typeof(this) b) const {
  foreach (I, _; typeof(this.tupleof))
 static if (is(typeof(this.tupleof[I].opCmp(b.tupleof[I] {
if (auto d = this.tupleof[I].opCmp(b.tupleof[I]))
return d;
 } else {
if (auto d = this.tupleof[I] - b.tupleof[I])
return d;
 }
  return 0;
   }

and

http://forum.dlang.org/post/mailman.1230.1333044904.4860.digitalmar...@puremagic.com

artur


Re: C++'s "defaulted comparison operators" proposal

2014-06-18 Thread Ellery Newcomer via Digitalmars-d-learn

On Wednesday, 18 June 2014 at 05:49:30 UTC, Ali Çehreli wrote:
Can you come up with a D library solution to the following 
C++11 proposal:


  
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3950.html




did this years ago (or something similar, at least):
https://bitbucket.org/ariovistus/multi_index/src/0993f8604c1438f6d9f26f580939b42fdd159a67/src/multi_index.d?at=default#cl-4654

example:

https://bitbucket.org/ariovistus/multi_index/src/0993f8604c1438f6d9f26f580939b42fdd159a67/unittests/multi_compare.d?at=default