#pragma once #include "isa_erasure.h" #include "reed_solomon.h" extern "C" { #include } #include #include namespace NErasure { template class TReedSolomonIsa : public TReedSolomonBase { static_assert(WordSize == 8, "ISA-l erasure codes support computations only in GF(2^8)"); public: //! Main blob for storing data. using TBlobType = typename TCodecTraits::TBlobType; //! Main mutable blob for decoding data. using TMutableBlobType = typename TCodecTraits::TMutableBlobType; TReedSolomonIsa() { EncodeGFTables_.resize(DataPartCount * ParityPartCount * 32, 0); GeneratorMatrix_.resize((DataPartCount + ParityPartCount) * DataPartCount, 0); gf_gen_rs_matrix( GeneratorMatrix_.data(), DataPartCount + ParityPartCount, DataPartCount); ec_init_tables( DataPartCount, ParityPartCount, &GeneratorMatrix_.data()[DataPartCount * DataPartCount], EncodeGFTables_.data()); } virtual std::vector Encode(const std::vector& blocks) const override { return ISAErasureEncode(EncodeGFTables_, blocks); } virtual std::vector Decode( const std::vector& blocks, const TPartIndexList& erasedIndices) const override { if (erasedIndices.empty()) { return std::vector(); } return ISAErasureDecode( blocks, erasedIndices, TConstArrayRef(), GeneratorMatrix_); } virtual ~TReedSolomonIsa() = default; private: std::vector GeneratorMatrix_; std::vector EncodeGFTables_; }; } // namespace NErasure