Mercurial > foo_out_sdl
comparison foosdk/sdk/pfc/bigmem.cpp @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:e9bb126753e7 | 1:20d02a178406 |
|---|---|
| 1 #include "pfc-lite.h" | |
| 2 #include "bigmem.h" | |
| 3 | |
| 4 namespace pfc { | |
| 5 void bigmem::resize(size_t newSize) { | |
| 6 clear(); | |
| 7 m_data.set_size((newSize + slice - 1) / slice); | |
| 8 m_data.fill_null(); | |
| 9 for (size_t walk = 0; walk < m_data.get_size(); ++walk) { | |
| 10 size_t thisSlice = slice; | |
| 11 if (walk + 1 == m_data.get_size()) { | |
| 12 size_t cut = newSize % slice; | |
| 13 if (cut) thisSlice = cut; | |
| 14 } | |
| 15 void* ptr = malloc(thisSlice); | |
| 16 if (ptr == NULL) { clear(); throw std::bad_alloc(); } | |
| 17 m_data[walk] = (uint8_t*)ptr; | |
| 18 } | |
| 19 m_size = newSize; | |
| 20 } | |
| 21 void bigmem::clear() { | |
| 22 for (size_t walk = 0; walk < m_data.get_size(); ++walk) free(m_data[walk]); | |
| 23 m_data.set_size(0); | |
| 24 m_size = 0; | |
| 25 } | |
| 26 void bigmem::read(void* ptrOut, size_t bytes, size_t offset) const { | |
| 27 PFC_ASSERT(offset + bytes <= size()); | |
| 28 uint8_t* outWalk = (uint8_t*)ptrOut; | |
| 29 while (bytes > 0) { | |
| 30 size_t o1 = offset / slice, o2 = offset % slice; | |
| 31 size_t delta = slice - o2; if (delta > bytes) delta = bytes; | |
| 32 memcpy(outWalk, m_data[o1] + o2, delta); | |
| 33 offset += delta; | |
| 34 bytes -= delta; | |
| 35 outWalk += delta; | |
| 36 } | |
| 37 } | |
| 38 void bigmem::write(const void* ptrIn, size_t bytes, size_t offset) { | |
| 39 PFC_ASSERT(offset + bytes <= size()); | |
| 40 const uint8_t* inWalk = (const uint8_t*)ptrIn; | |
| 41 while (bytes > 0) { | |
| 42 size_t o1 = offset / slice, o2 = offset % slice; | |
| 43 size_t delta = slice - o2; if (delta > bytes) delta = bytes; | |
| 44 memcpy(m_data[o1] + o2, inWalk, delta); | |
| 45 offset += delta; | |
| 46 bytes -= delta; | |
| 47 inWalk += delta; | |
| 48 } | |
| 49 } | |
| 50 uint8_t* bigmem::_slicePtr(size_t which) { return m_data[which]; } | |
| 51 size_t bigmem::_sliceCount() { return m_data.get_size(); } | |
| 52 size_t bigmem::_sliceSize(size_t which) { | |
| 53 if (which + 1 == _sliceCount()) { | |
| 54 size_t s = m_size % slice; | |
| 55 if (s) return s; | |
| 56 } | |
| 57 return slice; | |
| 58 } | |
| 59 } |
