Skip to content
RaptorQ.hpp 34.3 KiB
Newer Older
Luker's avatar
Luker committed
/*
Luker's avatar
Luker committed
 * Copyright (c) 2015-2016, Luca Fulchir<luca@fulchir.it>, All rights reserved.
Luker's avatar
Luker committed
 *
 * 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 <http://www.gnu.org/licenses/>.
 */

Luker's avatar
Luker committed
#pragma once
Luker's avatar
Luker committed

/////////////////////
//
//	These templates are just a wrapper around the
Luker's avatar
Luker committed
//	functionalities offered by the RaptorQ__v1::Impl namespace
Luker's avatar
Luker committed
//	So if you want to see what the algorithm looks like,
//	you are in the wrong place
//
/////////////////////

#include "Interleaver.hpp"
#include "De_Interleaver.hpp"
#include "Encoder.hpp"
#include "Decoder.hpp"
#include "Shared_Computation/Decaying_LF.hpp"
#include "Thread_Pool.hpp"
#include <cassert>
#include <future>
Luker's avatar
Luker committed
#include <map>
#include <memory>
Luker's avatar
Luker committed
#include <mutex>
#include <thread>
#include <tuple>
Luker's avatar
Luker committed
#include <type_traits>
#include <utility>

Luker's avatar
Luker committed
namespace RaptorQ__v1 {
Luker's avatar
Luker committed

Luker's avatar
Luker committed
template <typename Rnd_It, typename Fwd_It>
Luker's avatar
Luker committed
class RAPTORQ_API Encoder;

Luker's avatar
Luker committed
template <typename Rnd_It, typename Fwd_It>
Luker's avatar
Luker committed
class RAPTORQ_API Symbol
{
public:
Luker's avatar
Luker committed
	Symbol (Encoder<Rnd_It, Fwd_It> *enc, const uint32_t esi, const uint8_t sbn)
Luker's avatar
Luker committed
		: _enc (enc), _esi (esi), _sbn (sbn) {}

Luker's avatar
Luker committed
	uint64_t operator() (Fwd_It &start, const Fwd_It end)
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		return _enc->encode (start, end, _esi, _sbn);
Luker's avatar
Luker committed
	}
Luker's avatar
Luker committed
	uint32_t id() const
	{
		uint32_t ret = _sbn;
		ret <<= 24;
Luker's avatar
Luker committed
		return ret + _esi;
Luker's avatar
Luker committed
private:
Luker's avatar
Luker committed
	Encoder<Rnd_It, Fwd_It> *_enc;
Luker's avatar
Luker committed
	const uint32_t _esi;
	const uint8_t _sbn;
};
Luker's avatar
Luker committed

Luker's avatar
Luker committed
template <typename Rnd_It, typename Fwd_It>
Luker's avatar
Luker committed
class RAPTORQ_API Symbol_Iterator :
Luker's avatar
Luker committed
		public std::iterator<std::input_iterator_tag, Symbol<Rnd_It, Fwd_It>>
Luker's avatar
Luker committed
{
public:
Luker's avatar
Luker committed
	Symbol_Iterator (Encoder<Rnd_It, Fwd_It> *enc, const uint32_t esi,
Luker's avatar
Luker committed
															const uint8_t sbn)
Luker's avatar
Luker committed
		: _enc (enc), _esi (esi), _sbn (sbn) {}
Luker's avatar
Luker committed
	Symbol<Rnd_It, Fwd_It> operator*()
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		return Symbol<Rnd_It, Fwd_It> (_enc, _esi, _sbn);
Luker's avatar
Luker committed
	}
Luker's avatar
Luker committed
	Symbol_Iterator<Rnd_It, Fwd_It>& operator++()
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		++_esi;
		return *this;
Luker's avatar
Luker committed
	}
Luker's avatar
Luker committed
	Symbol_Iterator operator++ (const int i) const
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		Symbol_Iterator<Rnd_It, Fwd_It> ret (_esi + i, _sbn);
Luker's avatar
Luker committed
		return ret;
Luker's avatar
Luker committed
	}
Luker's avatar
Luker committed
	bool operator== (const Symbol_Iterator<Rnd_It, Fwd_It> &it) const
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		return it._esi == _esi && it._sbn == _sbn;
Luker's avatar
Luker committed
	}
Luker's avatar
Luker committed
	bool operator!= (const Symbol_Iterator<Rnd_It, Fwd_It> &it) const
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		return it._esi != _esi || it._sbn != _sbn;
	}
private:
Luker's avatar
Luker committed
	Encoder<Rnd_It, Fwd_It> *_enc;
Luker's avatar
Luker committed
	uint32_t _esi;
	const uint8_t _sbn;
};

