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