29 #ifndef VC_COMMON_ALIASINGENTRYHELPER_H_ 
   30 #define VC_COMMON_ALIASINGENTRYHELPER_H_ 
   34 namespace Vc_VERSIONED_NAMESPACE
 
   39 template<
class StorageType> 
class AliasingEntryHelper
 
   42         typedef typename StorageType::EntryType T;
 
   44         StorageType *
const m_storage;
 
   47         Vc_ALWAYS_INLINE AliasingEntryHelper(StorageType *d, 
int index) : m_storage(d), m_index(index) {}
 
   48         Vc_ALWAYS_INLINE AliasingEntryHelper(
const AliasingEntryHelper &) = 
default;
 
   49         Vc_ALWAYS_INLINE AliasingEntryHelper(AliasingEntryHelper &&) = 
default;
 
   50         Vc_ALWAYS_INLINE AliasingEntryHelper &operator=(
const AliasingEntryHelper &rhs) {
 
   51             m_storage->assign(m_index, rhs);
 
   55         Vc_ALWAYS_INLINE AliasingEntryHelper &operator  =(T x) { m_storage->assign(m_index, x); 
return *
this; }
 
   56         Vc_ALWAYS_INLINE AliasingEntryHelper &operator +=(T x) { m_storage->assign(m_index, m_storage->m(m_index) + x); 
return *
this; }
 
   57         Vc_ALWAYS_INLINE AliasingEntryHelper &operator -=(T x) { m_storage->assign(m_index, m_storage->m(m_index) - x); 
return *
this; }
 
   58         Vc_ALWAYS_INLINE AliasingEntryHelper &operator /=(T x) { m_storage->assign(m_index, m_storage->m(m_index) / x); 
return *
this; }
 
   59         Vc_ALWAYS_INLINE AliasingEntryHelper &operator *=(T x) { m_storage->assign(m_index, m_storage->m(m_index) * x); 
return *
this; }
 
   60         Vc_ALWAYS_INLINE AliasingEntryHelper &operator |=(T x) { m_storage->assign(m_index, m_storage->m(m_index) | x); 
return *
this; }
 
   61         Vc_ALWAYS_INLINE AliasingEntryHelper &operator &=(T x) { m_storage->assign(m_index, m_storage->m(m_index) & x); 
return *
this; }
 
   62         Vc_ALWAYS_INLINE AliasingEntryHelper &operator ^=(T x) { m_storage->assign(m_index, m_storage->m(m_index) ^ x); 
return *
this; }
 
   63         Vc_ALWAYS_INLINE AliasingEntryHelper &operator %=(T x) { m_storage->assign(m_index, m_storage->m(m_index) % x); 
return *
this; }
 
   64         Vc_ALWAYS_INLINE AliasingEntryHelper &operator<<=(T x) { m_storage->assign(m_index, m_storage->m(m_index)<< x); 
return *
this; }
 
   65         Vc_ALWAYS_INLINE AliasingEntryHelper &operator>>=(T x) { m_storage->assign(m_index, m_storage->m(m_index)>> x); 
return *
this; }
 
   66 #define m_data m_storage->read(m_index) 
   68         typedef T A Vc_MAY_ALIAS;
 
   72         Vc_ALWAYS_INLINE AliasingEntryHelper(T2 &d) : m_data(reinterpret_cast<A &>(d)) {}
 
   74         Vc_ALWAYS_INLINE AliasingEntryHelper(A &d) : m_data(d) {}
 
   75         Vc_ALWAYS_INLINE AliasingEntryHelper &operator=(
const AliasingEntryHelper &rhs) {
 
   80         Vc_ALWAYS_INLINE AliasingEntryHelper &operator =(T x) { m_data  = x; 
return *
this; }
 
   81         Vc_ALWAYS_INLINE AliasingEntryHelper &operator+=(T x) { m_data += x; 
return *
this; }
 
   82         Vc_ALWAYS_INLINE AliasingEntryHelper &operator-=(T x) { m_data -= x; 
return *
this; }
 
   83         Vc_ALWAYS_INLINE AliasingEntryHelper &operator/=(T x) { m_data /= x; 
return *
this; }
 
   84         Vc_ALWAYS_INLINE AliasingEntryHelper &operator*=(T x) { m_data *= x; 
return *
this; }
 
   85         Vc_ALWAYS_INLINE AliasingEntryHelper &operator|=(T x) { m_data |= x; 
return *
this; }
 
   86         Vc_ALWAYS_INLINE AliasingEntryHelper &operator&=(T x) { m_data &= x; 
return *
this; }
 
   87         Vc_ALWAYS_INLINE AliasingEntryHelper &operator^=(T x) { m_data ^= x; 
return *
this; }
 
   88         Vc_ALWAYS_INLINE AliasingEntryHelper &operator%=(T x) { m_data %= x; 
return *
this; }
 
   89         Vc_ALWAYS_INLINE AliasingEntryHelper &operator<<=(T x) { m_data <<= x; 
return *
this; }
 
   90         Vc_ALWAYS_INLINE AliasingEntryHelper &operator>>=(T x) { m_data >>= x; 
return *
this; }
 
   93         Vc_ALWAYS_INLINE Vc_PURE 
operator const T()
 const { 
return m_data; }
 
   95         Vc_ALWAYS_INLINE Vc_PURE 
bool operator==(T x)
 const { 
return static_cast<T
>(m_data) == x; }
 
   96         Vc_ALWAYS_INLINE Vc_PURE 
bool operator!=(T x)
 const { 
return static_cast<T
>(m_data) != x; }
 
   97         Vc_ALWAYS_INLINE Vc_PURE 
bool operator<=(T x)
 const { 
return static_cast<T
>(m_data) <= x; }
 
   98         Vc_ALWAYS_INLINE Vc_PURE 
bool operator>=(T x)
 const { 
return static_cast<T
>(m_data) >= x; }
 
   99         Vc_ALWAYS_INLINE Vc_PURE 
bool operator< (T x)
 const { 
return static_cast<T
>(m_data) <  x; }
 
  100         Vc_ALWAYS_INLINE Vc_PURE 
bool operator> (T x)
 const { 
return static_cast<T
>(m_data) >  x; }
 
  102         Vc_ALWAYS_INLINE Vc_PURE T 
operator-()
 const { 
return -
static_cast<T
>(m_data); }
 
  103         Vc_ALWAYS_INLINE Vc_PURE T operator~()
 const { 
return ~static_cast<T>(m_data); }
 
  104         Vc_ALWAYS_INLINE Vc_PURE T 
operator+(T x)
 const { 
return static_cast<T
>(m_data) + x; }
 
  105         Vc_ALWAYS_INLINE Vc_PURE T 
operator-(T x)
 const { 
return static_cast<T
>(m_data) - x; }
 
  106         Vc_ALWAYS_INLINE Vc_PURE T 
operator/(T x)
 const { 
return static_cast<T
>(m_data) / x; }
 
  107         Vc_ALWAYS_INLINE Vc_PURE T 
operator*(T x)
 const { 
return static_cast<T
>(m_data) * x; }
 
  108         Vc_ALWAYS_INLINE Vc_PURE T 
operator|(T x)
 const { 
return static_cast<T
>(m_data) | x; }
 
  109         Vc_ALWAYS_INLINE Vc_PURE T 
operator&(T x)
 const { 
return static_cast<T
>(m_data) & x; }
 
  110         Vc_ALWAYS_INLINE Vc_PURE T 
operator^(T x)
 const { 
return static_cast<T
>(m_data) ^ x; }
 
  111         Vc_ALWAYS_INLINE Vc_PURE T 
operator%(T x)
 const { 
return static_cast<T
>(m_data) % x; }
 
  122 #endif // VC_COMMON_ALIASINGENTRYHELPER_H_ 
result_vector_type< L, R > operator|(L &&lhs, R &&rhs)
Applies | component-wise and concurrently. 
result_vector_type< L, R > operator^(L &&lhs, R &&rhs)
Applies ^ component-wise and concurrently. 
result_vector_type< L, R > operator/(L &&lhs, R &&rhs)
Applies / component-wise and concurrently. 
result_vector_type< L, R > operator-(L &&lhs, R &&rhs)
Applies - component-wise and concurrently. 
result_vector_type< L, R >::mask_type operator!=(L &&lhs, R &&rhs)
Applies != component-wise and concurrently. 
result_vector_type< L, R > operator*(L &&lhs, R &&rhs)
Applies * component-wise and concurrently. 
result_vector_type< L, R >::mask_type operator==(L &&lhs, R &&rhs)
Applies == component-wise and concurrently. 
result_vector_type< L, R >::mask_type operator<(L &&lhs, R &&rhs)
Applies < component-wise and concurrently. 
result_vector_type< L, R > operator+(L &&lhs, R &&rhs)
Applies + component-wise and concurrently. 
result_vector_type< L, R > operator%(L &&lhs, R &&rhs)
Applies % component-wise and concurrently. 
result_vector_type< L, R > operator&(L &&lhs, R &&rhs)
Applies & component-wise and concurrently. 
result_vector_type< L, R >::mask_type operator<=(L &&lhs, R &&rhs)
Applies <= component-wise and concurrently. 
result_vector_type< L, R >::mask_type operator>=(L &&lhs, R &&rhs)
Applies >= component-wise and concurrently. 
result_vector_type< L, R >::mask_type operator>(L &&lhs, R &&rhs)
Applies > component-wise and concurrently.