Newer
Older
/*
* Copyright (c) 2015-2016, Luca Fulchir<luca@fulchir.it>, 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 <http://www.gnu.org/licenses/>.
*/
#include "RaptorQ/v1/wrapper/C_RAW_API.h"
#include "RaptorQ/v1/RaptorQ.hpp"
#include <future>
#include <utility>
struct RAPTORQ_LOCAL RaptorQ_ptr
{
void *ptr;
const RaptorQ_type type;
RaptorQ_ptr (const RaptorQ_type _type) : ptr (nullptr), type (_type) {}
};
typedef enum {
} RAPTORQ_LOCAL RaptorQ_Future_Type;
struct RAPTORQ_LOCAL RaptorQ_future
{
const RaptorQ_Future_Type type;
RaptorQ_future (const RaptorQ_Future_Type t)
:type (t) {}
};
struct RAPTORQ_LOCAL RaptorQ_future_enc
{
const struct RaptorQ_future base;
std::future<RaptorQ__v1::Error> f;
RaptorQ_future_enc ()
:base (RaptorQ_Future_Type::RQ_FUTURE_ENCODER) {}
};
struct RAPTORQ_LOCAL RaptorQ_future_dec
{
const struct RaptorQ_future base;
std::future<std::pair<RaptorQ__v1::Error, uint16_t>> f;
RaptorQ_future_dec ()
:base (RaptorQ_Future_Type::RQ_FUTURE_DECODER) {}
};
////////////////////////
////
//// For ease of development please keep the function declaration
//// and implementation in the same orders as defined in the structs!
////
////////////////////////
static RaptorQ_Compress v1_supported_compressions();
static RaptorQ_Compress v1_get_compression();
static bool v1_set_compression (
static size_t v1_shared_cache_size (const size_t shared_cache);
static size_t v1_local_cache_size (const size_t local_cache);
static size_t v1_get_shared_cache_size ();
static size_t v1_get_local_cache_size ();
const RaptorQ_Block_Size symbols,
const size_t symbol_size,
const RaptorQ_Compute report);
static uint16_t v1_symbols (const RaptorQ_ptr *ptr);
static size_t v1_symbol_size (const RaptorQ_ptr *ptr);
static void v1_stop (const RaptorQ_ptr *ptr);
static RaptorQ_Error v1_future_state (struct RaptorQ_future *f);
static RaptorQ_Error v1_future_wait_for (struct RaptorQ_future *f,
static void v1_future_wait (struct RaptorQ_future *f);
static void v1_future_free (struct RaptorQ_future **f);
static void v1_free (struct RaptorQ_ptr **ptr);
static uint32_t v1_max_repair (const RaptorQ_ptr *enc);
static size_t v1_set_data (const RaptorQ_ptr *enc, void *from,
static bool v1_has_data (const RaptorQ_ptr *enc);
static void v1_clear_data (const RaptorQ_ptr *enc);
static bool v1_precompute_sync (const RaptorQ_ptr *enc);
static bool v1_compute_sync (const RaptorQ_ptr *enc);
static RaptorQ_future_enc* v1_precompute (const RaptorQ_ptr *enc);
static RaptorQ_future_enc* v1_compute (const RaptorQ_ptr *enc);
static RaptorQ_Error v1_enc_future_get (
static size_t v1_encode (const RaptorQ_ptr *enc, void *from,
const void *to, const uint32_t id);
// decoder-specific
static RaptorQ_Error v1_add_symbol (const RaptorQ_ptr *dec,
static bool v1_can_decode (const RaptorQ_ptr *dec);
static uint16_t v1_needed_symbols (const RaptorQ_ptr *dec);
static RaptorQ_dec_result v1_poll (const RaptorQ_ptr *dec);
static RaptorQ_dec_result v1_wait_sync (const RaptorQ_ptr *dec);
static RaptorQ_future_dec* v1_wait (const RaptorQ_ptr *dec);
static RaptorQ_dec_result v1_dec_future_get (struct RaptorQ_future_dec *f);
void RaptorQ_free_api (struct RaptorQ_base_api **api)
{
if (api == nullptr || *api == nullptr)
return;
if ((*api)->version == 1) {
delete reinterpret_cast<struct RaptorQ_v1*> (*api);
} // else it's all your fault anway
*api = nullptr;
}
{
if (version != 1)
return nullptr;
auto api = new RaptorQ_v1();
api->base.version = 1;
// precomputation caching
api->supported_compressions = &v1_supported_compressions;
api->get_compression = &v1_get_compression;
api->set_compression = &v1_set_compression;
api->shared_cache_size = &v1_shared_cache_size;
api->local_cache_size = &v1_local_cache_size;
api->get_shared_cache_size = &v1_get_shared_cache_size;
api->get_local_cache_size = &v1_get_local_cache_size;
// constructors
api->Encoder = &v1_Encoder;
api->Decoder = &v1_Decoder;
// common functions
api->symbols = &v1_symbols;
api->symbol_size = &v1_symbol_size;
api->future_state = &v1_future_state;
api->future_wait_for = &v1_future_wait_for;
api->future_wait = &v1_future_wait;
api->future_free = &v1_future_free;
// encoder-specific functions
api->max_repair = &v1_max_repair;
api->set_data = &v1_set_data;
api->has_data = &v1_has_data;
api->compute = &v1_compute;
api->enc_future_get = &v1_enc_future_get;
api->encode = &v1_encode;
// decoder-specific functions
api->add_symbol = &v1_add_symbol;
api->can_decode = &v1_can_decode;
api->needed_symbols = &v1_needed_symbols;
api->poll = &v1_poll;
api->wait_sync = &v1_wait_sync;
api->wait = &v1_wait;
api->dec_future_get = &v1_dec_future_get;
return reinterpret_cast<RaptorQ_base_api *> (api);
}
///////////////////////////
// Precomputation caching
///////////////////////////
static RaptorQ_Compress v1_supported_compressions()
{
return static_cast<RaptorQ_Compress>(RaptorQ__v1::supported_compressions());
Loading full blame...