Treating the abusive unsigned syndrome

KennyTM~ kennytm at gmail.com
Tue Nov 25 22:21:57 PST 2008


Nick Sabalausky wrote:
> "bearophile" <bearophileHUGS at lycos.com> wrote in message 
> news:gghc97$1mfo$1 at digitalmars.com...
>> Steven Schveighoffer:
>>> lol!!!
>> I know, I know... :-) But when people do errors so often, the error is 
>> elsewhere, in the original choice of that word to denote how many items an 
>> iterable has.
>>
>> In my libs I have defined len() like this, that I use now and then (where 
>> running speed isn't essential):
>>
>> long len(TyItems)(TyItems items) {
>>    static if (HasLength!(TyItems))
>>        return items.length;
>>    else {
>>        long len;
>>        // this generates: foreach (p1, p2, p3; items) len++;  with a 
>> variable number of p1, p2...
>>        mixin("foreach (" ~ SeriesGen1!("p", ", ", OpApplyCount!(TyItems), 
>> 1) ~ "; items) len++;");
>>        return len;
>>    }
>> } // End of len(items)
>>
>> /// ditto
>> long len(TyItems, TyFun)(TyItems items, TyFun pred) {
>>    static assert(IsCallable!(TyFun), "len(): predicate must be a 
>> callable");
>>    long len;
>>
>>    static if (IsAA!(TyItems)) {
>>        foreach (key, val; items)
>>            if (pred(key, val))
>>                len++;
>>    } else static if (is(typeof(TyItems.opApply))) {
>>        mixin("foreach (" ~ SeriesGen1!("p", ", ", OpApplyCount!(TyItems), 
>> 1) ~ "; items)
>>            if (pred(" ~ SeriesGen1!("p", ", ", OpApplyCount!(TyItems), 1) 
>> ~ "))
>>                len++;");
>>    } else {
>>        foreach (el; items)
>>            if (pred(el))
>>                len++;
>>    }
>>
>>    return len;
>> } // End of len(items, pred)
>>
>> alias len!(string) strLen; /// ditto
>> alias len!(int[]) intLen; /// ditto
>> alias len!(float[]) floatLen; /// ditto
>>
>> Having a global callable like len() instead of an attribute is (sometimes) 
>> better, because you can use it for example like this (this is working 
>> syntax of my dlibs):
>>
>> children.sort(&len!(string));
>> That sorts the array of strings "children" according to the given callable 
>> key, that is the len of the strings.
>>
> 
> If we ever get extension methods, then maybe something along these lines 
> would be nice:
> 
> extension typeof(T.length) len(T t)
> {
>     return T.length;
> }
> 
> 

Already works:

uint len(A) (in A x) { return x.length; }



More information about the Digitalmars-d mailing list