summaryrefslogtreecommitdiffstats
path: root/include/util
diff options
context:
space:
mode:
Diffstat (limited to 'include/util')
-rw-r--r--include/util/SortedMerge.h2
-rw-r--r--include/util/types.h77
2 files changed, 78 insertions, 1 deletions
diff --git a/include/util/SortedMerge.h b/include/util/SortedMerge.h
index 8a1e782..c149189 100644
--- a/include/util/SortedMerge.h
+++ b/include/util/SortedMerge.h
@@ -58,7 +58,7 @@ static std::vector<Cursor<Wrapped<R>>> build_cursor_vec(std::vector<S*> &shards,
for (size_t i = 0; i < shards.size(); ++i) {
if (shards[i]) {
auto base = shards[i]->get_data();
- cursors.emplace_back(Cursor{base, base + shards[i]->get_record_count(), 0, shards[i]->get_record_count()});
+ cursors.emplace_back(Cursor<Wrapped<R>>{base, base + shards[i]->get_record_count(), 0, shards[i]->get_record_count()});
*reccnt += shards[i]->get_record_count();
*tscnt += shards[i]->get_tombstone_count();
} else {
diff --git a/include/util/types.h b/include/util/types.h
index a13bd95..cf61412 100644
--- a/include/util/types.h
+++ b/include/util/types.h
@@ -19,6 +19,8 @@
#include <cstdint>
#include <cstdlib>
+#include <vector>
+#include <cassert>
namespace de {
@@ -69,4 +71,79 @@ struct ShardID {
/* A placeholder for an invalid shard--also used to indicate the mutable buffer */
const ShardID INVALID_SHID = {-1, -1};
+typedef ssize_t level_index;
+
+typedef struct ReconstructionTask {
+ std::vector<level_index> sources;
+ level_index target;
+ size_t reccnt;
+
+ void add_source(level_index source, size_t cnt) {
+ sources.push_back(source);
+ reccnt += cnt;
+ }
+
+} ReconstructionTask;
+
+class ReconstructionVector {
+public:
+ ReconstructionVector()
+ : total_reccnt(0) {}
+
+ ~ReconstructionVector() = default;
+
+ ReconstructionTask operator[](size_t idx) {
+ return m_tasks[idx];
+ }
+
+ void add_reconstruction(level_index source, level_index target, size_t reccnt) {
+ m_tasks.push_back({{source}, target, reccnt});
+ total_reccnt += reccnt;
+ }
+
+ void add_reconstruction(ReconstructionTask task) {
+ m_tasks.push_back(task);
+ }
+
+ ReconstructionTask remove_reconstruction(size_t idx) {
+ assert(idx < m_tasks.size());
+ auto task = m_tasks[idx];
+
+ m_tasks.erase(m_tasks.begin() + idx);
+ total_reccnt -= task.reccnt;
+
+ return task;
+ }
+
+ ReconstructionTask remove_smallest_reconstruction() {
+ size_t min_size = m_tasks[0].reccnt;
+ size_t idx = 0;
+ for (size_t i=1; i<m_tasks.size(); i++) {
+ if (m_tasks[i].reccnt < min_size) {
+ min_size = m_tasks[i].reccnt;
+ idx = i;
+ }
+ }
+
+ auto task = m_tasks[idx];
+ m_tasks.erase(m_tasks.begin() + idx);
+ total_reccnt -= task.reccnt;
+
+ return task;
+ }
+
+ size_t get_total_reccnt() {
+ return total_reccnt;
+ }
+
+ size_t size() {
+ return m_tasks.size();
+ }
+
+
+private:
+ std::vector<ReconstructionTask> m_tasks;
+ size_t total_reccnt;
+};
+
}