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]; } } } };