Major performance problem with std.array.front()

Nick Sabalausky SeeWebsiteToContactMe at semitwist.com
Thu Mar 6 20:44:30 PST 2014


On 3/6/2014 11:11 PM, Nick Sabalausky wrote:
> What about this?:
>
> Anywhere we currently have a front() that decodes, such as your example:
>
>>    @property dchar front(T)(T[] a) @safe pure if (isNarrowString!(T[]))
>>    {
>>      assert(a.length, "Attempting to fetch the front of an empty array
>> of " ~
>>             T.stringof);
>>      size_t i = 0;
>>      return decode(a, i);
>>    }
>>
>
> We rip out that front() entirely. The result is *not* technically a
> range...yet! We could call it a protorange.
>
> Then we provide two functions:
>
> auto decode(someStringProtoRange) {...}
> auto raw(someStringProtoRange) {...}
>
> These convert the protoranges into actual ranges by adding the missing
> front() function. The 'decode' adds a front() which decodes into dchar,
> while the 'raw' adds a front() which simply returns the raw underlying
> type.
>
> I imagine the decode/raw would probably also handle any "length"
> property (if it exists in the protorange) accordingly.
>
> This way, the user is forced to specify "myStringRange.decode" or
> "myStringRange.raw" as appropriate, otherwise myStringRange can't be
> used since it isn't technically a range, only a protorange.
>
> (Naturally, ranges of dchar would always have front, since no decoding
> is ever needed for them anyway. For these ranges, the decode/raw funcs
> above would simply be no-ops.)
>

Of course, I just realized that these front()s can't be added unless 
there's already a front to be called in the first place...

So instead of ripping out the current front() functions entirely, we 
replace "front" with some sort of "rawFront" which the raw/decode 
versions of front() can query in order to provide actual 
decoding/non-decoding ranges.



More information about the Digitalmars-d mailing list