File indexing completed on 2025-01-31 10:25:46
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifndef VC_TRAITS_HAS_CONTIGUOUS_STORAGE_H_
0029 #define VC_TRAITS_HAS_CONTIGUOUS_STORAGE_H_
0030
0031 #include <initializer_list>
0032 #include <memory>
0033
0034 #ifdef _LIBCPP_BEGIN_NAMESPACE_STD
0035 _LIBCPP_BEGIN_NAMESPACE_STD
0036 #else
0037 namespace std
0038 {
0039 #endif
0040 #ifdef _WIN32
0041 template <typename T, size_t N> class array;
0042 #else
0043 template <typename T, size_t N> struct array;
0044 #endif
0045 template <typename T, typename Allocator> class vector;
0046 #ifdef _LIBCPP_END_NAMESPACE_STD
0047 _LIBCPP_END_NAMESPACE_STD
0048 #else
0049 }
0050 #endif
0051
0052 namespace Vc_VERSIONED_NAMESPACE
0053 {
0054 namespace Traits
0055 {
0056 namespace has_contiguous_storage_detail
0057 {
0058
0059
0060 template <typename T, typename It = typename T::iterator>
0061 std::is_base_of<std::random_access_iterator_tag,
0062 typename std::iterator_traits<It>::iterator_category>
0063 test(int);
0064
0065
0066 template <typename T>
0067 std::is_base_of<std::random_access_iterator_tag,
0068 typename std::iterator_traits<T>::iterator_category>
0069 test(long);
0070
0071
0072 template <typename T> std::false_type test(...);
0073 }
0074
0075 template <typename T>
0076 struct has_contiguous_storage_impl
0077 : public decltype(has_contiguous_storage_detail::test<T>(int())) {
0078 };
0079
0080 template <typename T>
0081 struct has_contiguous_storage
0082 : public has_contiguous_storage_impl<
0083 typename std::remove_cv<typename std::remove_reference<T>::type>::type>
0084 {
0085 };
0086
0087
0088 template <typename T> struct has_contiguous_storage_impl<const T *> : public std::true_type {};
0089 template <typename T> struct has_contiguous_storage_impl<T *> : public std::true_type {};
0090 template <typename T> struct has_contiguous_storage_impl<std::unique_ptr<T[]>> : public std::true_type {};
0091 template <typename T> struct has_contiguous_storage_impl<std::initializer_list<T>> : public std::true_type {};
0092 template <typename T, std::size_t N> struct has_contiguous_storage_impl<T[N]> : public std::true_type {};
0093 template <typename T, std::size_t N> struct has_contiguous_storage_impl<std::array<T, N>> : public std::true_type {};
0094 template <typename T, typename A> struct has_contiguous_storage_impl<std::vector<T, A>> : public std::true_type {};
0095
0096 }
0097 }
0098
0099 #endif