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