#ifndef __FAST_ARRAY_H__
#define __FAST_ARRAY_H__

template < typename Ring, size_t maxSize = 0 >
struct Mapping {
  typedef typename Ring::T T;
  std::vector<T> data;

  Mapping() {}

  template < typename X >
  Mapping(X x) : data(x.data) {}

  Mapping(size_t size = 0, T val = 0) : data(size, val) {}
  inline size_t size() const { return data.size(); }

  inline T operator[] (size_t i) const { return data[i]; }
  inline void assign(size_t i, T val) { data[i] = val; }

  Mapping& combine(T beta, const Mapping& b) {
    size_t _size = size();
    for (size_t i = 0; i < _size; i++)
      data[i] = Ring::plus(data[i], Ring::multiply(beta, b.data[i]));
    return *this;
  }
};

#endif