Re: Cow pages array
От: sergii.p  
Дата: 13.01.26 09:48
Оценка: 4 (1)
Здравствуйте, Hоmunculus, Вы писали:

H>Есть такое? Или свой велосипед городить?


можно реализовать поверх QSharedData (как минимум detach не надо будет самому писать). Хотя всё равно придётся заморочиться с итераторами, конструкторами и пр.

constexpr int PageSize = 1024;

template<typename T>
struct Page : QSharedData
{
    Page() : data(PageSize) {}
    QVector<T> data;
};

template<typename T>
struct PagedArray
{
    explicit PagedArray(int size = 0)
        : m_size(size)
    {
        const int pageCount = (size + PageSize - 1) / PageSize;
        m_pages.resize(pageCount);
        for (int i = 0; i < pageCount; ++i)
            m_pages[i] = QSharedDataPointer<Page<T>>(new Page<T>());
    }

    int size() const noexcept { return m_size; }

    const T& operator[](int index) const
    {
        int pageIndex = index / PageSize;
        int offset = index % PageSize;
        return m_pages[pageIndex]->data[offset];
    }

    T& operator[](int index)
    {
        int pageIndex = index / PageSize;
        int offset = index % PageSize;

        if (m_pages[pageIndex].data()->ref.loadRelaxed() > 1)
            m_pages[pageIndex].detach();

        return m_pages[pageIndex]->data[offset];
    }

    void resize(int newSize)
    {
        const int newPageCount = (newSize + PageSize - 1) / PageSize;
        m_pages.resize(newPageCount);
        for (int i = 0; i < newPageCount; ++i)
        {
            if (!m_pages[i])
                m_pages[i] = QSharedDataPointer<Page<T>>(new Page<T>());
        }
        m_size = newSize;
    }

private:
    int m_size;
    QVector<QSharedDataPointer<Page<T>>> m_pages;
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.