TNB Library
TnbFileMapping.h
[詳解]
1#pragma once
11#include "TnbFile.h"
12#include "TnbTemporaryFile.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
45template<typename TYP>
47{
48 DEFSUPER(ICollectionT<TYP>);
49public:
50
55 CFileMappingT(DWORD multi = 2) : _super(), m_pType(NULL), m_hMapping(NULL), m_nowPage(-1), m_isSeeked(false), m_offset(0)
56 {
57 SYSTEM_INFO si;
58 ::GetSystemInfo(&si);
59 m_pageSize = si.dwAllocationGranularity * multi;
60 }
61
69 {
70 Close();
71 }
72
78 virtual bool Lock(DWORD dwTime = INFINITE) const
79 {
80 return m_sync.Lock();
81 }
82
84 virtual void Unlock(void) const
85 {
86 m_sync.Unlock();
87 }
88
94 bool IsOpened(void) const
95 {
96 return m_writer.CanWrite();
97 }
98
106 bool Open(LPCTSTR lpszName = NULL, LONGLONG offset = 0)
107 {
108 m_offset = offset;
109 CStr n = lpszName;
110 if ( n.IsEmpty() )
111 {
112 n = m_tempFileName.Create();
113 }
114 return m_writer.Open(n, false, true);
115 }
116
123 void Close(void)
124 {
125 m_Unmapping();
126 m_writer.Close();
127 m_tempFileName.Free();
128 }
129
134 virtual size_t GetSize(void) const
135 {
136 return ToIndex((m_writer.GetSize() - m_offset) / sizeof(TYP));
137 }
138
146 virtual bool SetSize(size_t size)
147 {
148 m_Unmapping();
149 if ( m_writer.Seek(m_IndexToFilePos(size)) < 0 )
150 {
151 return false;
152 }
153 m_writer.SetEnd();
154 m_isSeeked = true;
155 return true;
156 }
157
165 virtual TYP Get(INDEX index) const
166 {
167 return At(index);
168 }
169
180 virtual const TYP& At(INDEX index) const
181 {
182 const TYP* P = m_Mapping(index);
183 if ( P != NULL )
184 {
185 return *P;
186 }
188 }
189
195 virtual TYP& Ref(INDEX index)
196 {
197 TYP* P = m_Mapping(index);
198 if ( P != NULL )
199 {
200 return *P;
201 }
203 }
204
212 const TYP& operator[](INDEX index) const
213 {
214 return At(index);
215 }
216
225 TYP& operator[](INDEX index)
226 {
227 return Ref(index);
228 }
229
236 virtual INDEX Add(const TYP& t)
237 {
238 m_Unmapping();
239 m_writer.Write(sizeof(TYP), &t);
240 return true;
241 }
242
251 virtual bool Remove(INDEX index)
252 {
253 if ( IsInRange(index) )
254 {
255 size_t nl = GetSize();
256 loop ( i, (nl - index) - 1 )
257 {
258 INDEX d = i + index;
259 Set(d, Ref(d + 1));
260 }
261 return SetSize(nl - 1);
262 }
263 return false;
264 }
265
271 virtual bool RemoveAll(void)
272 {
273 m_Unmapping();
274 if ( ! m_writer.CanWrite() )
275 {
276 return false;
277 }
278 m_writer.Seek(m_offset);
279 m_writer.SetEnd();
280 return true;
281 }
282
290 virtual bool Set(INDEX index, const TYP& t)
291 {
292 if ( IsInRange(index) )
293 {
294 Ref(index) = t;
295 return true;
296 }
297 return false;
298 }
299
300private:
302 LONGLONG m_IndexToFilePos(INDEX index) const
303 {
304 LONGLONG l = index;
305 return l * sizeof(TYP) + m_offset;
306 }
308 void m_Unmapping(void)
309 {
310 if ( m_pType != NULL )
311 {
312 ::UnmapViewOfFile(m_pType);
313 m_pType = NULL;
314 m_nowPage = -1;
315 }
316 if ( m_hMapping != NULL )
317 {
318 ::CloseHandle(m_hMapping);
319 m_hMapping = NULL;
320 }
321 if ( m_isSeeked )
322 {
323 m_isSeeked = false;
324 m_writer.Seek(0, CFileWriter::END);
325 }
326 }
328 TYP* m_Mapping(INDEX index) const
329 {
330 if ( ! IsInRange(index) )
331 {
332 return NULL;
333 }
334 if ( m_hMapping == NULL )
335 {
336 m_hMapping = ::CreateFileMapping(m_writer, NULL, PAGE_READWRITE, 0, 0, NULL);
337 if ( m_hMapping == NULL )
338 {
339 return NULL;
340 }
341 }
342 LONGLONG fl = m_IndexToFilePos(index);
343 LONGLONG pl = fl / m_pageSize * m_pageSize;
344 if ( pl != m_nowPage )
345 {
346 if ( m_pType != NULL )
347 {
348 ::UnmapViewOfFile(m_pType);
349 m_pType = NULL;
350 }
351 m_nowPage = pl;
352 LONGLONG ns = min(m_pageSize * 2, m_writer.GetSize() - pl);
353 m_pType = static_cast<BYTE*>(::MapViewOfFile(m_hMapping, FILE_MAP_ALL_ACCESS, static_cast<DWORD>(pl >> 32), static_cast<DWORD>(pl), down_cast<DWORD>(ns)));
354 if ( m_pType == NULL )
355 {
356 _GetLastError("MapViewOfFile");
357 ::CloseHandle(m_hMapping);
358 m_hMapping = NULL;
359 return NULL;
360 }
361 }
362 return reinterpret_cast<TYP*>(&m_pType[fl - pl]);
363 }
364
365 CFileWriter m_writer;
366 CTemporaryFile m_tempFileName;
367 DWORD m_pageSize;
368 CSyncSection m_sync;
369 bool m_isSeeked;
370 LONGLONG m_offset;
371 mutable HANDLE m_hMapping;
372 mutable BYTE* m_pType;
373 mutable LONGLONG m_nowPage;
374};
375
376
377
389
390
391
392}; // TNB
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
ファイル関係のヘッダ
テンポラリファイル関係のヘッダ
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
ファイルマッピングテンプレートクラス
virtual size_t GetSize(void) const
[取得] 要素数取得.
virtual TYP Get(INDEX index) const
[取得] 要素の取得.
CFileMappingT(DWORD multi=2)
コンストラクタ.
virtual bool Remove(INDEX index)
[削除] 要素一つ削除.
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
bool Open(LPCTSTR lpszName=NULL, LONGLONG offset=0)
[操作] オープン.
~CFileMappingT(void)
デストラクタ.
virtual bool SetSize(size_t size)
[設定] 要素数設定.
const TYP & operator[](INDEX index) const
[取得] 要素の取得.
virtual TYP & Ref(INDEX index)
[取得] 要素の参照取得.
virtual bool RemoveAll(void)
[削除] 全要素削除 .
bool IsOpened(void) const
[確認] オープン確認.
void Close(void)
[操作] クローズ.
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
TYP & operator[](INDEX index)
[取得] 要素の参照取得.
virtual void Unlock(void) const
[排他] アンロック
virtual bool Set(INDEX index, const TYP &t)
[設定] 要素の設定.
ファイル書き込みクラス
Definition: TnbFile.h:475
virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const
[操作] シーク.
Definition: TnbFile.h:564
bool Open(LPCTSTR lpszName, bool boIsShare=true, bool boIsBottom=true)
[操作] オープン.
Definition: TnbFile.h:516
virtual LONGLONG GetSize(void) const
[取得] ファイルサイズ取得
Definition: TnbFile.h:575
virtual void Close(void)
[操作] クローズ
Definition: TnbFile.h:488
virtual void Write(size_t size, LPCVOID P)
[保存] ファイル書き込み
Definition: TnbFile.h:628
virtual void SetEnd(void)
[設定] EOFを指定.
Definition: TnbFile.h:614
virtual bool CanWrite(void) const
[確認] 書込み可能か
Definition: TnbFile.h:550
INDEX範囲外例外
Definition: TnbException.h:81
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
Section排他管理クラス
Definition: TnbSync.h:125
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbSync.h:148
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbSync.h:155
CStr Create(void)
[操作] 作成.
void Free(void)
[操作] 解放.
CFileMappingT< BYTE > CFileMapping
ファイルマッピングクラス
TNB Library
Definition: TnbDoxyTitle.txt:2
情報群管理操作インターフェーステンプレート
bool IsInRange(INDEX index) const
[確認] INDEXの有効確認.
@ END
末からのオフセット指定
Definition: TnbReader.h:42