nlib
nn::nlib::OutputStream クラスabstract

出力ストリームの基底クラスです。このクラスを実体化することはできません。 [詳解]

#include "nn/nlib/OutputStream.h"

+ nn::nlib::OutputStream の継承関係図

公開型

enum  BufferingMode {
  kBufferingModeBlockBuffered = 0,
  kBufferingModeLineBuffered,
  kBufferingModeUnbuffered
}
 OutputStreamのバッファリングモードです。 [詳解]
 

公開メンバ関数

size_t Pos () const noexcept
 ストリーム上の現在位置を返します。 [詳解]
 
uint64_t Pos64 () const noexcept
 ストリーム上の現在位置を64bit整数で返します。 [詳解]
 
bool Write (int b) noexcept
 ストリームに1バイトのデータを書き込みます。 [詳解]
 
bool Write (const void *p, size_t n) noexcept
 ストリームにn バイトのデータを書き込みます。 [詳解]
 
bool WriteGather (const nlib_fd_iovec *iov, int iovcnt) noexcept
 複数の非連続のバッファからデータをストリームに書き出します。 [詳解]
 
bool Flush () noexcept
 ストリームをフラッシュします。 [詳解]
 
bool Close () noexcept
 ストリームをフラッシュした後、ストリームを閉じます。成功した場合にはtrueを返します。 [詳解]
 
errno_t GetErrorValue () const noexcept
 エラー値を取得します。 [詳解]
 
BufferingMode GetBufferingMode () const noexcept
 バッファリングモードを取得します。
 
 operator bool () const
 内部でエラーが発生していなければtrueを返します。
 
基本的なメンバ関数
constexpr OutputStream () noexcept
 デフォルトコンストラクタです。
 
virtual ~OutputStream () noexcept
 デストラクタです。何もしません。
 

派生クラスから利用する関数

BufferingMode m_BufferingMode
 バッファリングモードが格納されています。 [詳解]
 
void ResetBuffer (void *p, size_t nbytes) noexcept
 OutputStreamが持つバッファを設定します。 [詳解]
 
void SetError (errno_t e) const noexcept
 OutputStreamにエラーを設定します。 [詳解]
 

詳解

出力ストリームの基底クラスです。このクラスを実体化することはできません。

説明
同期かつシーケンシャルなアクセスI/Fを持つ出力ストリームの基底となります。 実際のデータの書き込み先は、派生クラスによって定義されます。

派生クラスの実装のための情報

OutputStreamクラスの仕様は予告なしに変更される可能性があるので、出来るだけ派生クラスを独自に実装しない方がリスクは低いですが、必要な場合、派生クラスは以下の仮想関数をオーバーライドすることで定義できます。
bool PushBuffer_(const void* p, size_t nbytes, bool do_flush)
引数p はデバイスに書きこむデータへのポインタで、nbytes はサイズです。 do_flushtrueの場合はデバイスをフラッシュする必要があります。
また、後述のGetWorkBuffer_()でバッファが設定されなかった場合は、pNULLが入ってコールされることがあります。 その場合はResetBuffer()をコールしてOutputStreamの内部バッファをセットする必要があります。
エラーケースの対応として以下を例として挙げます。
  • 対応デバイスがない場合(ハンドルが無効等)はEBADFエラーを設定しfalseを返します。
  • 途中で書き込み失敗が確定した場合はエラー(ex. EIO)を設定しfalseを返します。
bool Close_()
Close()から呼び出されて内部のハンドル等をクローズします。 Close_()が呼び出される時点で基底クラスが参照するバッファはPushBuffer_()によって空になっていることが保証されます。 派生クラスがこれとは別にバッファを持っている場合、実際にデバイスに書き込んでからデバイスのクローズを行う必要があります。
また、どのような場合でも内部で保持するリソースを全て解放する必要があります。 基底クラスのデストラクタからはClose_()が呼ばれないことに注意してください。
エラーケースの対応として以下を例として挙げます。
  • 対応デバイスがない場合(ハンドルが無効等)はEBADFエラーを設定しfalseを返します。
  • クローズの際のFlush動作等で失敗した場合、何らかのエラー(ex. EIO)を設定しfalseを返します。
エラーの場合でも、ハンドル等の内部リソースの解放を確実に行うことが必要であることに注意してください。
outGetWorkBuffer void* GetWorkBuffer_(size_t* nbytes)
is_buf_NULLの場合、OutputStreamはまずこの関数を呼び出してバッファを獲得しようとします。 戻り値がバッファへのポインタで、nbytes にサイズが設定されます。 バッファ自体の所有権は派生クラス側にあるので、バッファの解放は派生クラスのコードで行う必要があります。
メモリの確保等に失敗してバッファを渡せない場合は、NULLを返しnbytes に0を設定する必要があります。
この関数をオーバーライドしない場合はNULLを返し、nbytes には-1が代入されます。 この場合、InputStreamFillBuffer_()においてバッファを獲得しようとします。

