Здравствуйте, 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;
};