Luker's avatar
Luker committed
template <typename Rnd_It, typename Fwd_It>
Luker's avatar
Luker committed
class RAPTORQ_API Block
{
public:
Luker's avatar
Luker committed
	Block (Encoder<Rnd_It, Fwd_It> *enc, const uint16_t symbols,
Luker's avatar
Luker committed
															const uint8_t sbn)
Luker's avatar
Luker committed
		: _enc (enc), _symbols (symbols), _sbn (sbn) {}

Luker's avatar
Luker committed
	Symbol_Iterator<Rnd_It, Fwd_It> begin_source() const
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		return Symbol_Iterator<Rnd_It, Fwd_It> (_enc, 0, _sbn);
Luker's avatar
Luker committed
	}
Luker's avatar
Luker committed
	Symbol_Iterator<Rnd_It, Fwd_It> end_source() const
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		return Symbol_Iterator<Rnd_It, Fwd_It> (_enc, _symbols, _sbn);
Luker's avatar
Luker committed
	}
Luker's avatar
Luker committed
	Symbol_Iterator<Rnd_It, Fwd_It> begin_repair() const
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		return Symbol_Iterator<Rnd_It, Fwd_It> (_enc, _symbols, _sbn);
Luker's avatar
Luker committed
	}
Luker's avatar
Luker committed
	Symbol_Iterator<Rnd_It, Fwd_It> end_repair (const uint32_t max_repair)
Luker's avatar
Luker committed
																		const
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		uint32_t max_r = max_repair;
Luker's avatar
Luker committed
		uint32_t max_sym = 1;
		max_sym <<= 20;	// max_sym = 2^20
Luker's avatar
Luker committed
		if (max_repair > std::pow (2, 20) - _symbols)
Luker's avatar
Luker committed
			max_r = max_sym - _symbols;
Luker's avatar
Luker committed
		return Symbol_Iterator<Rnd_It, Fwd_It> (_enc, _symbols + max_r,_sbn);
Luker's avatar
Luker committed
	}
	uint32_t max_repair() const
Luker's avatar
Luker committed
	{
		return _enc->max_repair (_sbn);
	}
	uint16_t symbols () const
	{
		return _enc->symbols (_sbn);
	}
	uint32_t block_size () const
	{
		return _enc->block_size (_sbn);
	}
Luker's avatar
Luker committed

Luker's avatar
Luker committed
private:
Luker's avatar
Luker committed
	Encoder<Rnd_It, Fwd_It> * _enc;
Luker's avatar
Luker committed
	const uint16_t _symbols;
Luker's avatar
Luker committed
	const uint8_t _sbn;
};

Luker's avatar
Luker committed
template <typename Rnd_It, typename Fwd_It>
Luker's avatar
Luker committed
class RAPTORQ_API Block_Iterator :
Luker's avatar
Luker committed
		public std::iterator<std::input_iterator_tag, Block<Rnd_It, Fwd_It>>
Luker's avatar
Luker committed
{
public:
Luker's avatar
Luker committed
	Block_Iterator (Encoder<Rnd_It, Fwd_It> *enc, const Impl::Partition part,
Luker's avatar
Luker committed
																uint8_t sbn)
Luker's avatar
Luker committed
		:_enc (enc), _part (part), _sbn (sbn) {}
Luker's avatar
Luker committed
	Block<Rnd_It, Fwd_It> operator*()
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		if (_sbn < _part.num (0))
Luker's avatar
Luker committed
			return Block<Rnd_It, Fwd_It> (_enc, _part.size (0), _sbn);
		return Block<Rnd_It, Fwd_It> (_enc, _part.size (1), _sbn);
Luker's avatar
Luker committed
	}
Luker's avatar
Luker committed
	Block_Iterator& operator++()
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		++_sbn;
		return *this;
Luker's avatar
Luker committed
	}
Luker's avatar
Luker committed
	Block_Iterator operator++ (const int i) const
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		Block_Iterator ret = *this;
		ret._sbn += i;
		return ret;
	}
	bool operator== (const Block_Iterator &it) const
Luker's avatar
Luker committed
	{
		return it._sbn == _sbn;
Luker's avatar
Luker committed
	}
	bool operator!= (const Block_Iterator &it) const
Luker's avatar
Luker committed
	{
Luker's avatar
Luker committed
		return it._sbn != _sbn;
Luker's avatar
Luker committed
	}
private:
Luker's avatar
Luker committed
	Encoder<Rnd_It, Fwd_It> *_enc;
Luker's avatar
Luker committed
	const Impl::Partition _part;
Luker's avatar
Luker committed
	uint8_t _sbn;
};


Loading full blame...