Ejemplo n.º 1
0
uint32_t poc_file::get_chunk_offset(int idx) const
{
    if (idx < 0 || idx >= get_chunks_count())
        return 0;

    return m_entries[idx].size;
}
Ejemplo n.º 2
0
uint32_t poc_file::get_chunk_type(int idx) const
{
    if (idx < 0 || idx >= get_chunks_count())
        return 0;

    return m_entries[idx].type;
}
Ejemplo n.º 3
0
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;
    }
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
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);
}
Ejemplo n.º 6
0
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;
}