digitalmars.D.learn - Template function : use the array's one !
Hello,
I'm searching to have a generic comparator function.
I done this :
/* ------------ CODE -------------------- */
import tango.io.Stdout;
/***
* Not for arrays
***/
int compare(T)(T o1,T o2)
{
static if ( is( T bar == class ) || is( T bar == struct ) )
return o1.opCmp(o2);
else
return o2 - o1;
}
/***
* For arrays
***/
int compare(T:T[])(T[] o1,T[] o2)
{
size_t minLength = ( o1.length<o2.length ? o1.length : o2.length) ;
for (size_t i=0;i<minLength;i++)
{
int result = compare(o1[i],o2[i]);
if (result != 0)
return result;
}
return o2.length - o1.length ;
}
/***
* Test
***/
void main()
{
byte[] a = [10,12,13];
byte[] b = [15,16,17];
Stdout( compare(a,b) ).newline ;
}
/* ------------ END CODE ---------------- */
But this code return a compilation error :
test_cmp.d(12): Error: cannot implicitly convert expression (o2 - o1) of
type byte[] to int
test_cmp.d(41): template instance test_cmp.compare!(byte[]) error
instantiating
It seems it's the first compare function (without array in parameter)
which is hook.
How can I declare this compare function to use specific code to compare
arrays ?
Thanks in advance,
TSalm
Feb 17 2009
Reply to TSalm,Hello, I'm searching to have a generic comparator function. I done this :[...]How can I declare this compare function to use specific code to compare arrays ? Thanks in advance, TSalmtake a look at static if and is http://www.digitalmars.com/d/1.0/version.html#staticif http://www.digitalmars.com/d/1.0/expression.html#IsExpression
Feb 17 2009
take a look at static if and is http://www.digitalmars.com/d/1.0/version.html#staticif http://www.digitalmars.com/d/1.0/expression.html#IsExpressionThanks for this links. But I don't see anything about how to test if it's an array or not... Is it not possible ?
Feb 17 2009
Hello TSalm,look at point 5 IIRC: static if(is(T B : B[])) { // if T is an array, this is used and B is the element type }take a look at static if and is http://www.digitalmars.com/d/1.0/version.html#staticif http://www.digitalmars.com/d/1.0/expression.html#IsExpressionThanks for this links. But I don't see anything about how to test if it's an array or not... Is it not possible ?
Feb 17 2009
Le Tue, 17 Feb 2009 23:03:04 +0100, BCS <none anon.com> a écrit:Hello TSalm,Incredible ! Thanks a lot BCS.look at point 5 IIRC: static if(is(T B : B[])) { // if T is an array, this is used and B is the element type }take a look at static if and is http://www.digitalmars.com/d/1.0/version.html#staticif http://www.digitalmars.com/d/1.0/expression.html#IsExpressionThanks for this links. But I don't see anything about how to test if it's an array or not... Is it not possible ?
Feb 17 2009
TSalm Wrote:Hello, I'm searching to have a generic comparator function. I done this : /* ------------ CODE -------------------- */ import tango.io.Stdout; /*** * Not for arrays ***/ int compare(T)(T o1,T o2) { static if ( is( T bar == class ) || is( T bar == struct ) ) return o1.opCmp(o2); else return o2 - o1; } /*** * For arrays ***/ int compare(T:T[])(T[] o1,T[] o2)Change this line to: int compare(T:T[])(T o1, T o2){ size_t minLength = ( o1.length<o2.length ? o1.length : o2.length) ; for (size_t i=0;i<minLength;i++) { int result = compare(o1[i],o2[i]); if (result != 0) return result; } return o2.length - o1.length ; } /*** * Test ***/ void main() { byte[] a = [10,12,13]; byte[] b = [15,16,17]; Stdout( compare(a,b) ).newline ; } /* ------------ END CODE ---------------- */ But this code return a compilation error : test_cmp.d(12): Error: cannot implicitly convert expression (o2 - o1) of type byte[] to int test_cmp.d(41): template instance test_cmp.compare!(byte[]) error instantiating It seems it's the first compare function (without array in parameter) which is hook. How can I declare this compare function to use specific code to compare arrays ? Thanks in advance, TSalm
Feb 18 2009
TSalm Wrote:You are right. But despite this function, at compile time, an error is return : .\src\tsalm\tools\Generic.d(20): Error: cannot implicitly convert expression (o2 - o1) of type int[3u] to int .\src\tsalm\tools\Generic.d(33): template instance tsalm.tools.generic.compare!(int[3u]) error instantiating Command C:\DMD\dsss\bin\rebuild.exe returned with code 1, aborting. Error: Command failed, aborting.int compare(T:T[])(T[] o1,T[] o2)Change this line to: int compare(T:T[])(T o1, T o2)
Feb 18 2009









TSalm <TSalm free.fr> 