Add some container classes

This commit is contained in:
2021-10-13 00:57:43 +02:00
parent fe12fe649d
commit cccb674c3a
2 changed files with 299 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#pragma once
#include <vector>
namespace openVulkanoCpp
{
template<typename T>
class ChunkedArrayList
{
size_t m_chunkSize, m_size;
std::vector<std::vector<T>> m_chunks; //TODO optimize
void EnsureBuffer()
{
if (m_chunks.empty() || m_chunks.back().capacity() - m_chunks.back().size() == 0)
{
m_chunks.emplace_back().reserve(m_chunkSize);
}
}
public:
ChunkedArrayList() : m_chunkSize(8192), m_size(0)
{}
explicit ChunkedArrayList(ChunkedArrayList<T>&& old) noexcept
: m_chunkSize(old.m_chunkSize), m_size(old.m_size), m_chunks(std::move(old.m_chunks))
{
old.m_size = 0;
}
template<typename ...ARGS>
T& EmplaceBack(ARGS&&... args)
{
EnsureBuffer();
m_size++;
return m_chunks.back().emplace_back(std::forward<ARGS>(args)...);
}
T& InsertBack(const T& value)
{
EnsureBuffer();
m_size++;
return m_chunks.back().insert(value);
}
T& back()
{
return m_chunks.back().back();
}
[[nodiscard]] size_t size() const noexcept
{
return m_size;
}
T& operator[](size_t n)
{
return m_chunks[n / m_chunkSize][n % m_chunkSize];
}
const T& operator[](size_t n) const
{
return m_chunks[n / m_chunkSize][n % m_chunkSize];
}
};
}