Index: webrtc/base/type_traits.h |
diff --git a/webrtc/base/type_traits.h b/webrtc/base/type_traits.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d6a6c37334602d21111a2fe60f1204d8f90f5e41 |
--- /dev/null |
+++ b/webrtc/base/type_traits.h |
@@ -0,0 +1,77 @@ |
+/* |
+ * Copyright 2016 The WebRTC Project Authors. All rights reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+#ifndef WEBRTC_BASE_TYPE_TRAITS_H_ |
+#define WEBRTC_BASE_TYPE_TRAITS_H_ |
+ |
+#include <cstddef> |
+#include <type_traits> |
+ |
+namespace rtc { |
+ |
+// Determines if the given class has zero-argument .data() and .size() methods |
+// whose return values are convertible to T* and size_t, respectively. |
+template <typename DS, typename T> |
+class HasDataAndSize { |
+ private: |
+ template < |
+ typename C, |
+ typename std::enable_if< |
+ std::is_convertible<decltype(std::declval<C>().data()), T*>::value && |
+ std::is_convertible<decltype(std::declval<C>().size()), |
+ std::size_t>::value>::type* = nullptr> |
+ static int Test(int); |
+ |
+ template <typename> |
+ static char Test(...); |
+ |
+ public: |
+ static constexpr bool value = std::is_same<decltype(Test<DS>(0)), int>::value; |
+}; |
+ |
+namespace test_has_data_and_size { |
ossu
2016/09/05 13:33:48
Should this be hidden away in a .cc file somewhere
kwiberg-webrtc
2016/09/05 14:04:11
It used to be in a separate file (array_view_unitt
|
+ |
+template <typename DR, typename SR> |
+struct Test1 { |
+ DR data(); |
+ SR size(); |
+}; |
+static_assert(HasDataAndSize<Test1<int*, int>, int>::value, ""); |
+static_assert(HasDataAndSize<Test1<int*, int>, const int>::value, ""); |
+static_assert(HasDataAndSize<Test1<const int*, int>, const int>::value, ""); |
+static_assert(!HasDataAndSize<Test1<const int*, int>, int>::value, |
+ "implicit cast of const int* to int*"); |
+static_assert(!HasDataAndSize<Test1<char*, size_t>, int>::value, |
+ "implicit cast of char* to int*"); |
+ |
+struct Test2 { |
+ int* data; |
+ size_t size; |
+}; |
+static_assert(!HasDataAndSize<Test2, int>::value, |
+ ".data and .size aren't functions"); |
+ |
+struct Test3 { |
+ int* data(); |
+}; |
+static_assert(!HasDataAndSize<Test3, int>::value, ".size() is missing"); |
+ |
+class Test4 { |
+ int* data(); |
+ size_t size(); |
+}; |
+static_assert(!HasDataAndSize<Test4, int>::value, |
+ ".data() and .size() are private"); |
+ |
+} // namespace test_has_data_and_size |
+ |
+} // namespace rtc |
+ |
+#endif // WEBRTC_BASE_TYPE_TRAITS_H_ |