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