xexpression_traits.hpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /***************************************************************************
  2. * Copyright (c) Johan Mabille, Sylvain Corlay and Wolf Vollprecht *
  3. * Copyright (c) QuantStack *
  4. * *
  5. * Distributed under the terms of the BSD 3-Clause License. *
  6. * *
  7. * The full license is in the file LICENSE, distributed with this software. *
  8. ****************************************************************************/
  9. #ifndef XTENSOR_EXPRESSION_TRAITS_HPP
  10. #define XTENSOR_EXPRESSION_TRAITS_HPP
  11. #include "xexpression.hpp"
  12. namespace xt
  13. {
  14. /***************
  15. * xvalue_type *
  16. ***************/
  17. namespace detail
  18. {
  19. template <class E, class enable = void>
  20. struct xvalue_type_impl
  21. {
  22. using type = E;
  23. };
  24. template <class E>
  25. struct xvalue_type_impl<E, std::enable_if_t<is_xexpression<E>::value>>
  26. {
  27. using type = typename E::value_type;
  28. };
  29. }
  30. template <class E>
  31. using xvalue_type = detail::xvalue_type_impl<E>;
  32. template <class E>
  33. using xvalue_type_t = typename xvalue_type<E>::type;
  34. /*********************
  35. * common_value_type *
  36. *********************/
  37. template <class... C>
  38. struct common_value_type
  39. {
  40. using type = std::common_type_t<typename std::decay_t<C>::value_type...>;
  41. };
  42. template <class... C>
  43. using common_value_type_t = typename common_value_type<C...>::type;
  44. /********************
  45. * common_size_type *
  46. ********************/
  47. template <class... Args>
  48. struct common_size_type
  49. {
  50. using type = std::common_type_t<typename Args::size_type...>;
  51. };
  52. template <>
  53. struct common_size_type<>
  54. {
  55. using type = std::size_t;
  56. };
  57. template <class... Args>
  58. using common_size_type_t = typename common_size_type<Args...>::type;
  59. /**************************
  60. * common_difference type *
  61. **************************/
  62. template <class... Args>
  63. struct common_difference_type
  64. {
  65. using type = std::common_type_t<typename Args::difference_type...>;
  66. };
  67. template <>
  68. struct common_difference_type<>
  69. {
  70. using type = std::ptrdiff_t;
  71. };
  72. template <class... Args>
  73. using common_difference_type_t = typename common_difference_type<Args...>::type;
  74. /******************
  75. * temporary_type *
  76. ******************/
  77. namespace detail
  78. {
  79. template <class S>
  80. struct xtype_for_shape
  81. {
  82. template <class T, layout_type L>
  83. using type = xarray<T, L>;
  84. };
  85. #if defined(__GNUC__) && (__GNUC__ > 6)
  86. #if __cplusplus == 201703L
  87. template <template <class, std::size_t, class, bool> class S, class X, std::size_t N, class A, bool Init>
  88. struct xtype_for_shape<S<X, N, A, Init>>
  89. {
  90. template <class T, layout_type L>
  91. using type = xarray<T, L>;
  92. };
  93. #endif // __cplusplus == 201703L
  94. #endif // __GNUC__ && (__GNUC__ > 6)
  95. template <template <class, std::size_t> class S, class X, std::size_t N>
  96. struct xtype_for_shape<S<X, N>>
  97. {
  98. template <class T, layout_type L>
  99. using type = xtensor<T, N, L>;
  100. };
  101. template <template <std::size_t...> class S, std::size_t... X>
  102. struct xtype_for_shape<S<X...>>
  103. {
  104. template <class T, layout_type L>
  105. using type = xtensor_fixed<T, xshape<X...>, L>;
  106. };
  107. }
  108. template <class Tag, class T>
  109. struct temporary_type_from_tag;
  110. template <class T>
  111. struct temporary_type_from_tag<xtensor_expression_tag, T>
  112. {
  113. using I = std::decay_t<T>;
  114. using shape_type = typename I::shape_type;
  115. using value_type = typename I::value_type;
  116. static constexpr layout_type static_layout = XTENSOR_DEFAULT_LAYOUT;
  117. using type = typename detail::xtype_for_shape<shape_type>::template type<value_type, static_layout>;
  118. };
  119. template <class T, class = void>
  120. struct temporary_type
  121. {
  122. using type = typename temporary_type_from_tag<xexpression_tag_t<T>, T>::type;
  123. };
  124. template <class T>
  125. struct temporary_type<T, void_t<typename std::decay_t<T>::temporary_type>>
  126. {
  127. using type = typename std::decay_t<T>::temporary_type;
  128. };
  129. template <class T>
  130. using temporary_type_t = typename temporary_type<T>::type;
  131. /**********************
  132. * common_tensor_type *
  133. **********************/
  134. namespace detail
  135. {
  136. template <class... C>
  137. struct common_tensor_type_impl
  138. {
  139. static constexpr layout_type static_layout = compute_layout(std::decay_t<C>::static_layout...);
  140. using value_type = common_value_type_t<C...>;
  141. using shape_type = promote_shape_t<typename C::shape_type...>;
  142. using type = typename xtype_for_shape<shape_type>::template type<value_type, static_layout>;
  143. };
  144. }
  145. template <class... C>
  146. struct common_tensor_type : detail::common_tensor_type_impl<std::decay_t<C>...>
  147. {
  148. };
  149. template <class... C>
  150. using common_tensor_type_t = typename common_tensor_type<C...>::type;
  151. /**************************
  152. * big_promote_value_type *
  153. **************************/
  154. template <class E>
  155. struct big_promote_value_type
  156. {
  157. using type = xtl::big_promote_type_t<typename std::decay_t<E>::value_type>;
  158. };
  159. template <class E>
  160. using big_promote_value_type_t = typename big_promote_value_type<E>::type;
  161. }
  162. #endif