Add PointerSet::ToVector() method

This will be used in a future CL that moves and caches target resolution
computations to a dedicated class.

Change-Id: I768706b596c687d83ac33ade7878947b190fef96
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/14882
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: David Turner <digit@google.com>
diff --git a/src/gn/pointer_set.h b/src/gn/pointer_set.h
index 6dc18b4..2bec930 100644
--- a/src/gn/pointer_set.h
+++ b/src/gn/pointer_set.h
@@ -6,6 +6,8 @@
 #define SRC_GN_POINTER_SET_H_
 
 #include <functional>
+#include <vector>
+
 #include "gn/hash_table_base.h"
 
 // PointerSet<T> is a fast implemention of a set of non-owning and non-null
@@ -187,6 +189,16 @@
     return true;
   }
 
+  // Convert this to a vector, more convenient and slightly faster than using
+  // std::vector<T*>(set.begin(), set.end()).
+  std::vector<T*> ToVector() const {
+    std::vector<T*> result(this->size());
+    auto it_result = result.begin();
+    for (auto it = this->begin(); it.valid(); ++it)
+      *it_result++ = *it;
+    return result;
+  }
+
  private:
   // Lookup node matching a given pointer. If result->valid() is true
   // then the pointer was found, otherwise, this is the location of
diff --git a/src/gn/pointer_set_unittest.cc b/src/gn/pointer_set_unittest.cc
index 0bb4d6a..e71a97d 100644
--- a/src/gn/pointer_set_unittest.cc
+++ b/src/gn/pointer_set_unittest.cc
@@ -5,6 +5,8 @@
 #include "gn/pointer_set.h"
 #include "util/test/test.h"
 
+#include <algorithm>
+
 struct Foo {
   int x;
 };
@@ -165,3 +167,15 @@
   EXPECT_EQ(set1, set);
   EXPECT_EQ(set2, set);
 }
+
+TEST(PointerSet, ToVector) {
+  TestPointerSet set(kFullList.begin(), kFullList.end());
+  auto vector = set.ToVector();
+  EXPECT_EQ(vector.size(), kFullList.size());
+
+  // NOTE: Order of items in the result is not guaranteed
+  // so just check whether items are available in it.
+  EXPECT_NE(std::find(vector.begin(), vector.end(), kFoo1), vector.end());
+  EXPECT_NE(std::find(vector.begin(), vector.end(), kFoo2), vector.end());
+  EXPECT_NE(std::find(vector.begin(), vector.end(), kFoo3), vector.end());
+}
\ No newline at end of file