4 template <
class stored_type,
class store_type,
unsigned simd_size,
bool modifiable>
class scatter_iterator
7 std::array<stored_type, simd_size> m_buffer;
10 int pos()
const {
return m_pos ; }
14 if( m_store !=
nullptr &&
pos < m_store->aligned_size()) m_buffer = m_store->scatter(
pos / simd_size );
16 stored_type*
operator->()
const {
return &( m_buffer )[m_pos % simd_size]; }
17 stored_type
operator*()
const {
return m_buffer [m_pos % simd_size]; }
18 stored_type&
operator*() {
return m_buffer [m_pos % simd_size]; }
22 if ( m_pos % simd_size == 0 )
24 if constexpr(modifiable == true ) m_store->gather(m_buffer, (m_pos-1) / simd_size);
25 m_buffer = m_store->scatter( m_pos );
31 if constexpr(modifiable ==
true)
33 if(m_store !=
nullptr && m_pos % simd_size != 0 ){
34 m_store->gather(m_buffer, m_pos/simd_size);
42 template<
unsigned simd_size,
bool modifiable = false,
class store_type>
scatter_iterator(const size_t &pos, store_type *store)
stored_type * operator->() const
stored_type operator*() const
stored_type & operator*()
friend int operator-(const scatter_iterator &lhs, const scatter_iterator &rhs)
scatter_iterator & operator++()
bool operator==(const scatter_iterator &rhs) const
bool operator!=(const scatter_iterator &rhs) const
auto make_scatter_iterator(const unsigned &pos, store_type *store)