#ifndef FRONT_H
#define FRONT_H
#include "types.h"
template <typename T>
class Front {
public:
Front(uint nx, uint ny, T zero = 0)
: zero(zero), dx(1), dy(nx + 1), dz(dy * (ny + 1)), m(mask(dx + dy + dz)),
i(0), a(new T[m + 1]) {}
~Front() { delete[] a; }
const T& operator()(uint x, uint y, uint z) const
{
return a[(i - dx * x - dy * y - dz * z) & m];
}
void push(T f, uint n = 1)
{
do
a[i++ & m] = f;
while (--n);
}
void advance(uint x, uint y, uint z)
{
push(zero, dx * x + dy * y + dz * z);
}
private:
const T zero; const uint dx; const uint dy; const uint dz; const uint m; uint i; T*const a;
uint mask(uint n) const
{
for (n--; n & (n + 1); n |= n + 1);
return n;
}
};
#endif