BrewSDK 開発(2)

スマートオブジェクトと、ストリーム関係の一部を実装しました。

id:melpon:19990101

ストリームクラスは、参照オブジェクトクラス風になっています。
スマートオブジェクトクラスは、参照オブジェクトクラス群の基底クラスです。
参照オブジェクトクラスにすると、次のようなプログラムを組むことが出来るようになります。

BrewByteArrayInputStream bais = BrewByteArrayInputStream::Create( inbuf , insize );
BrewUnzipStream us = BrewUnzipStream::Create( bais );
BrewDataInputStream dis = BrewDataInputStream::Create( us );
int num = dis.ReadInt();
for( int i = 0 ; i < n ; i++ ){
    int size = dis.ReadInt();
    dis.Read( outbuf[ n ] , size );
}
dis = null;     // ストリームを閉じる(デストラクタで解放されるので、別に放置したままでも良い)

Brew〜 というクラスは、ポインタを使っていないというところと、ドット演算子でアクセスしていることに注目です。
また、BrewUnzipStream::Create() の引数は、BrewInputStream という、入力ストリーム基底クラスをセットすることが出来るので、これを継承したクラスならどのストリームでも unzip することが可能です。


言ってみれば、スマートポインタの、ドット演算子でのアクセスを行うバージョンのようなものですが、少し違う部分があります。
それは、this ポインタもスマートオブジェクトになっているということです。
スマートポインタを使って内部で this を渡した場合、それは管理されていない状態のポインタとなるので危険です。
しかし、スマートオブジェクトというクラスが this ポインタの代替となるメンバを持っているので、これを渡してやることにより、安全な this の受け渡しが可能になります。


とりあえずファイルストリーム実装しないとなぁ……(;´Д`)