Listing 2
template<class _T,int _m,int _k,int _l,class _codeword> class ErasureCodec {
typedef galois<_T, _m> gal;
gal m_G[_k+1][_k+1];
void BuildDecodingMatrix(const std::set<int>& index) {
int x = 0;
for (int row = 0; row < _k + _l && x < _k; ++row)
{
if (index.find(row) == index.end()) {
for (int col = 0; col < _k; ++col) {
if (row < _k) {
m_G[x+1][col+1] = (col == row ? 1 : 0);
} else {
gal a = gal::alpha();
a.pow((row - _k)*col);
m_G[x+1][col+1] = a;
}
}
++x;
}
}
gaussj(m_G);
}
void Correct(_codeword received, _codeword recovered) {
for (int i = 0; i < _k; ++i) {
recovered[i] = 0;
for (int j = 0; j < _k; ++j) {
recovered[i] += m_G[i+1][j+1] * received[j];
}
}
}
};