/* * Copyright (c) 2015-2016, Luca Fulchir, All rights reserved. * * This file is part of "libRaptorQ". * * libRaptorQ is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * libRaptorQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * and a copy of the GNU Lesser General Public License * along with libRaptorQ. If not, see . */ #pragma once #include "RaptorQ/v1/RaptorQ.hpp" #include "RaptorQ/v1/RaptorQ_Iterators.hpp" #include #include namespace RaptorQ__v1 { template class RAPTORQ_API Encoder { public: // used for precomputation Encoder (const uint16_t symbols, const uint16_t symbol_size); // with data at the beginning. Less work. Encoder (const Rnd_It data_from, const Rnd_It data_to, const uint16_t symbol_size); uint16_t symbols() const; uint16_t symbol_size() const; uint32_t max_repair() const; RaptorQ__v1::It::Encoder::Symbol_Iterator begin_source(); RaptorQ__v1::It::Encoder::Symbol_Iterator end_source(); RaptorQ__v1::It::Encoder::Symbol_Iterator begin_repair(); RaptorQ__v1::It::Encoder::Symbol_Iterator end_repair (const uint32_t repair); size_t add_data (Rnd_It &from, const Rnd_It to); void clear_data(); bool compute_sync(); size_t needed_bytes(); std::future compute(); size_t encode (Fwd_It &output, const Fwd_It end, const uint32_t &id); private: std::unique_ptr> encoder; }; template class RAPTORQ_API Decoder { public: using Report = typename Impl::Decoder::Report; Decoder (const uint16_t symbols, const uint16_t symbol_size, const Report type); uint16_t symbols() const; uint16_t symbol_size() const; RaptorQ__v1::It::Decoder::Symbol_Iterator begin (); RaptorQ__v1::It::Decoder::Symbol_Iterator end (); Error add_symbol (In_It &from, const In_It to, const uint32_t esi); using Decoder_Result =typename Impl::Decoder::Decoder_Result; bool can_decode() const; Decoder_Result decode(); void stop(); uint16_t needed_symbols() const; std::pair poll(); std::pair wait_sync(); std::future> wait(); Error decode_symbol (Fwd_It &start, const Fwd_It end,const uint16_t esi); // returns numer of bytes written, offset of data in last iterator std::pair decode_bytes (Fwd_It &start, const Fwd_It end, const size_t from_byte, const size_t skip); private: std::unique_ptr> decoder; }; /////////////////// //// Encoder /////////////////// template Encoder::Encoder (const uint16_t symbols, const uint16_t symbol_size) { IS_RANDOM(Rnd_It, "RaptorQ__v1::Encoder"); IS_FORWARD(Fwd_It, "RaptorQ__v1::Encoder"); encoder = std::unique_ptr> ( new Impl::Encoder (symbols, symbol_size)); } template Encoder::Encoder (const Rnd_It data_from, const Rnd_It data_to, const uint16_t symbol_size) { IS_RANDOM(Rnd_It, "RaptorQ__v1::Encoder"); IS_FORWARD(Fwd_It, "RaptorQ__v1::Encoder"); encoder = std::unique_ptr> ( new Impl::Encoder (data_from, data_to, symbol_size)); } template uint16_t Encoder::symbols() const { if (encoder == nullptr) return 0; return encoder->symbols(); } template uint16_t Encoder::symbol_size() const { if (encoder == nullptr) return 0; return encoder->symbol_size(); } template uint32_t Encoder::max_repair() const { if (encoder == nullptr) return 0; return encoder->max_repair(); } template RaptorQ__v1::It::Encoder::Symbol_Iterator Encoder::begin_source() { if (encoder == nullptr) return RaptorQ__v1::It::Encoder::Symbol_Iterator ( nullptr, 0); return encoder->begin_source(); } template RaptorQ__v1::It::Encoder::Symbol_Iterator Encoder::end_source () { if (encoder == nullptr) return RaptorQ__v1::It::Encoder::Symbol_Iterator ( nullptr, 0); return encoder->end_source(); } template RaptorQ__v1::It::Encoder::Symbol_Iterator Encoder::begin_repair() { if (encoder == nullptr) return RaptorQ__v1::It::Encoder::Symbol_Iterator ( nullptr, 0); return encoder->begin_repair(); } template RaptorQ__v1::It::Encoder::Symbol_Iterator Encoder::end_repair (const uint32_t repair) { if (encoder == nullptr) return RaptorQ__v1::It::Encoder::Symbol_Iterator ( nullptr, 0); return encoder->end_repair (repair); } template size_t Encoder::add_data (Rnd_It &from, const Rnd_It to) { if (encoder == nullptr) return 0; return encoder->add_data (from, to); } template void Encoder::clear_data() { if (encoder == nullptr) return; encoder->clear_data(); } template bool Encoder::compute_sync() { if (encoder == nullptr) return false; return encoder->compute_sync(); } template std::future Encoder::compute() { if (encoder == nullptr) { std::promise p; p.set_value (Error::INITIALIZATION); return p.get_future(); } return encoder->compute(); } template size_t Encoder::encode (Fwd_It &output, const Fwd_It end, const uint32_t &id) { if (encoder == nullptr) return 0; return encoder->encode (output, end, id); } template size_t Encoder::needed_bytes () { if (encoder == nullptr) return 0; return encoder->needed_bytes (); } /////////////////// //// Decoder /////////////////// template Decoder::Decoder (const uint16_t symbols, const uint16_t symbol_size, const Report type) { IS_INPUT(In_It, "RaptorQ__v1::Decoder"); IS_FORWARD(Fwd_It, "RaptorQ__v1::Decoder"); decoder = std::unique_ptr> ( new Impl::Decoder (symbols, symbol_size, type)); } template uint16_t Decoder::symbols() const { if (decoder == nullptr) return 0; return decoder->symbols(); } template uint16_t Decoder::symbol_size() const { if (decoder == nullptr) return 0; return decoder->symbol_size(); } template RaptorQ__v1::It::Decoder::Symbol_Iterator Decoder::begin() { if (decoder == nullptr) return RaptorQ__v1::It::Decoder::Symbol_Iterator ( nullptr, 0); return decoder->begin(); } template RaptorQ__v1::It::Decoder::Symbol_Iterator Decoder::end() { if (decoder == nullptr) return RaptorQ__v1::It::Decoder::Symbol_Iterator ( nullptr, 0); return decoder->end(); } template uint16_t Decoder::needed_symbols() const { if (decoder == nullptr) return 0; return decoder->needed_symbols(); } template Error Decoder::add_symbol (In_It &from, const In_It to, const uint32_t esi) { if (decoder == nullptr) return Error::INITIALIZATION; return decoder->add_symbol (from, to, esi); } template std::pair Decoder::poll () { if (decoder == nullptr) return {Error::INITIALIZATION, 0}; return decoder->poll(); } template std::pair Decoder::wait_sync() { if (decoder == nullptr) { return {Error::INITIALIZATION, 0}; } return decoder->wait_sync(); } template std::future> Decoder::wait() { if (decoder == nullptr) { std::promise> p; p.set_value ({Error::INITIALIZATION, 0}); return p.get_future(); } return decoder->wait(); } template bool Decoder::can_decode() const { if (decoder == nullptr) return false; return decoder->can_decode(); } template typename Decoder::Decoder_Result Decoder::decode() { if (decoder == nullptr) return Decoder_Result::NEED_DATA; return decoder->decode(); } template void Decoder::stop() { if (decoder != nullptr) decoder->stop(); } template std::pair Decoder::decode_bytes (Fwd_It &start, const Fwd_It end, const size_t from_byte, const size_t skip) { if (decoder == nullptr) return {0, skip}; return decoder->decode_bytes (start, end, from_byte, skip); } template Error Decoder::decode_symbol (Fwd_It &start, const Fwd_It end, const uint16_t esi) { if (decoder == nullptr) return Error::INITIALIZATION; return decoder->decode_symbol (start, end, esi); } } // namespace RaptorQ__v1