--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include <random>
+
+#include "CDC.h"
+#include "rabin.h"
+
+std::unique_ptr<CDC> CDC::create(
+ const std::string& type,
+ int bits,
+ int windowbits)
+{
+ if (type == "rabin") {
+ auto p = new RabinChunk();
+ p->set_target_bits(bits, windowbits);
+ return std::unique_ptr<CDC>(p);
+ }
+ return nullptr;
+}
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include <vector>
+#include <string>
+
+#include "include/buffer.h"
+
+class CDC {
+public:
+ virtual ~CDC() = default;
+
+ virtual void calc_chunks(
+ ceph::buffer::list& inputdata,
+ std::vector<std::pair<uint64_t, uint64_t>> *chunks) = 0;
+
+ virtual void set_target_bits(int bits, int windowbits = 2) = 0;
+
+ static std::unique_ptr<CDC> create(
+ const std::string& type,
+ int bits,
+ int windowbits = 0);
+};
#include <utility>
#include <vector>
+#include "CDC.h"
#include "include/buffer_fwd.h"
-class RabinChunk {
+class RabinChunk : public CDC {
public:
RabinChunk(uint32_t window_size, uint32_t rabin_prime,
uint64_t mod_prime, uint64_t pow, std::vector<uint64_t> rabin_mask,
rabin_mask = _rabin_mask;
}
+ void calc_chunks(
+ ceph::buffer::list& inputdata,
+ std::vector<std::pair<uint64_t, uint64_t>> *chunks) override {
+ do_rabin_chunks(inputdata, *chunks);
+ }
+
int do_rabin_chunks(ceph::buffer::list& inputdata,
std::vector<std::pair<uint64_t, uint64_t>>& chunks,
uint64_t min=0, uint64_t max=0);
}
// most users should use this
- void set_target_bits(int bits, int windowbits = 2) {
+ void set_target_bits(int bits, int windowbits=0) override {
set_numbits(bits);
+ if (!windowbits) {
+ windowbits = 2;
+ }
set_min_chunk(1 << (bits - windowbits));
set_max_chunk(1 << (bits + windowbits));
}