xnoalias.hpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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_NOALIAS_HPP
  10. #define XTENSOR_NOALIAS_HPP
  11. #include "xsemantic.hpp"
  12. namespace xt
  13. {
  14. template <class A>
  15. class noalias_proxy
  16. {
  17. public:
  18. noalias_proxy(A a) noexcept;
  19. template <class E>
  20. disable_xexpression<E, A> operator=(const E&);
  21. template <class E>
  22. disable_xexpression<E, A> operator+=(const E&);
  23. template <class E>
  24. disable_xexpression<E, A> operator-=(const E&);
  25. template <class E>
  26. disable_xexpression<E, A> operator*=(const E&);
  27. template <class E>
  28. disable_xexpression<E, A> operator/=(const E&);
  29. template <class E>
  30. disable_xexpression<E, A> operator%=(const E&);
  31. template <class E>
  32. disable_xexpression<E, A> operator&=(const E&);
  33. template <class E>
  34. disable_xexpression<E, A> operator|=(const E&);
  35. template <class E>
  36. disable_xexpression<E, A> operator^=(const E&);
  37. template <class E>
  38. A operator=(const xexpression<E>& e);
  39. template <class E>
  40. A operator+=(const xexpression<E>& e);
  41. template <class E>
  42. A operator-=(const xexpression<E>& e);
  43. template <class E>
  44. A operator*=(const xexpression<E>& e);
  45. template <class E>
  46. A operator/=(const xexpression<E>& e);
  47. template <class E>
  48. A operator%=(const xexpression<E>& e);
  49. template <class E>
  50. A operator&=(const xexpression<E>&);
  51. template <class E>
  52. A operator|=(const xexpression<E>&);
  53. template <class E>
  54. A operator^=(const xexpression<E>&);
  55. private:
  56. A m_array;
  57. };
  58. template <class A>
  59. noalias_proxy<xtl::closure_type_t<A>> noalias(A&& a) noexcept;
  60. /********************************
  61. * noalias_proxy implementation *
  62. ********************************/
  63. template <class A>
  64. inline noalias_proxy<A>::noalias_proxy(A a) noexcept
  65. : m_array(std::forward<A>(a))
  66. {
  67. }
  68. template <class A>
  69. template <class E>
  70. inline auto noalias_proxy<A>::operator=(const E& e) -> disable_xexpression<E, A>
  71. {
  72. return m_array.assign(xscalar<E>(e));
  73. }
  74. template <class A>
  75. template <class E>
  76. inline auto noalias_proxy<A>::operator+=(const E& e) -> disable_xexpression<E, A>
  77. {
  78. return m_array.scalar_computed_assign(e, std::plus<>());
  79. }
  80. template <class A>
  81. template <class E>
  82. inline auto noalias_proxy<A>::operator-=(const E& e) -> disable_xexpression<E, A>
  83. {
  84. return m_array.scalar_computed_assign(e, std::minus<>());
  85. }
  86. template <class A>
  87. template <class E>
  88. inline auto noalias_proxy<A>::operator*=(const E& e) -> disable_xexpression<E, A>
  89. {
  90. return m_array.scalar_computed_assign(e, std::multiplies<>());
  91. }
  92. template <class A>
  93. template <class E>
  94. inline auto noalias_proxy<A>::operator/=(const E& e) -> disable_xexpression<E, A>
  95. {
  96. return m_array.scalar_computed_assign(e, std::divides<>());
  97. }
  98. template <class A>
  99. template <class E>
  100. inline auto noalias_proxy<A>::operator%=(const E& e) -> disable_xexpression<E, A>
  101. {
  102. return m_array.scalar_computed_assign(e, std::modulus<>());
  103. }
  104. template <class A>
  105. template <class E>
  106. inline auto noalias_proxy<A>::operator&=(const E& e) -> disable_xexpression<E, A>
  107. {
  108. return m_array.scalar_computed_assign(e, std::bit_and<>());
  109. }
  110. template <class A>
  111. template <class E>
  112. inline auto noalias_proxy<A>::operator|=(const E& e) -> disable_xexpression<E, A>
  113. {
  114. return m_array.scalar_computed_assign(e, std::bit_or<>());
  115. }
  116. template <class A>
  117. template <class E>
  118. inline auto noalias_proxy<A>::operator^=(const E& e) -> disable_xexpression<E, A>
  119. {
  120. return m_array.scalar_computed_assign(e, std::bit_xor<>());
  121. }
  122. template <class A>
  123. template <class E>
  124. inline A noalias_proxy<A>::operator=(const xexpression<E>& e)
  125. {
  126. return m_array.assign(e);
  127. }
  128. template <class A>
  129. template <class E>
  130. inline A noalias_proxy<A>::operator+=(const xexpression<E>& e)
  131. {
  132. return m_array.plus_assign(e);
  133. }
  134. template <class A>
  135. template <class E>
  136. inline A noalias_proxy<A>::operator-=(const xexpression<E>& e)
  137. {
  138. return m_array.minus_assign(e);
  139. }
  140. template <class A>
  141. template <class E>
  142. inline A noalias_proxy<A>::operator*=(const xexpression<E>& e)
  143. {
  144. return m_array.multiplies_assign(e);
  145. }
  146. template <class A>
  147. template <class E>
  148. inline A noalias_proxy<A>::operator/=(const xexpression<E>& e)
  149. {
  150. return m_array.divides_assign(e);
  151. }
  152. template <class A>
  153. template <class E>
  154. inline A noalias_proxy<A>::operator%=(const xexpression<E>& e)
  155. {
  156. return m_array.modulus_assign(e);
  157. }
  158. template <class A>
  159. template <class E>
  160. inline A noalias_proxy<A>::operator&=(const xexpression<E>& e)
  161. {
  162. return m_array.bit_and_assign(e);
  163. }
  164. template <class A>
  165. template <class E>
  166. inline A noalias_proxy<A>::operator|=(const xexpression<E>& e)
  167. {
  168. return m_array.bit_or_assign(e);
  169. }
  170. template <class A>
  171. template <class E>
  172. inline A noalias_proxy<A>::operator^=(const xexpression<E>& e)
  173. {
  174. return m_array.bit_xor_assign(e);
  175. }
  176. template <class A>
  177. inline noalias_proxy<xtl::closure_type_t<A>> noalias(A&& a) noexcept
  178. {
  179. return noalias_proxy<xtl::closure_type_t<A>>(a);
  180. }
  181. }
  182. #endif