Re[2]: Cow pages array
От: SaZ  
Дата: 13.01.26 11:41
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>Здравствуйте, Hоmunculus, Вы писали:


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


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


SP>
SP>constexpr int PageSize = 1024;

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

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

SP>    int size() const noexcept { return m_size; }

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

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

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

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

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

SP>private:
SP>    int m_size;
SP>    QVector<QSharedDataPointer<Page<T>>> m_pages;
SP>};
SP>


Вы только забыли про то, что QSharedData изначально спроектирован с прицелом на многопоточность. А в такой примерной реализации нужно будет позаморачиваться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.