76 lines
1.8 KiB
C++
76 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <tuple>
|
|
#include <vector>
|
|
|
|
#include "common.hh"
|
|
|
|
|
|
namespace blky {
|
|
|
|
std::vector<uint32_t> BytesEncoder(
|
|
const std::vector<uint8_t>& bytes,
|
|
std::tuple<uint32_t, uint32_t>& block_num,
|
|
uint8_t feat_bits,
|
|
uint32_t block_idx,
|
|
uint64_t seed) {
|
|
const uint32_t block_num_all = std::get<0>(block_num)*std::get<1>(block_num);
|
|
if (block_num_all == 0) throw std::runtime_error {"block num is zero"};
|
|
|
|
blky_encoder_t enc = {};
|
|
enc.block_num = block_num_all;
|
|
enc.feat_bits = feat_bits;
|
|
enc.block_index = block_idx;
|
|
enc.seed = seed;
|
|
|
|
std::vector<uint32_t> ret;
|
|
for (auto c : bytes) {
|
|
blky_encoder_feed(&enc, c);
|
|
|
|
uint32_t feat;
|
|
while (blky_encoder_pop(&enc, &feat, false)) {
|
|
ret.push_back(feat);
|
|
}
|
|
}
|
|
|
|
uint32_t feat;
|
|
if (blky_encoder_pop(&enc, &feat, true)) {
|
|
ret.push_back(feat);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
std::vector<uint8_t> BytesDecoder(
|
|
const std::vector<uint32_t>& features,
|
|
std::tuple<uint32_t, uint32_t>& block_num,
|
|
uint8_t feat_bits,
|
|
uint64_t seed) {
|
|
const uint32_t block_num_all = std::get<0>(block_num)*std::get<1>(block_num);
|
|
if (block_num_all == 0) throw std::runtime_error {"block num is zero"};
|
|
|
|
blky_decoder_t de = {};
|
|
de.block_num = block_num_all;
|
|
de.feat_bits = feat_bits;
|
|
de.seed = seed;
|
|
|
|
std::vector<uint8_t> ret;
|
|
for (auto c : features) {
|
|
if (!blky_decoder_feed(&de, c)) {
|
|
throw std::runtime_error {"path corruption"};
|
|
}
|
|
|
|
uint8_t feat;
|
|
while (blky_decoder_pop(&de, &feat, false)) {
|
|
ret.push_back(feat);
|
|
}
|
|
}
|
|
uint8_t feat;
|
|
if (blky_decoder_pop(&de, &feat, true)) {
|
|
ret.push_back(feat);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
} // namespace blky
|