TNB Library
TnbCacheWriter.h
[詳解]
1#pragma once
11#include "TnbWriter.h"
12
13
14
15//TNB Library
16namespace TNB
17{
18
19
20
54{
55public:
56
58 CCacheWriter(void) : m_pWriter(NULL)
59 {
60 }
61
64 {
65 m_Push();
66 }
67
77 bool SetWriter(IWriter* pfw, size_t size = 10000)
78 {
79 if ( ! pfw->CanWrite() )
80 {
81 return false;
82 }
83 m_pWriter = pfw;
84 m_cache.Resize(size);
85 m_cacheSize = 0;
86 return true;
87 }
88
93 virtual LPCTSTR GetOpenName(void) const
94 {
95 m_Check();
96 return m_pWriter->GetOpenName();
97 }
98
102 virtual void Close(void)
103 {
104 m_CheckAndPush();
105 m_pWriter->Close();
106 }
107
113 virtual bool CanRead(void) const
114 {
115 m_Check();
116 return m_pWriter->CanRead();
117 }
118
124 virtual LONGLONG GetSize(void) const
125 {
126 m_Check();
127 return m_pWriter->GetSize();
128 }
129
138 virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek = TOP) const
139 {
140 m_CheckAndPush();
141 return m_pWriter->Seek(llOffset, eSeek);
142 }
143
151 virtual size_t Read(size_t size, LPVOID _P) const
152 {
153 m_CheckAndPush();
154 return m_pWriter->Read(size, _P);
155 }
156
162 virtual bool CanWrite(void) const
163 {
164 m_Check();
165 return m_pWriter->CanWrite();
166 }
167
173 virtual void SetEnd(void)
174 {
175 m_CheckAndPush();
176 m_pWriter->SetEnd();
177 }
178
185 virtual void Write(size_t size, LPCVOID P)
186 {
187 m_Check();
188 if ( m_cacheSize + size >= m_cache.GetSize() )
189 {
190 // キャッシュがあふれる
191 m_Push();
192 ASSERT( m_cacheSize == 0 );
193 if ( size >= m_cache.GetSize() )
194 {
195 // キャッシュに入らない
196 m_pWriter->Write(size, P);
197 }
198 else
199 {
200 memcpy(m_cache, P, size);
201 m_cacheSize = size;
202 }
203 }
204 else
205 {
206 memcpy(&m_cache[m_cacheSize], P, size);
207 m_cacheSize += size;
208 }
209 }
210
211private:
212 // NULL チェック
213 void m_Check(void) const
214 {
215 if ( m_pWriter == NULL )
216 {
217 throw CNullPointerException();
218 }
219 }
220 // 追い出す
221 void m_Push(void) const
222 {
223 if ( m_cacheSize > 0 )
224 {
225 m_pWriter->Write(m_cacheSize, m_cache);
226 m_cacheSize = 0;
227 }
228 }
229 // NULL チェック&追い出す
230 void m_CheckAndPush(void) const
231 {
232 m_Check();
233 m_Push();
234 }
235 mutable size_t m_cacheSize;
236 mutable CWorkMem m_cache;
237 mutable IWriter* m_pWriter;
238};
239
240
241
242}; // TNB
ファイル関係のヘッダ
キャッシュ書き込みクラス
virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const
[操作] シーク.
virtual size_t Read(size_t size, LPVOID _P) const
[取得] 読み込み
virtual LONGLONG GetSize(void) const
[取得] サイズ取得
virtual bool CanRead(void) const
[確認] 読み込み可能か
virtual LPCTSTR GetOpenName(void) const
[取得] オープン名取得
virtual void Close(void)
[操作] クローズ
virtual void Write(size_t size, LPCVOID P)
[保存] 書き込み
~CCacheWriter(void)
デストラクタ
bool SetWriter(IWriter *pfw, size_t size=10000)
[設定] ライター設定
virtual void SetEnd(void)
[設定] EOFを指定.
CCacheWriter(void)
コンストラクタ
virtual bool CanWrite(void) const
[確認] 書込み可能か
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
NULLポインタ例外
Definition: TnbException.h:172
size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbDef.h:665
void Resize(size_t l)
[設定] サイズ再設定
Definition: TnbDef.h:672
TNB Library
Definition: TnbDoxyTitle.txt:2
virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const =0
[操作] シーク.
virtual void Close(void)=0
[操作] クローズ
virtual size_t Read(size_t size, LPVOID _P) const =0
[取得] 読み込み
ESeekMode
シークのオフセット指定モード
Definition: TnbReader.h:39
@ TOP
頭からのオフセット指定
Definition: TnbReader.h:40
virtual LONGLONG GetSize(void) const =0
[取得] サイズ取得
virtual bool CanRead(void) const =0
[確認] 読み込み可能か
virtual LPCTSTR GetOpenName(void) const =0
[取得] オープン名取得
書き込みインターフェース
Definition: TnbWriter.h:36
virtual void SetEnd(void)=0
[設定] EOFを指定.
virtual bool CanWrite(void) const =0
[確認] 書込み可能か
virtual void Write(size_t size, LPCVOID P)=0
[保存] 書き込み