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)