TNB Library
TnbLikenMemToFile.h
[詳解]
1#pragma once
13#include "TnbWriter.h"
14
15
16
17//TNB Library
18namespace TNB
19{
20
21
33{
34 const BYTE* m_pbcConstPtr;
35 BYTE* m_pbPtr;
36 LONGLONG m_llSize;
37 mutable CAutoVectorT<BYTE> m_vbContent;
38 mutable LONGLONG m_llPos;
39
40public:
41
47 CLikenMemToFile(size_t size = 0)
48 : m_pbcConstPtr(NULL)
49 , m_pbPtr(NULL)
50 , m_llSize(size)
51 , m_llPos(0)
52 {
53 m_vbContent.SetSize(size);
54 }
55
62 CLikenMemToFile(size_t size, LPCVOID P)
63 : m_pbcConstPtr(static_cast<const BYTE*>(P))
64 , m_pbPtr(NULL)
65 , m_llSize(size)
66 , m_llPos(0)
67 {
68 }
69
77 CLikenMemToFile(size_t size, LPVOID P)
78 : m_pbcConstPtr(NULL)
79 , m_pbPtr(static_cast<BYTE*>(P))
80 , m_llSize(size)
81 , m_llPos(0)
82 {
83 }
84
89 virtual LPCTSTR GetOpenName(void) const { return _T("-"); }
90
94 virtual void Close(void) {}
95
101 virtual bool CanRead(void) const
102 {
103 return true;
104 }
105
111 virtual bool CanWrite(void) const
112 {
113 return m_pbcConstPtr == NULL;
114 }
115
121 virtual LONGLONG GetSize(void) const
122 {
123 if ( m_pbcConstPtr != NULL || m_pbPtr != NULL )
124 {
125 return m_llSize;
126 }
127 return m_vbContent.GetSize();
128 }
129
138 virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek = TOP) const
139 {
140 LONGLONG l = GetSize();
141 LONGLONG p;
142 switch ( eSeek )
143 {
144 case TOP:
145 p = llOffset;
146 break;
147 case END:
148 p = l + llOffset;
149 break;
150 default:
151 p = m_llPos + llOffset;
152 break;
153 }
154 if ( p < 0 )
155 {
156 return -1;
157 }
158 else if ( p > l )
159 {
160 if ( m_pbcConstPtr == NULL && m_pbPtr == NULL )
161 {
162 m_vbContent.SetSize(ToInt(p));
163 }
164 else
165 {
166 return -1;
167 }
168 }
169 m_llPos = p;
170 return p;
171 }
172
180 virtual size_t Read(size_t size, LPVOID _P) const
181 {
182 const BYTE* B = NULL;
183 if ( m_pbcConstPtr != NULL )
184 {
185 B = m_pbcConstPtr;
186 }
187 else if ( m_pbPtr != NULL )
188 {
189 B = m_pbPtr;
190 }
191 else
192 {
193 B = m_vbContent.ReferBuffer();
194 }
195 LONGLONG s = size;
196 if ( s > GetLeftoverSize() )
197 {
198 s = GetLeftoverSize();
199 }
200 BYTE* Q = static_cast<BYTE*>(_P);
201 MemCopy(Q, &B[m_llPos], ToInt(s));
202 m_llPos += s;
203 return ToInt(s);
204 }
205
212 virtual void Write(size_t size, LPCVOID P)
213 {
214 if ( m_pbcConstPtr != NULL )
215 {
216 throw CWriteFailureException(ERROR_ACCESS_DENIED);
217 }
218 if ( m_pbPtr != NULL )
219 {
220 if ( static_cast<LONGLONG>(size) >= GetLeftoverSize() )
221 {
222 throw CWriteFailureException(ERROR_ACCESS_DENIED);
223 }
224 MemCopy(&m_pbPtr[m_llPos], static_cast<const BYTE*>(P), size);
225 }
226 else
227 {
228 if ( m_llPos + size > m_vbContent.GetSize() )
229 {
230 m_vbContent.SetSize(ToInt(m_llPos + size));
231 }
232 const BYTE* B = static_cast<const BYTE*>(P);
233 loop ( i, size )
234 {
235 m_vbContent.Set(ToInt(m_llPos + i), *B++);
236 }
237 }
238 m_llPos += size;
239 }
240
246 virtual void SetEnd(void)
247 {
248 if ( m_pbcConstPtr != NULL && m_pbPtr != NULL )
249 {
250 throw CWriteFailureException(ERROR_ACCESS_DENIED);
251 }
252 m_vbContent.SetSize(ToInt(m_llPos));
253 }
254};
255
256
257
258}; // TNB
259
260
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
ファイル関係のヘッダ
virtual bool Set(INDEX index, const TYP &t)
[設定] 要素の設定.
Definition: TnbVector.h:1053
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
ファイル風メモリ管理クラス
virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const
[操作] シーク.
virtual size_t Read(size_t size, LPVOID _P) const
[取得] 読み込み
CLikenMemToFile(size_t size, LPCVOID P)
コンストラクタ.
virtual LONGLONG GetSize(void) const
[取得] サイズ取得
virtual bool CanRead(void) const
[確認] 読み込み可能か
CLikenMemToFile(size_t size, LPVOID P)
コンストラクタ.
virtual LPCTSTR GetOpenName(void) const
[取得] オープン名取得
virtual void Close(void)
[操作] クローズ
virtual void Write(size_t size, LPCVOID P)
[保存] 書き込み
virtual void SetEnd(void)
[設定] EOFを指定.
virtual bool CanWrite(void) const
[確認] 書込み可能か
CLikenMemToFile(size_t size=0)
コンストラクタ.
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual bool SetSize(size_t size)
[操作] サイズ指定
Definition: TnbVector.h:618
virtual const TYP * ReferBuffer(void) const
[取得] データアドレス取得
Definition: TnbVector.h:664
書き込み失敗発生例外
Definition: TnbException.h:255
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:367
TNB Library
Definition: TnbDoxyTitle.txt:2
void MemCopy(T *_pDst, const void *pSrc, size_t len)
[複製] メモリコピー
Definition: TnbDef.h:376
LONGLONG GetLeftoverSize(void) const
[取得] 残りサイズ取得.
Definition: TnbReader.h:95
ESeekMode
シークのオフセット指定モード
Definition: TnbReader.h:39
@ TOP
頭からのオフセット指定
Definition: TnbReader.h:40
@ END
末からのオフセット指定
Definition: TnbReader.h:42
書き込みインターフェース
Definition: TnbWriter.h:36