acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
memory_file.h
1#pragma once
2
3
4#include "acme/prototype/prototype/memory_container.h"
5#include "file.h"
6
7//#pragma pack(push, custom__integers__, 1)
8//
9//struct u24 { ::u8 m_u[3]; };
10//
11//struct u40 { ::u8 m_u[5]; };
12//
13//struct u48 { ::u8 m_u[6]; };
14//
15//struct u56 { ::u8 m_u[7]; };
16//
17//#pragma pack(pop, custom__integers__)
18
19class memory_file;
20
21
22typedef ::pointer<memory_file>memory_file_pointer;
23
24
25inline void inline_byte_array_copy(::u8 * target, const ::u8 * source, ::memsize s)
26{
27
28 switch (s)
29 {
30 case 1:
31 *target = *source;
32 break;
33 case 2:
34 *(::u16 *)target = *(::u16 *)source;
35 break;
36 case 3:
37 target[0] = source[0];
38 target[1] = source[1];
39 target[2] = source[2];
40 break;
41 case 4:
42 *(::u32 *)target = *(::u32 *)source;
43 break;
44 case 5:
45 target[0] = source[0];
46 target[1] = source[1];
47 target[2] = source[2];
48 target[3] = source[3];
49 target[4] = source[4];
50 break;
51 case 6:
52 target[0] = source[0];
53 target[1] = source[1];
54 target[2] = source[2];
55 target[3] = source[3];
56 target[4] = source[4];
57 target[5] = source[5];
58 break;
59 case 7:
60 target[0] = source[0];
61 target[1] = source[1];
62 target[2] = source[2];
63 target[3] = source[3];
64 target[4] = source[4];
65 target[5] = source[5];
66 target[6] = source[6];
67 break;
68 case 8:
69 *(::u64 *)target = *(::u64 *)source;
70 break;
71 default:
72 ::memory_copy(target, source, s);
73 break;
74 }
75
76}
77
78
79class CLASS_DECL_ACME memory_file :
80 virtual public ::file::file,
81 virtual public memory_container
82{
83protected:
84
85
86 memsize m_position;
87
88
89public:
90
91
92 memory_file();
93 memory_file(::file::e_open eopen);
94 memory_file(memsize iSize);
95 memory_file(const memory_file & file);
96 memory_file(memory_file && file);
97 memory_file(const void * pmemory, memsize dwSize);
98 memory_file(const ::block & block);
99 template < prototype_payload PAYLOAD >
100 memory_file(PAYLOAD & payload, ::file::e_open eopen = {});
101 memory_file(memory_base & memory, ::file::e_open eopen = {});
102 memory_file(memory_base * pmemory, ::file::e_open eopen = {});
103 template < typename MEMORY>
104 memory_file(const ::pointer<MEMORY> & pmemory, ::file::e_open eopen = {}) : memory_file((MEMORY *)pmemory.get(), eopen) {}
105 ~memory_file() override;
106
107
108 // void assert_ok() const override;
109 // void dump(dump_context & dumpcontext) const override;
110
111
112 virtual bool is_valid() const override;
113 memsize erase_begin(void * pdata, memsize uiCount);
114 memsize erase_begin(memsize uiCount);
115
116
117 void load_string(string & str);
118 void translate(filesize offset, ::enum_seek eseek) override;
119 filesize get_position() const override;
120 virtual void raw_set_position(memsize memsize);
121
122
123 ::file::path get_file_path() const override;
124
125
126 void set_size(filesize dwNewLen) override;
127 ::filesize size() const override;
128 void clear();
129
130
131
132 using ::file::file::read;
133 virtual memsize read(void * p, ::memsize s) override;
134
135
136 using ::file::file::write;
137 void write(const void * p, ::memsize s) override;
138
139
140 void write(::file::readable * pfileIn, memsize uiBufSize = 16_MiB) override;
141
142 void put_byte_back(::u8 uch) override;
143
144 virtual void write_from_hex(const ::block & block) override;
145
146 void flush() override;
147
148 string as_string() const override;
149
150 //virtual void full_load(::payload payloadFile);
151
152 bool is_in_memory_file() const override { return true; }
153
154 using ::file::file::full_data;
155 ::u8 * full_data_begin() override;
156 ::u8 * full_data_end() override;
157 const ::u8 * full_data_begin() const override;
158 const ::u8 * full_data_end() const override;
159 ::u8 * data_begin() override;
160 ::u8 * data_end() override;
161 const ::u8 * data_begin() const override;
162 const ::u8 * data_end() const override;
163
164 using ::file::file::data;
165
166 //virtual memsize get_internal_data_size() const override;
167 bool full_data_set_size(memsize c) override;
168
169
170
171 //virtual void to(::file::file * pfileOut, memsize uiBufferSize = 1024 * 1024) override;
172
173 void copy_this(const memory_file & file);
174
175 ::file::file_status get_status() const override;
176
177 memory_file & operator = (const memory_file & file);
178
179 inline memsize _get_left() { return m_pmemory->size() - m_position; }
180 inline bool _is_end_of_file() const { return m_position >= m_pmemory->size(); }
181
182 inline ::i32 _get_unsigned_char()
183 {
184
185 return _get_left() < 1 ? -1 : ((::u8 *)m_pmemory.m_p->data())[m_position++];
186
187 }
188
189 inline ::u8 get_byte_unbounded()
190 {
191
192 return m_pbyte[m_position++];
193
194 }
195
196
197 inline ::i32 _get_unsigned_short()
198 {
199
200 if (_get_left() < 2)
201 {
202
203 return -1;
204
205 }
206
207 auto i = *(::u16 *)&m_pmemory.m_p->data()[m_position];
208
209 m_position += 2;
210
211 return i;
212
213 }
214
215
216 inline ::u16 get_u16_unbounded()
217 {
218
219 auto u = *(::u16 *)(m_pbyte + m_position);
220
221 m_position += 2;
222
223 return u;
224
225 }
226
227
228 inline bool _get_u64(::u64 & hn)
229 {
230
231 if (_get_left() < 8)
232 {
233
234 return false;
235
236 }
237
238 hn = *((::u64 *)&(m_pmemory.m_p->data()[m_position]));
239
240 m_position += 8;
241
242 return true;
243
244 }
245
246
247 inline ::u64 get_u64_unbounded()
248 {
249
250 auto u = *(::u64 *)(m_pbyte + m_position);
251
252 m_position += 8;
253
254 return u;
255
256 }
257
258
259 ::i32 get_unsigned_char() override;
260 ::i32 get_unsigned_short() override;
261 bool get_u64(::u64 & hn) override;
262 ::i32_boolean is_end_of_file() const override;
263
264
265 bool read_string(memory_base & memory) override;
266
267
268 memsize read_inline(void * p, ::memsize s)
269 {
270
271 auto target = (::u8 *)p;
272
273 if(::is_null(m_pmemory))
274 {
275
276 return 0;
277
278 }
279
280 memsize left = m_pmemory->size() - m_position;
281
282 if (s > left)
283 {
284
285 s = left;
286
287 }
288
289 if (s <= 0)
290 {
291
292 return 0;
293
294 }
295
296 if (target)
297 {
298
299 auto source = m_pmemory->m_begin + m_position;
300
301 inline_byte_array_copy(target, source, s);
302
303 }
304
305 m_position += s;
306
307 return s;
308
309 }
310
311
312 void write_inline(const void * p, ::memsize s)
313 {
314
315 if (s <= 0)
316 {
317
318 return;
319
320 }
321
322 auto source = (const ::u8 *)p;
323
324 auto e = m_position + s;
325
326 if (e <= 0)
327 {
328
329 return;
330
331 }
332
333 if (!m_pmemory || e > m_pmemory->size())
334 {
335
336 set_size(e);
337
338 }
339
340 auto target = m_pmemory->m_begin + m_position;
341
342 inline_byte_array_copy(target, source, s);
343
344 m_position = e;
345
346 }
347
348
349};
350
351
352//inline stream & operator << (stream & s, ::memory_file * pfile)
353//{
354//
355// s.write(&pfile->data()[pfile->get_position()], (memsize) pfile->get_remaining_byte_count());
356//
357// return s;
358//
359//}
360
361
362//class CLASS_DECL_ACME memory_stream :
363// public binary_stream
364//{
365//public:
366//
367//
368// memory_stream() : binary_stream(__initialize_new ::memory_file())) {}
369// memory_stream(::memory_base & memory) : binary_stream(::as(___new ::memory_file(memory))) {}
370//
371// ::memory_file * operator ->() { return m_p.cast < ::memory_file >().m_p; }
372// const ::memory_file * operator ->() const { return m_p.cast < ::memory_file >().m_p; }
373//
374//
375//};
376
377//auto __create_memory_stream() { return ::memory_stream(; }
378
379//CLASS_DECL_ACME memory_file_pointer create_memory_file(;
380//CLASS_DECL_ACME memory_file_pointer create_memory_file(::memory_base & memory);
381//CLASS_DECL_ACME memory_file_pointer create_memory_file(const ::block & block);
382//CLASS_DECL_ACME memory_file_pointer create_memory_file_as_copy(const memory & memory);
383//CLASS_DECL_ACME memory_file_pointer create_memory_file_by_reading(::file::file * pfile);
384//
385
386
387
388template < prototype_payload PAYLOAD >
389memory_file::memory_file(PAYLOAD & payload, ::file::e_open eopen) :
391{
392
393 m_eopen = eopen;
394 m_position = 0;
395 m_estatus = ::success;
396
397}
398
Definition memory_base.h:28
Definition file.h:33
void flush() override
Definition file.cpp:192
virtual bool full_data_set_size(memsize c)
full_data is plain memory segment mapping entire file
Definition file.cpp:867
Definition path.h:52
Definition streamable.h:18
Definition boolean.h:7
Definition memory_base.h:92
Definition memory_container.h:15
Definition memory_file.h:82
Definition payload.h:54
source is originator of subjects
Definition source.h:11
Definition filesystem.h:16
Definition block.h:46
Definition status.h:12