文字列クラス

大文字小文字を区別しない文字列クラスを作ってみた。

class istring {
    char value;
    this(char value) { this.value = value.dup; }
    int opEquals(istring rhs) { return icmp(value, rhs.value) == 0; }
    int opEquals(char rhs) { return icmp(value, rhs) == 0; }
    int opCmp(istring rhs) { return icmp(value, rhs.value); }
    int opCmp(char rhs) { return icmp(value, rhs); }
}

バカみたいに簡単なクラスである。
で、その使い勝手。

int main () {
    istring str1 = new istring("AAA");
    istring str2 = new istring("aaa");
    istring str3 = new istring("bbb");
    dout.writeLine("(str1 == str2) = " ~ .toString(str1 == str2));
    dout.writeLine("(str1 == aaa) = " ~ .toString(str1 == "aaa"));
    dout.writeLine("(aaa == str1) = " ~ .toString("aaa" == str1));
    dout.writeLine("(str1 < str3) = " ~ .toString(str1 < str3));
    dout.writeLine("(str1 < bbb) = " ~ .toString(str1 < "bbb"));
    dout.writeLine("(bbb < str1) = " ~ .toString("bbb" < str1));
    return 0;
}


実行結果:
(str1 == str2) = 1
(str1 == aaa) = 1
(aaa == str1) = 1
(str1 < str3) = 1
(str1 < bbb) = 1
(bbb < str1) = 0


期待通りの動きですな。というか期待以上だ。
比較演算子は、右辺と左辺の型をを入れ替えても正しく動作するのだなぁ。


難をいえば、クラスであるがゆえにいちいち new せねばならんのがウザいところ。
今データベースのイミュレートみたいなことをしているのだが、
カラム名は小文字で定義しても、大文字になる
カラム名を小文字で指定しても、正しく指してくれる
という機能を満たすのに上記クラスを使うかどうか悩ましいところ。
使わないとなると toupper の嵐になって、パフォーマンス上問題になりそう。