Implement __sanitizer::conditional<B, T, F>
authorVitaly Buka <vitalybuka@google.com>
Fri, 26 Apr 2019 18:22:55 +0000 (18:22 +0000)
committerVitaly Buka <vitalybuka@google.com>
Fri, 26 Apr 2019 18:22:55 +0000 (18:22 +0000)
llvm-svn: 359334

compiler-rt/lib/sanitizer_common/sanitizer_type_traits.h
compiler-rt/lib/sanitizer_common/tests/sanitizer_type_traits_test.cc

index b72dc55..2a58d98 100644 (file)
@@ -38,6 +38,25 @@ struct is_same : public false_type {};
 template <typename T>
 struct is_same<T, T> : public true_type {};
 
+// conditional<B, T, F>
+//
+// Defines type as T if B is true or as F otherwise.
+// E.g. the following is true
+//
+// ```
+// is_same<int, conditional<true, int, double>::type>::value
+// is_same<double, conditional<false, int, double>::type>::value
+// ```
+template <bool B, class T, class F>
+struct conditional {
+  using type = T;
+};
+
+template <class T, class F>
+struct conditional<false, T, F> {
+  using type = F;
+};
+
 }  // namespace __sanitizer
 
 #endif
index d2fcde7..ccefeb6 100644 (file)
@@ -25,3 +25,8 @@ TEST(SanitizerCommon, IsSame) {
   ASSERT_FALSE((is_same<uptr, sptr>::value));
   ASSERT_FALSE((is_same<uptr, const uptr>::value));
 }
+
+TEST(SanitizerCommon, Conditional) {
+  ASSERT_TRUE((is_same<int, conditional<true, int, double>::type>::value));
+  ASSERT_TRUE((is_same<double, conditional<false, int, double>::type>::value));
+}