#pragma once #include "lrc.h" #include "helpers.h" #include "isa_erasure.h" extern "C" { #include } #include #include #include #include #include namespace NErasure { template class TLrcIsa : public TLrcCodecBase { 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; static constexpr ui64 RequiredDataAlignment = alignof(ui64); TLrcIsa() : TLrcCodecBase() { EncodeGFTables_.resize(DataPartCount * ParityPartCount * 32, 0); GeneratorMatrix_.resize((DataPartCount + ParityPartCount) * DataPartCount, 0); for (int row = 0; row < DataPartCount; ++row) { GeneratorMatrix_[row * DataPartCount + row] = 1; } this->template InitializeGeneratorMatrix( &GeneratorMatrix_[DataPartCount * DataPartCount], std::bind(&gf_mul_erasure, std::placeholders::_1, std::placeholders::_1)); ec_init_tables( DataPartCount, ParityPartCount, &GeneratorMatrix_.data()[DataPartCount * DataPartCount], EncodeGFTables_.data()); } std::vector Encode(const std::vector& blocks) const override { return ISAErasureEncode(EncodeGFTables_, blocks); } virtual ~TLrcIsa() = default; private: std::vector FallbackToCodecDecode( const std::vector& blocks, TPartIndexList erasedIndices) const override { return ISAErasureDecode( blocks, std::move(erasedIndices), this->GetXorGroups(), GeneratorMatrix_); } std::vector GeneratorMatrix_; std::vector EncodeGFTables_; }; } // NErasure