2010-11-04-01-文字コードの話 - 9 - project-enigma

2010-11-04-01-文字コードの話 - 9

>> Site top >> weblog >> 月別アーカイブ >> 2010年11月のlog >> 2010-11-04-01-文字コードの話 - 9

最終更新日付:2013/12/31 07:35:53


文字コードの話 - 9

2010 年 11 月 04 日

前回書いた stateful なエンコーディングへの対応について。どうやら大手術になりそうだ。

ひとまずの方針は、エンコーディングを処理するクラスのインスタンスをシングルトンのように扱うデザインはそのままにすること。そして、ポインタ位置の前進や後退、文字値の取得や設定といった、状態が関わる部分をそこから切り離すことだ。

この切り離される部分というのは、Increment, Decrement, GetCharValue, PlaceChar の4種類がひとまずだ。そしてこれらは、まさに反復子として抽出される振舞いに他ならない。そこで、それぞれのエンコーディングクラスについて Iterator と ConstIterator の2クラスを用意することにした。これらは STL のコンテナにおける iterator と const_iterator とほぼ同じものだ。

そしてこれらを反復子として位置付ける以上、operator++ や operator* を使いたくなるのは人情というものだろう。しかし、ここにもまた面倒ゴトが待っている。今回はその話をして終わりにしよう。

非 const な反復は、その間接参照を左辺値として使うことができなければならない(というか、そうでなければ不自然とみなされる)。つまり、以下のように。

 *itr  =  100;

普通にポインタのメタファーとして見れば、これは現在指している要素のリファレンスを返すことを意味する。しかし、少し凝ったコトをする実装では、単純にリファレンスを返すことができない場合があるのだ。それは、返すべきリファレンスが用意できない場合である。

この場合、Encoding で統一的に使用している文字値のデータ型は unsigned int だ。Iterator が文字シーケンスの反復子として振る舞うのであれば、operator* は文字値のデータ型である unsigned int 型のリファレンスを返さなければならない。しかし、この反復子が内部に保持しているポインタは char* 型だ。それは、Encoding の世界では文字列ポインタの型は char* だからであり、文字値の型と一致しないのは可変バイト幅のエンコーディングに対応するためだ。かくしてこの反復子は簡単にリファレンスを返すことができないのである。

いかがだろう。簡単な相談ではないのである。しかし、解決方法はすでにわかっている。もちろんどこかで学んだものであり、自分で考え出したなどとは言わない。記憶が間違っていなければ、やはり STL のテクニックだったと思う。細かいことは次回にしよう。今日はこれにて。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : 開発

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.