AmpGen 2.1
Loading...
Searching...
No Matches
iterator.h
Go to the documentation of this file.
1#include <array>
2
3namespace AmpGen {
4 template <class stored_type, class store_type, unsigned simd_size, bool modifiable> class scatter_iterator
5 {
6 store_type* m_store;
7 std::array<stored_type, simd_size> m_buffer;
8 size_t m_pos{0};
9 public:
10 int pos() const { return m_pos ; }
11 scatter_iterator( const size_t& pos, store_type* store ) :
12 m_store(store),
13 m_pos(pos) {
14 if( m_store != nullptr && pos < m_store->aligned_size()) m_buffer = m_store->scatter(pos / simd_size );
15 }
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]; }
20 {
21 m_pos++;
22 if ( m_pos % simd_size == 0 )
23 {
24 if constexpr(modifiable == true ) m_store->gather(m_buffer, (m_pos-1) / simd_size);
25 m_buffer = m_store->scatter( m_pos );
26 }
27 return *this;
28 }
30 {
31 if constexpr(modifiable == true)
32 {
33 if(m_store != nullptr && m_pos % simd_size != 0 ){
34 m_store->gather(m_buffer, m_pos/simd_size);
35 }
36 }
37 }
38 bool operator==( const scatter_iterator& rhs ) const { return m_pos == rhs.m_pos ; }
39 bool operator!=( const scatter_iterator& rhs ) const { return m_pos != rhs.m_pos ; }
40 friend int operator-( const scatter_iterator& lhs, const scatter_iterator& rhs) { return lhs.pos() - rhs.pos() ; }
41 };
42 template<unsigned simd_size, bool modifiable = false, class store_type>
43 auto make_scatter_iterator( const unsigned& pos, store_type* store) {
45}
scatter_iterator(const size_t &pos, store_type *store)
Definition iterator.h:11
stored_type * operator->() const
Definition iterator.h:16
stored_type operator*() const
Definition iterator.h:17
stored_type & operator*()
Definition iterator.h:18
friend int operator-(const scatter_iterator &lhs, const scatter_iterator &rhs)
Definition iterator.h:40
scatter_iterator & operator++()
Definition iterator.h:19
bool operator==(const scatter_iterator &rhs) const
Definition iterator.h:38
bool operator!=(const scatter_iterator &rhs) const
Definition iterator.h:39
auto make_scatter_iterator(const unsigned &pos, store_type *store)
Definition iterator.h:43