From 4758dac21881cae6f1c7ff6e2257ef63c7eeb402 Mon Sep 17 00:00:00 2001 From: Michel Hermier Date: Wed, 22 Dec 2021 00:34:05 +0100 Subject: [PATCH] AK: Make `Disjoint*::is_empty()` not call size This is a raffinement of 49cbd4dcca037336ad5e2e4fcb1e3cc613b46cce. Previously, the container was scanned to compute the size in the unhappy path. Now, using `all_of` happy and unhappy path should be fast. --- AK/DisjointChunks.h | 11 +++++++++-- Tests/AK/TestDisjointChunks.cpp | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/AK/DisjointChunks.h b/AK/DisjointChunks.h index d58ed43f7e..181ab1b88a 100644 --- a/AK/DisjointChunks.h +++ b/AK/DisjointChunks.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -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 spans() const& { diff --git a/Tests/AK/TestDisjointChunks.cpp b/Tests/AK/TestDisjointChunks.cpp index e8897d2a15..94f052bf9e 100644 --- a/Tests/AK/TestDisjointChunks.cpp +++ b/Tests/AK/TestDisjointChunks.cpp @@ -13,8 +13,11 @@ TEST_CASE(basic) { DisjointChunks 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);