]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
enhance: Add iterators for util::Args
authorJoel Rosdahl <joel@rosdahl.net>
Wed, 25 Mar 2026 15:52:19 +0000 (16:52 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Wed, 25 Mar 2026 19:05:43 +0000 (20:05 +0100)
src/ccache/util/args.hpp
unittest/test_util_args.cpp

index 633002a00513db87ed7ccab68ae0b5d866812810..85f07499ef4a1cde603899eeff50d3ea6456e6f4 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2020-2025 Joel Rosdahl and other contributors
+// Copyright (C) 2020-2026 Joel Rosdahl and other contributors
 //
 // See doc/authors.adoc for a complete list of contributors.
 //
@@ -56,6 +56,25 @@ public:
   bool operator==(const Args& other) const;
   bool operator!=(const Args& other) const;
 
+  using iterator = std::deque<std::string>::iterator;
+  using const_iterator = std::deque<std::string>::const_iterator;
+  using reverse_iterator = std::deque<std::string>::reverse_iterator;
+  using const_reverse_iterator =
+    std::deque<std::string>::const_reverse_iterator;
+
+  iterator begin();
+  iterator end();
+  const_iterator begin() const;
+  const_iterator end() const;
+  const_iterator cbegin() const;
+  const_iterator cend() const;
+  reverse_iterator rbegin();
+  reverse_iterator rend();
+  const_reverse_iterator rbegin() const;
+  const_reverse_iterator rend() const;
+  const_reverse_iterator crbegin() const;
+  const_reverse_iterator crend() const;
+
   bool empty() const;
   size_t size() const;
   const std::string& operator[](size_t i) const;
@@ -164,4 +183,76 @@ Args::push_back(const std::filesystem::path& arg)
   m_args.push_back(arg.string());
 }
 
+inline Args::iterator
+Args::begin()
+{
+  return m_args.begin();
+}
+
+inline Args::iterator
+Args::end()
+{
+  return m_args.end();
+}
+
+inline Args::const_iterator
+Args::begin() const
+{
+  return m_args.begin();
+}
+
+inline Args::const_iterator
+Args::end() const
+{
+  return m_args.end();
+}
+
+inline Args::const_iterator
+Args::cbegin() const
+{
+  return m_args.cbegin();
+}
+
+inline Args::const_iterator
+Args::cend() const
+{
+  return m_args.cend();
+}
+
+inline Args::reverse_iterator
+Args::rbegin()
+{
+  return m_args.rbegin();
+}
+
+inline Args::reverse_iterator
+Args::rend()
+{
+  return m_args.rend();
+}
+
+inline Args::const_reverse_iterator
+Args::rbegin() const
+{
+  return m_args.rbegin();
+}
+
+inline Args::const_reverse_iterator
+Args::rend() const
+{
+  return m_args.rend();
+}
+
+inline Args::const_reverse_iterator
+Args::crbegin() const
+{
+  return m_args.crbegin();
+}
+
+inline Args::const_reverse_iterator
+Args::crend() const
+{
+  return m_args.crend();
+}
+
 } // namespace util
index c00fd8a55fe9dbb18e5d886311e8c9867cac126e..60f85efed5d46c41f6bf0d92c0ad2b12b9e781b3 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2020-2025 Joel Rosdahl and other contributors
+// Copyright (C) 2020-2026 Joel Rosdahl and other contributors
 //
 // See doc/authors.adoc for a complete list of contributors.
 //
@@ -437,4 +437,47 @@ TEST_CASE("Args operations")
   }
 }
 
+TEST_CASE("Args range-based for")
+{
+  Args args{"a", "b", "c"};
+
+  SUBCASE("non-const")
+  {
+    std::string result;
+    for (auto& arg : args) {
+      result += arg;
+    }
+    CHECK(result == "abc");
+  }
+
+  SUBCASE("const")
+  {
+    const Args& const_args = args;
+    std::string result;
+    for (const auto& arg : const_args) {
+      result += arg;
+    }
+    CHECK(result == "abc");
+  }
+
+  SUBCASE("mutation via iterator")
+  {
+    for (auto& arg : args) {
+      arg = "x";
+    }
+    CHECK(args == Args{"x", "x", "x"});
+  }
+
+  SUBCASE("empty args")
+  {
+    Args empty_args;
+    int count = 0;
+    for (const auto& arg : empty_args) {
+      (void)arg;
+      ++count;
+    }
+    CHECK(count == 0);
+  }
+}
+
 TEST_SUITE_END();