New StableVector but Iterator is missing.

This commit is contained in:
Metehan Tuncbilek
2024-10-03 18:15:48 +03:00
parent 6661e9e9af
commit eb2ca2ff5a
4 changed files with 716 additions and 571 deletions

View File

@@ -13,8 +13,8 @@
namespace OpenVulkano
{
template<typename K, typename V, typename Pair = std::pair<K, V>, typename Vec = std::vector<Pair>,
typename = std::enable_if_t<std::is_integral<K>::value>>
template<typename K, typename V, template<typename, typename> class Pair = std::pair,
template<typename> class Vec = std::vector, typename = std::enable_if_t<std::is_integral<K>::value>>
class BinSearchArrayMap
{
public:
@@ -44,8 +44,8 @@ namespace OpenVulkano
void Remove(const K key)
{
auto& it = FindPair(key);
m_data.erase(it);
std::streamsize index = FindIndexInVector(key);
m_data.erase(m_data.begin() + index);
}
size_t Size() const { return m_data.size(); }
@@ -54,10 +54,10 @@ namespace OpenVulkano
V& Get(const K key) { return FindPair(key).second; }
Pair& FindPair(const K key)
Pair<K, V>& FindPair(const K key)
{
size_t low = 0;
size_t high = m_data.size() - 1;
size_t high = m_data.size();
while (low <= high)
{
@@ -65,7 +65,33 @@ namespace OpenVulkano
if (m_data[mid].first == key)
{
return m_data[mid]; // The difference
return m_data[mid];
}
else if (m_data[mid].first < key)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
throw std::runtime_error("Key not found.");
}
std::streamsize FindIndexInVector(const K key)
{
size_t low = 0;
size_t high = m_data.size();
while (low <= high)
{
size_t mid = low + (high - low) / 2;
if (m_data[mid].first == key)
{
return mid;
}
else if (m_data[mid].first < key)
{
@@ -77,13 +103,38 @@ namespace OpenVulkano
}
}
throw std::runtime_error("Key not found.");
return -1;
}
bool Contains(const K key) const { return true; }
bool Contains(const V& value) const { return true; }
bool Contains(const K key) const noexcept
{
size_t low = 0;
size_t high = m_data.size();
while (low <= high)
{
size_t mid = low + (high - low) / 2;
if (m_data[mid].first == key)
{
return true;
}
else if (m_data[mid].first < key)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
return false;
}
void Clear() { m_data.clear(); }
private:
Vec m_data;
Vec<Pair<K, V>> m_data;
};
}