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_