OutputStream.h30 行目に定義があります。

列挙型メンバ詳解

◆ BufferingMode

OutputStreamのバッファリングモードです。

列挙値
kBufferingModeBlockBuffered 

出力をブロックバッファします。デフォルトです。

kBufferingModeLineBuffered 

出力をラインバッファします。コンソールに出力する場合に設定されます。

kBufferingModeUnbuffered 

出力をバッファリングしません。

OutputStream.h32 行目に定義があります。

関数詳解

◆ Close()

nn::nlib::OutputStream::Close ( )
noexcept

ストリームをフラッシュした後、ストリームを閉じます。成功した場合にはtrueを返します。

戻り値
成功した場合はtrue
説明
falseの場合は途中で何らかの処理が失敗しています。失敗した場合でも再度クローズを行う必要はありません。 既にクローズが成功している場合は成功しtrueを返します。
各種例:
misc/stringutils/stringutils.cpp.

◆ Flush()

nn::nlib::OutputStream::Flush ( )
inlinenoexcept

ストリームをフラッシュします。

戻り値
成功した場合はtrue
説明
バッファされている書き込みデータを全てストリームに書き出します。

OutputStream.h101 行目に定義があります。

◆ GetErrorValue()

nn::nlib::OutputStream::GetErrorValue ( ) const
inlinenoexcept

エラー値を取得します。

戻り値
エラー値

OutputStream.h103 行目に定義があります。

◆ Pos()

nn::nlib::OutputStream::Pos ( ) const
inlinenoexcept

ストリーム上の現在位置を返します。

戻り値
ストリーム上の現在位置(書き込んだバイト数)

OutputStream.h54 行目に定義があります。

◆ Pos64()

nn::nlib::OutputStream::Pos64 ( ) const
inlinenoexcept

ストリーム上の現在位置を64bit整数で返します。

戻り値
ストリーム上の現在位置(書き込んだバイト数)

OutputStream.h55 行目に定義があります。

◆ ResetBuffer()

nn::nlib::OutputStream::ResetBuffer ( void *  p,
size_t  nbytes 
)
inlineprotectednoexcept

OutputStreamが持つバッファを設定します。

引数
[in]pバッファへのポインタ
[in]nbytesバッファ・サイズ

OutputStream.h110 行目に定義があります。

◆ SetError()

nn::nlib::OutputStream::SetError ( errno_t  e) const
inlineprotectednoexcept

OutputStreamにエラーを設定します。

引数
[in]eエラー値

OutputStream.h114 行目に定義があります。

◆ Write() [1/2]

nn::nlib::OutputStream::Write ( int  b)
inlinenoexcept

ストリームに1バイトのデータを書き込みます。

引数
[in]b書き込まれるデータ
戻り値
成功した場合はtrue
各種例:
misc/stringutils/stringutils.cpp.

OutputStream.h56 行目に定義があります。

◆ Write() [2/2]

nn::nlib::OutputStream::Write ( const void *  p,
size_t  n 
)
inlinenoexcept

ストリームにn バイトのデータを書き込みます。

引数
[in]p書きこむデータへのポインタ
[in]nバイト数
戻り値
成功した場合はtrue

OutputStream.h70 行目に定義があります。

◆ WriteGather()

nn::nlib::OutputStream::WriteGather ( const nlib_fd_iovec *  iov,
int  iovcnt 
)
inlinenoexcept

複数の非連続のバッファからデータをストリームに書き出します。

引数
[in]ioviovcnt 個のバッファへのポインタとそのサイズ
[in]iovcntiov の個数
戻り値
成功した場合はtrue
説明
FileOutputStreamの場合、このメンバ関数はバッファを1つずつ書き出すより高速に動作するかもしれません。 ただし、nlib_fd_writev()関数が保証しているような書き込みのアトミック性は保証されていないことに注意してください。

OutputStream.h88 行目に定義があります。

メンバ詳解

◆ m_BufferingMode

nn::nlib::OutputStream::m_BufferingMode
protected

バッファリングモードが格納されています。

説明
既に0以外のエラーが設定されている場合は、エラー値は上書きされません。

OutputStream.h142 行目に定義があります。


このクラス詳解は次のファイルから抽出されました: