"in" everywhere

Tomek Sowiński just at ask.me
Thu Oct 7 16:38:09 PDT 2010


Tomek Sowiński napisał:

> Simen kjaeraas napisał:
> 
>> Tomek Sowiński <just at ask.me> wrote:
>> 
>>> __traits(getAttribute, opIn, @complexity).bigOh == O.constant
>> 
>> How does this test for things like N log M?
>> 
>> __traits(getAttribute, opIn, @complexity).bigOh == tuple( O.linear,
>> O.logarithmic )
> 
> Or:
> 
> __traits(getAttribute, opIn, @complexity).bigOh = O.linear * O.log
> 
> bigOh could be e.g. a struct with an overloaded multiplier.
> 
> But you brought up something interesting -- how to bind N, M with
> different properties of function arguments; big oh expressions can get
> quite complex, e.g.
> 
> void completeSort(alias less = "a < b", SwapStrategy ss =
> SwapStrategy.unstable, Range1, Range2)(SortedRange!(Range1,less) lhs,
> Range2 rhs);
> 
> "[...] Performs Ο(lhs.length + rhs.length * log(rhs.length)) (best case)
> to Ο((lhs.length + rhs.length) * log(lhs.length + rhs.length))
> (worst-case) evaluations of swap."
> 
> Even if the attribute properties could see the arguments, how to deal with
> things like lhs.length + rhs.length? It has to be inspectable at
> compile-time. One idea is to store the expression's abstract syntax tree
> (we want AST macros in D3 anyway)... But I got a feeling we're heading for
> an overkill :)

If O.linear was a template, it could take an alias...

alias completeSort f;
__traits(getAttribute, f, @complexity).bigOh == (O.linear!(f.args.lhs.length) + O.linear!
(f.args.lhs.length)) * O.log!(O.linear!(f.args.lhs.length) + O.linear!(f.args.lhs.length))

:)

-- 
Tomek


More information about the Digitalmars-d mailing list