AK: Make Disjoint*::is_empty() not call size

This is a raffinement of 49cbd4dcca.

Previously, the container was scanned to compute the size in the unhappy
path. Now, using `all_of` happy and unhappy path should be fast.
This commit is contained in:
Michel Hermier 2021-12-22 00:34:05 +01:00 committed by Brian Gianforcaro
parent 44a6d7968a
commit 4758dac218
2 changed files with 12 additions and 2 deletions

View file

@ -6,6 +6,7 @@
#pragma once
#include <AK/AllOf.h>
#include <AK/Forward.h>
#include <AK/Span.h>
#include <AK/StdLibExtras.h>
@ -124,7 +125,10 @@ public:
return size;
}
bool is_empty() const { return size() == 0; }
bool is_empty() const
{
return all_of(m_spans, [](auto& span) { return span.is_empty(); });
}
DisjointSpans slice(size_t start, size_t length) const
{
@ -256,7 +260,10 @@ public:
return sum;
}
bool is_empty() const { return m_chunks.size() == 0 || size() == 0; }
bool is_empty() const
{
return all_of(m_chunks, [](auto& chunk) { return chunk.is_empty(); });
}
DisjointSpans<T> spans() const&
{

View file

@ -13,8 +13,11 @@
TEST_CASE(basic)
{
DisjointChunks<size_t> chunks;
EXPECT(chunks.is_empty());
chunks.append({});
EXPECT(chunks.is_empty());
chunks.last_chunk().append(0);
EXPECT(!chunks.is_empty());
chunks.append({});
chunks.last_chunk().append(1);
chunks.last_chunk().append(2);