type::Manager: Add Wrap()
Wrap returns a new Manager created with the types of `inner`.
The Manager returned by Wrap is intended to temporarily extend the types of an existing immutable Manager.
Bug: tint:390
Change-Id: I46bebf8b83cf7987ddcf2513c54f9f885a028c60
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/38551
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/type/type_manager.h b/src/type/type_manager.h
index b157328..779521b 100644
--- a/src/type/type_manager.h
+++ b/src/type/type_manager.h
@@ -63,6 +63,19 @@
return type;
}
+ /// Wrap returns a new Manager created with the types of `inner`.
+ /// The Manager returned by Wrap is intended to temporarily extend the types
+ /// of an existing immutable Manager.
+ /// As the copied types are owned by `inner`, `inner` must not be destructed
+ /// or assigned while using the returned Manager.
+ /// @param inner the immutable Manager to extend
+ /// @return the Manager that wraps `inner`
+ static Manager Wrap(const Manager& inner) {
+ Manager out;
+ out.by_name_ = inner.by_name_;
+ return out;
+ }
+
/// Returns the type map
/// @returns the mapping from name string to type.
const std::unordered_map<std::string, type::Type*>& types() const {
diff --git a/src/type/type_manager_test.cc b/src/type/type_manager_test.cc
index 5a938d5..71846ef 100644
--- a/src/type/type_manager_test.cc
+++ b/src/type/type_manager_test.cc
@@ -22,6 +22,16 @@
namespace type {
namespace {
+template <typename T>
+size_t count(const T& range_loopable) {
+ size_t n = 0;
+ for (auto it : range_loopable) {
+ (void)it;
+ n++;
+ }
+ return n;
+}
+
using TypeManagerTest = testing::Test;
TEST_F(TypeManagerTest, GetUnregistered) {
@@ -53,6 +63,21 @@
EXPECT_TRUE(t2->Is<U32>());
}
+TEST_F(TypeManagerTest, WrapDoesntAffectInner) {
+ Manager inner;
+ Manager outer = Manager::Wrap(inner);
+
+ inner.Get<I32>();
+
+ EXPECT_EQ(count(inner), 1u);
+ EXPECT_EQ(count(outer), 0u);
+
+ outer.Get<U32>();
+
+ EXPECT_EQ(count(inner), 1u);
+ EXPECT_EQ(count(outer), 1u);
+}
+
} // namespace
} // namespace type
} // namespace tint