/*************************************************************************** * Copyright (c) Johan Mabille, Sylvain Corlay and Wolf Vollprecht * * Copyright (c) QuantStack * * * * Distributed under the terms of the BSD 3-Clause License. * * * * The full license is in the file LICENSE, distributed with this software. * ****************************************************************************/ #ifndef XTENSOR_NOALIAS_HPP #define XTENSOR_NOALIAS_HPP #include "xsemantic.hpp" namespace xt { template class noalias_proxy { public: noalias_proxy(A a) noexcept; template disable_xexpression operator=(const E&); template disable_xexpression operator+=(const E&); template disable_xexpression operator-=(const E&); template disable_xexpression operator*=(const E&); template disable_xexpression operator/=(const E&); template disable_xexpression operator%=(const E&); template disable_xexpression operator&=(const E&); template disable_xexpression operator|=(const E&); template disable_xexpression operator^=(const E&); template A operator=(const xexpression& e); template A operator+=(const xexpression& e); template A operator-=(const xexpression& e); template A operator*=(const xexpression& e); template A operator/=(const xexpression& e); template A operator%=(const xexpression& e); template A operator&=(const xexpression&); template A operator|=(const xexpression&); template A operator^=(const xexpression&); private: A m_array; }; template noalias_proxy> noalias(A&& a) noexcept; /******************************** * noalias_proxy implementation * ********************************/ template inline noalias_proxy::noalias_proxy(A a) noexcept : m_array(std::forward(a)) { } template template inline auto noalias_proxy::operator=(const E& e) -> disable_xexpression { return m_array.assign(xscalar(e)); } template template inline auto noalias_proxy::operator+=(const E& e) -> disable_xexpression { return m_array.scalar_computed_assign(e, std::plus<>()); } template template inline auto noalias_proxy::operator-=(const E& e) -> disable_xexpression { return m_array.scalar_computed_assign(e, std::minus<>()); } template template inline auto noalias_proxy::operator*=(const E& e) -> disable_xexpression { return m_array.scalar_computed_assign(e, std::multiplies<>()); } template template inline auto noalias_proxy::operator/=(const E& e) -> disable_xexpression { return m_array.scalar_computed_assign(e, std::divides<>()); } template template inline auto noalias_proxy::operator%=(const E& e) -> disable_xexpression { return m_array.scalar_computed_assign(e, std::modulus<>()); } template template inline auto noalias_proxy::operator&=(const E& e) -> disable_xexpression { return m_array.scalar_computed_assign(e, std::bit_and<>()); } template template inline auto noalias_proxy::operator|=(const E& e) -> disable_xexpression { return m_array.scalar_computed_assign(e, std::bit_or<>()); } template template inline auto noalias_proxy::operator^=(const E& e) -> disable_xexpression { return m_array.scalar_computed_assign(e, std::bit_xor<>()); } template template inline A noalias_proxy::operator=(const xexpression& e) { return m_array.assign(e); } template template inline A noalias_proxy::operator+=(const xexpression& e) { return m_array.plus_assign(e); } template template inline A noalias_proxy::operator-=(const xexpression& e) { return m_array.minus_assign(e); } template template inline A noalias_proxy::operator*=(const xexpression& e) { return m_array.multiplies_assign(e); } template template inline A noalias_proxy::operator/=(const xexpression& e) { return m_array.divides_assign(e); } template template inline A noalias_proxy::operator%=(const xexpression& e) { return m_array.modulus_assign(e); } template template inline A noalias_proxy::operator&=(const xexpression& e) { return m_array.bit_and_assign(e); } template template inline A noalias_proxy::operator|=(const xexpression& e) { return m_array.bit_or_assign(e); } template template inline A noalias_proxy::operator^=(const xexpression& e) { return m_array.bit_xor_assign(e); } template inline noalias_proxy> noalias(A&& a) noexcept { return noalias_proxy>(a); } } #endif