Skip to content

Commit 2aa82d0

Browse files
committed
do not save size if not needed
1 parent 69e263e commit 2aa82d0

File tree

2 files changed

+47
-17
lines changed

2 files changed

+47
-17
lines changed

include/interpolative_coding.hpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,11 +202,11 @@ struct centered_minimal {
202202

203203
template <typename Writer>
204204
struct encoder {
205-
void encode(uint32_t const* input, uint32_t n) {
205+
void encode(uint32_t const* input, uint32_t n, bool write_size = true) {
206206
if (!n) return;
207207
uint32_t universe = input[n - 1];
208208
write_binary(universe);
209-
write_binary(n);
209+
if (write_size) write_binary(n);
210210
encode(input, n - 1, 0, universe);
211211
}
212212

@@ -261,6 +261,13 @@ struct decoder {
261261
return n;
262262
}
263263

264+
uint32_t decode(uint32_t* out, uint32_t n) {
265+
uint32_t universe = read_binary();
266+
out[n - 1] = universe;
267+
decode(out, n - 1, 0, universe);
268+
return n;
269+
}
270+
264271
uint32_t decode(uint32_t const* encoded, uint32_t* out) {
265272
m_reader.init(encoded);
266273
return decode(out);

test/example.cpp

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,49 @@ void test(std::vector<uint32_t> const& in) {
1111
}
1212
std::cout << std::endl;
1313

14-
uint32_t n = in.size();
14+
{
15+
uint32_t n = in.size();
16+
encoder<typename BinaryCode::writer> enc;
17+
enc.encode(in.data(), n); // save n by feault
18+
std::vector<uint32_t> out(n);
19+
decoder<typename BinaryCode::reader> dec;
20+
uint32_t m = dec.decode(enc.bits().data(), out.data());
21+
assert(m == n);
1522

16-
encoder<typename BinaryCode::writer> enc;
17-
enc.encode(in.data(), n);
23+
std::cout << "decoded " << m << " values" << std::endl;
24+
std::cout << "total bits " << enc.num_bits() << std::endl;
25+
std::cout << static_cast<double>(enc.num_bits()) / m << " bits x key"
26+
<< std::endl;
1827

19-
std::vector<uint32_t> out(n);
20-
decoder<typename BinaryCode::reader> dec;
21-
uint32_t m = dec.decode(enc.bits().data(), out.data());
22-
assert(m == n);
28+
std::cout << "decoded:\n";
29+
for (auto x : out) {
30+
std::cout << x << " ";
31+
}
32+
std::cout << std::endl;
33+
}
2334

24-
std::cout << "decoded " << m << " values" << std::endl;
25-
std::cout << "total bits " << enc.num_bits() << std::endl;
26-
std::cout << static_cast<double>(enc.num_bits()) / m << " bits x key"
27-
<< std::endl;
35+
{
36+
uint32_t n = in.size();
37+
encoder<typename BinaryCode::writer> enc;
38+
enc.encode(in.data(), n,
39+
false // do not save n
40+
);
41+
std::vector<uint32_t> out(n);
42+
decoder<typename BinaryCode::reader> dec(enc.bits().data());
43+
uint32_t m = dec.decode(out.data(), n);
44+
assert(m == n);
2845

29-
std::cout << "decoded:\n";
30-
for (auto x : out) {
31-
std::cout << x << " ";
46+
std::cout << "decoded " << m << " values" << std::endl;
47+
std::cout << "total bits " << enc.num_bits() << std::endl;
48+
std::cout << static_cast<double>(enc.num_bits()) / m << " bits x key"
49+
<< std::endl;
50+
51+
std::cout << "decoded:\n";
52+
for (auto x : out) {
53+
std::cout << x << " ";
54+
}
55+
std::cout << std::endl;
3256
}
33-
std::cout << std::endl;
3457
}
3558

3659
int main(int argc, char** argv) {

0 commit comments

Comments
 (0)