Treating the abusive unsigned syndrome

Nick Sabalausky a at a.a
Tue Nov 25 15:18:24 PST 2008


"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;
}





More information about the Digitalmars-d mailing list