one step towards unification of std.algorithm and std.string
Simen kjaeraas
simen.kjaras at gmail.com
Wed Dec 30 11:58:22 PST 2009
On Wed, 30 Dec 2009 19:45:02 +0100, Andrei Alexandrescu
<SeeWebsiteForEmail at erdani.org> wrote:
> I've wanted for a long time to move more stuff from std.string into
> std.algorithm. One issue that has kept me from doing that is the case
> issue, i.e. some string functions have mind/ignore case flavors that
> don't make sense for other data types. For example consider cmp() and
> icmp(): http://www.digitalmars.com/d/2.0/phobos/std_string.html#cmp or
> the recently changed indexOf:
> http://www.digitalmars.com/d/2.0/phobos/std_string.html#indexOf
>
> It occurred to me that I can transfer the case sensitivity away from the
> algorithm into the data. To do so, we only need to define one more data
> type NoCase that behaves much like a dchar but defines opEquals to
> compare ignoring case. Then, we need to define a NoCase range that
> behaves like a bidirectional range of dchar but again uses
> case-insensitive comparisons. Add some garnishing and you get to write:
>
> string a = "Hello, World!"
> auto x = indexOf(a, nocase("world"));
> assert(x == 7);
>
> I'm quite excited about this because it modularizes the entire case
> business, opens strings to many algorithms, and allows generalization of
> string algorithms.
>
> Well, that is until I hit
> http://d.puremagic.com/issues/show_bug.cgi?id=3659
>
> Any thoughts and ideas would be appreciated.
>
>
> Andrei
Sound nice. I've also wanted to see the two combined.
I take it the NoCase range is a lazy wrapper of a (d|w)?char range?
Some testing shows that 3659 can be sidestepped by making opEquals a
template function, or by creating more than one opEquals, where one
matches const bool( const ref typeof( this ) ).
--
Simen
More information about the Digitalmars-d
mailing list