Skip to content

Commit bc35f92

Browse files
committed
Refactor encode method to return a stringstream instead of streamoff and simplify buffer handling
1 parent 38ed9aa commit bc35f92

File tree

1 file changed

+14
-23
lines changed

1 file changed

+14
-23
lines changed

src/lib/nemesis.cc

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
#include <cstdint>
3232
#include <ios>
3333
#include <istream>
34-
#include <limits>
3534
#include <map>
3635
#include <memory>
3736
#include <numeric>
@@ -788,9 +787,9 @@ class nemesis_internal {
788787
}
789788

790789
template <typename Compare>
791-
static std::streamoff encode(
792-
std::istream& source, std::ostream& dest, nemesis_mode mode,
793-
std::streamoff const length, Compare&& comp) {
790+
static std::stringstream encode(
791+
std::istream& source, nemesis_mode mode, std::streamoff const length,
792+
Compare&& comp) {
794793
auto compare = std::forward<Compare>(comp);
795794
// Seek to start and clear all errors.
796795
source.clear();
@@ -1023,6 +1022,8 @@ class nemesis_internal {
10231022
// This is no longer needed.
10241023
count_map.clear();
10251024

1025+
// This is what we output.
1026+
std::stringstream dest;
10261027
// We now have a prefix-free code map associating the RLE-encoded nibble
10271028
// runs with their code. Now we write the file.
10281029
// Write header.
@@ -1080,7 +1081,7 @@ class nemesis_internal {
10801081
}
10811082
// Fill remainder of last byte with zeroes and write if needed.
10821083
bits.flush();
1083-
return dest.tellp();
1084+
return dest;
10841085
}
10851086
};
10861087

@@ -1122,33 +1123,23 @@ bool nemesis::encode(std::istream& source, std::ostream& dest) {
11221123
value = new_value;
11231124
}
11241125

1125-
std::array<std::stringstream, 4> buffers;
11261126
using nemesis_mode = nemesis_internal::nemesis_mode;
11271127
// Four different attempts to encode, for improved file size.
1128-
std::array sizes{
1128+
std::array buffers{
11291129
nemesis_internal::encode(
1130-
str_source, buffers[0], nemesis_mode::normal, size, compare_node{}),
1130+
str_source, nemesis_mode::normal, size, compare_node{}),
11311131
nemesis_internal::encode(
1132-
str_source, buffers[1], nemesis_mode::normal, size, compare_node2{}),
1132+
str_source, nemesis_mode::normal, size, compare_node2{}),
11331133
nemesis_internal::encode(
1134-
source_xor, buffers[2], nemesis_mode::progressive_xor, size,
1135-
compare_node{}),
1134+
source_xor, nemesis_mode::progressive_xor, size, compare_node{}),
11361135
nemesis_internal::encode(
1137-
source_xor, buffers[3], nemesis_mode::progressive_xor, size,
1138-
compare_node2{})};
1136+
source_xor, nemesis_mode::progressive_xor, size, compare_node2{})};
11391137

11401138
// Figure out what was the best encoding.
1141-
std::streamoff best_size = std::numeric_limits<std::streamoff>::max();
1142-
size_t best_stream = 0;
1143-
for (size_t ii = 0; ii < sizes.size(); ii++) {
1144-
if (sizes[ii] < best_size) {
1145-
best_size = sizes[ii];
1146-
best_stream = ii;
1147-
}
1148-
}
1139+
auto& best_iter = *std::ranges::min_element(buffers, {}, &std::stringstream::tellp);
11491140

1150-
buffers[best_stream].seekg(0);
1151-
dest << buffers[best_stream].rdbuf();
1141+
best_iter.seekg(0);
1142+
dest << best_iter.rdbuf();
11521143
return true;
11531144
}
11541145

0 commit comments

Comments
 (0)