TNB Library
TnbConstFileMapping.h
[詳解]
1#pragma once
11#include "TnbFileName.h"
12#include "TnbCollection.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
39template<typename TYP>
41{
42 DEFSUPER(IConstCollectionT<TYP>);
43public:
44
49 CConstFileMappingT(DWORD multi = 2) : _super(), m_pType(NULL), m_hMapping(NULL), m_nowPage(-1), m_offset(0), m_size(0)
50 {
51 SYSTEM_INFO si;
52 ::GetSystemInfo(&si);
53 m_pageSize = si.dwAllocationGranularity * multi;
54 }
55
60 {
61 Close();
62 }
63
69 virtual bool Lock(DWORD dwTime = INFINITE) const
70 {
71 return m_sync.Lock();
72 }
73
75 virtual void Unlock(void) const
76 {
77 m_sync.Unlock();
78 }
79
86 bool IsOpened(void) const
87 {
88 return m_reader.CanRead();
89 }
90
99 bool Open(LPCTSTR lpszName, LONGLONG offset = 0, size_t size = INVALID_SIZE)
100 {
101 Close();
102 m_offset = offset;
103 if ( m_reader.Open(lpszName, true) )
104 {
105 m_size = ToIndex((m_reader.GetSize() - m_offset) / sizeof(TYP));
106 if ( size != INVALID_SIZE )
107 {
108 if ( m_size > size )
109 {
110 m_size = size;
111 }
112 }
113 return true;
114 }
115 return false;
116 }
117
122 void Close(void)
123 {
124 m_Unmapping();
125 m_reader.Close();
126 m_size = 0;
127 }
128
133 virtual size_t GetSize(void) const
134 {
135 return m_size;
136 }
137
145 virtual TYP Get(INDEX index) const
146 {
147 return At(index);
148 }
149
160 virtual const TYP& At(INDEX index) const
161 {
162 const TYP* P = m_Mapping(index);
163 if ( P != NULL )
164 {
165 return *P;
166 }
168 }
169
177 const TYP& operator[](INDEX index) const
178 {
179 return At(index);
180 }
181
182private:
184 LONGLONG m_IndexToFilePos(INDEX index) const
185 {
186 LONGLONG l = index;
187 return l * sizeof(TYP) + m_offset;
188 }
190 void m_Unmapping(void)
191 {
192 if ( m_pType != NULL )
193 {
194 ::UnmapViewOfFile(m_pType);
195 m_pType = NULL;
196 m_nowPage = -1;
197 }
198 if ( m_hMapping != NULL )
199 {
200 ::CloseHandle(m_hMapping);
201 m_hMapping = NULL;
202 }
203 }
205 TYP* m_Mapping(INDEX index) const
206 {
207 if ( ! IsInRange(index) )
208 {
209 return NULL;
210 }
211 if ( m_hMapping == NULL )
212 {
213 m_hMapping = ::CreateFileMapping(m_reader, NULL, PAGE_READONLY, 0, 0, NULL);
214 if ( m_hMapping == NULL )
215 {
216 return NULL;
217 }
218 }
219 LONGLONG fl = m_IndexToFilePos(index);
220 LONGLONG pl = fl / m_pageSize * m_pageSize;
221 if ( pl != m_nowPage )
222 {
223 if ( m_pType != NULL )
224 {
225 ::UnmapViewOfFile(m_pType);
226 m_pType = NULL;
227 }
228 m_nowPage = pl;
229 LONGLONG ns = min(m_pageSize * 2, m_reader.GetSize() - pl);
230 m_pType = static_cast<BYTE*>(::MapViewOfFile(m_hMapping, FILE_MAP_READ, static_cast<DWORD>(pl >> 32), static_cast<DWORD>(pl), down_cast<DWORD>(ns)));
231 if ( m_pType == NULL )
232 {
233 _GetLastError("MapViewOfFile");
234 ::CloseHandle(m_hMapping);
235 m_hMapping = NULL;
236 return NULL;
237 }
238 }
239 return reinterpret_cast<TYP*>(&m_pType[fl - pl]);
240 }
241
242 CFileReader m_reader;
243 DWORD m_pageSize;
244 CSyncSection m_sync;
245 LONGLONG m_offset;
246 size_t m_size;
247 mutable HANDLE m_hMapping;
248 mutable BYTE* m_pType;
249 mutable LONGLONG m_nowPage;
250 friend class CConstFileMappingTest;
251};
252
253
254
266
267
268
269}; // TNB
情報群管理関係のヘッダ
ファイルネーム関係のヘッダ
コンストファイルマッピングテンプレートクラス
virtual size_t GetSize(void) const
[取得] 要素数取得.
bool Open(LPCTSTR lpszName, LONGLONG offset=0, size_t size=INVALID_SIZE)
[操作] オープン.
virtual TYP Get(INDEX index) const
[取得] 要素の取得.
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
const TYP & operator[](INDEX index) const
[取得] 要素の取得.
CConstFileMappingT(DWORD multi=2)
コンストラクタ.
bool IsOpened(void) const
[確認] オープン確認.
void Close(void)
[操作] クローズ.
~CConstFileMappingT(void)
デストラクタ.
virtual void Unlock(void) const
[排他] アンロック
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
ファイル読み込みクラス
Definition: TnbFile.h:338
bool Open(LPCTSTR lpszName, bool boIsShare=true, bool boDummy=false)
[操作] オープン
Definition: TnbFile.h:364
virtual LONGLONG GetSize(void) const
[取得] ファイルサイズ取得
Definition: TnbFile.h:408
virtual bool CanRead(void) const
[確認] 読み込み可能か
Definition: TnbFile.h:383
virtual void Close(void)
[操作] クローズ
Definition: TnbFile.h:351
INDEX範囲外例外
Definition: TnbException.h:81
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
CConstFileMappingT< BYTE > CConstFileMapping
Constファイルマッピングクラス
TNB Library
Definition: TnbDoxyTitle.txt:2
情報群管理インターフェーステンプレート
bool IsInRange(INDEX index) const
[確認] INDEXの有効確認.