uint32_t poc_file::get_chunk_offset(int idx) const { if (idx < 0 || idx >= get_chunks_count()) return 0; return m_entries[idx].size; }
uint32_t poc_file::get_chunk_type(int idx) const { if (idx < 0 || idx >= get_chunks_count()) return 0; return m_entries[idx].type; }
std::size_t get_aligned_shift(void *real, std::size_t alignment) { assert(alignment > 0); const auto rest = reinterpret_cast<std::size_t>(real) % alignment; const auto has = rest > 0 ? alignment - rest : 0; if (has < sizeof(void *)) { return has + alignment * get_chunks_count(sizeof(void *), alignment); } else { return has; } }
bool poc_file::read_chunk_data(int idx, void *data, uint32_t size, uint32_t offset) const { if (idx < 0 || idx >= get_chunks_count() || !data) return false; const auto &e = m_entries[idx]; if (offset + size > e.size) return false; if (m_data) return m_data->read_chunk(data, size, e.offset + offset); return memcpy(data, m_raw_data + e.offset + offset, size) != 0; }
void test_chunks_count() { assert(get_chunks_count(1, 1) == 1); assert(get_chunks_count(2, 1) == 2); assert(get_chunks_count(3, 2) == 2); assert(get_chunks_count(2, 3) == 1); }
std::size_t need_alloc(std::size_t size, std::size_t alignment) { assert(alignment > 0); const auto chunks_count = get_chunks_count(size, alignment) + get_chunks_count(sizeof(void *), alignment); return alignment * chunks_count + alignment - 1; }