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