]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
enhance: Add util::Bytes::push_back method
authorJoel Rosdahl <joel@rosdahl.net>
Sun, 26 Oct 2025 08:34:45 +0000 (09:34 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Sun, 26 Oct 2025 15:13:16 +0000 (16:13 +0100)
src/ccache/util/bytes.cpp
src/ccache/util/bytes.hpp
unittest/test_util_bytes.cpp

index d3c82f430faf822aaa999ccd29afb5ac75959caf..e4f5463085afd59afcf13b761acc6c236885bbdb 100644 (file)
@@ -158,6 +158,16 @@ Bytes::insert(const uint8_t* pos,
   m_size += inserted_size;
 }
 
+void
+Bytes::push_back(uint8_t value) noexcept
+{
+  if (m_size >= m_capacity) {
+    reserve(m_capacity == 0 ? 1 : 2 * m_capacity);
+  }
+  m_data[m_size] = value;
+  ++m_size;
+}
+
 void
 Bytes::resize(size_t size) noexcept
 {
index 56d394f32df702ebb8a6d9c00071d5252bd2b54f..2780de07b44e68c1d8c3591653e4c684feb46117 100644 (file)
@@ -85,6 +85,8 @@ public:
   void clear() noexcept;
   void resize(size_t size) noexcept; // Note: New bytes will be uninitialized.
 
+  void push_back(uint8_t value) noexcept;
+
   void insert(const uint8_t* pos,
               const uint8_t* first,
               const uint8_t* last) noexcept;
index cc3bf3d67f7d6c7a68b96d2ad4470db0e5e875b4..2ea2f6b8944dacace24bc50eb5a69f9270842beb 100644 (file)
@@ -551,6 +551,61 @@ TEST_CASE("Basics")
     CHECK(bytes2[0] == 'x');
     CHECK(bytes2[1] == 'z');
   }
+
+  SUBCASE("Push to back")
+  {
+    // Push to empty bytes
+    Bytes bytes2;
+    CHECK(bytes2.size() == 0);
+    CHECK(bytes2.capacity() == 0);
+
+    bytes2.push_back('a');
+    REQUIRE(bytes2.size() == 1);
+    CHECK(bytes2.capacity() == 1);
+    CHECK(bytes2[0] == 'a');
+
+    // Push to non-empty bytes without reallocation
+    bytes2.push_back('b');
+    REQUIRE(bytes2.size() == 2);
+    CHECK(bytes2.capacity() == 2);
+    CHECK(bytes2[0] == 'a');
+    CHECK(bytes2[1] == 'b');
+
+    bytes2.push_back('c');
+    REQUIRE(bytes2.size() == 3);
+    CHECK(bytes2.capacity() == 4);
+    CHECK(bytes2[0] == 'a');
+    CHECK(bytes2[1] == 'b');
+    CHECK(bytes2[2] == 'c');
+
+    // Push multiple items to trigger reallocation
+    for (uint8_t i = 0; i < 10; ++i) {
+      bytes2.push_back(i);
+    }
+    REQUIRE(bytes2.size() == 13);
+    CHECK(bytes2.capacity() == 16);
+    CHECK(bytes2[0] == 'a');
+    CHECK(bytes2[1] == 'b');
+    CHECK(bytes2[2] == 'c');
+    CHECK(bytes2[3] == 0);
+    CHECK(bytes2[4] == 1);
+    CHECK(bytes2[12] == 9);
+
+    // Push to bytes with reserved capacity
+    Bytes bytes3;
+    bytes3.reserve(10);
+    CHECK(bytes3.capacity() == 10);
+    CHECK(bytes3.size() == 0);
+
+    for (uint8_t i = 0; i < 5; ++i) {
+      bytes3.push_back(i);
+    }
+    REQUIRE(bytes3.size() == 5);
+    CHECK(bytes3.capacity() == 10); // Should not reallocate
+    for (size_t i = 0; i < 5; ++i) {
+      CHECK(bytes3[i] == i);
+    }
+  }
 }
 
 TEST_CASE("Conversion to span")