Add ityp::PlusOne

It is useful sometime to avoid having to write ityp::Add(stuff, Stuff(1))

Bug: dawn:2222
Change-Id: I07a13ad92e6a389a1fdf828fa2bff3c53b1e68a6
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/162504
Reviewed-by: Austin Eng <enga@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn/common/TypedInteger.h b/src/dawn/common/TypedInteger.h
index 2f8f691..d737e0b 100644
--- a/src/dawn/common/TypedInteger.h
+++ b/src/dawn/common/TypedInteger.h
@@ -263,6 +263,13 @@
         static_cast<T>(::dawn::detail::TypedIntegerImpl<Tag, T>::SubImpl(lhs, rhs)));
 }
 
+template <typename Tag, typename T>
+constexpr ::dawn::detail::TypedIntegerImpl<Tag, T> PlusOne(
+    ::dawn::detail::TypedIntegerImpl<Tag, T> value) {
+    T one = 1;
+    return Add(value, ::dawn::detail::TypedIntegerImpl<Tag, T>(one));
+}
+
 template <typename T>
 constexpr std::enable_if_t<std::is_integral<T>::value, T> Add(T lhs, T rhs) {
     return static_cast<T>(lhs + rhs);
@@ -273,6 +280,11 @@
     return static_cast<T>(lhs - rhs);
 }
 
+template <typename T>
+constexpr std::enable_if_t<std::is_integral<T>::value, T> PlusOne(T value) {
+    return static_cast<T>(value + 1);
+}
+
 }  // namespace dawn::ityp
 
 #endif  // SRC_DAWN_COMMON_TYPEDINTEGER_H_
diff --git a/src/dawn/tests/unittests/TypedIntegerTests.cpp b/src/dawn/tests/unittests/TypedIntegerTests.cpp
index 48cfbde..083ef74 100644
--- a/src/dawn/tests/unittests/TypedIntegerTests.cpp
+++ b/src/dawn/tests/unittests/TypedIntegerTests.cpp
@@ -167,6 +167,12 @@
     static_assert(std::is_same<UnderlyingType<Signed>, int32_t>::value);
 }
 
+TEST_F(TypedIntegerTest, PlusOne) {
+    Signed seven(7);
+    EXPECT_EQ(Signed(8), ityp::PlusOne(seven));
+    EXPECT_EQ(Signed(9), ityp::PlusOne(ityp::PlusOne(seven)));
+}
+
 // Tests for bounds assertions on arithmetic overflow and underflow.
 #if defined(DAWN_ENABLE_ASSERTS)